Menyimpan gambar ke database menggunakan Delphi

Tutorial berikut menjelaskan bagaimana cara menyimpan gambar atau foto ke database menggunakan delphi dan databasenya MS. Access, sebelumnya saya sudah membuat tulisan cara menyimpan gambar atau foto ke database tetapi menggunakan Visual Basic.

Mengapa menyimpan gambar ke database menggunakan Delphi

Sebenarnya tutorial tentang bagaimana cara menyimpan gambar atau foto ke database menggunakan delphi sudah banyak di internet, tetapi saya tidak menemukan satupun dari mereka yang cocok dalam artian programnya oke dari satu sisi tetapi error di sisi yang lain, oleh karena itu saya mempunyai ide untuk menulis artikel ini.

Database yang digunakan menyimpan gambar

Pada contoh ini saya menggunakan database MS Access, tentu saja boleh menggunakan yang lain seperti database MySQL dengan komponen seperti MySQL DAC dari microOLAP, MyDAC dari Devart atau dari yang lainnya.

Program ini, selain menyimpan gambar juga menampilkan gambarnya, untuk format dan tabel databasenya silahkan lihat tulisan cara menyimpan gambar atau foto menggunakan Visual Basic.

Untuk menghemat waktu teman-teman berikut langsung saja saya bahas program dan source code-nya. Oh iya… Sebelum masuk ke pembahasan ada baiknya saya jelaskan dahulu, inti dari program ini adalah menyimpan gambar ke database dengan format gambar .bmp, kenapa harus format .bmp? Apakah format yang lain tidak didukung? Tentu saja didukung tetapi ada keperluan khusus yang mengharuskan formatnya harus berupa .bmp misalnya ketika teman-teman ingin menampilkan gambar ke report atau sebuah laporan yang menggunakan komponen Quick Report gambar yang didukung hanya yang memiliki format bitmap(.bmp).
Menyimpan gambar ke database dengan Delphi

Komponen pada form Delphi

Sekarang yang harus kita lakukan adalah menambahkan komponen ke form seperti pada gambar di atas, dengan komponen dan propertinya sebagai berikut :

Nama Komponen Properti
ADOConnection1 LoginPrompt = False
Buat koneksinya dengan cara klik ganda pada komponen ADOConnection1 kemudian klik Build->Pilih : Microsoft Jet 4.0 OLE DB Provider->Carilah lokasi databasenya->Ok->Ok
ADOQuery1 Connection = ADOConnection1
CursorType = ctStatic
Active = True
Sekarang klik kanan ADOQuery1 dan pilih Fields Editor->Klik kanan->Add all fields. Lihat gambar dibawah ini :
Menambahkan field pada AdoQuery fields editor
DataSource1 DataSet = ADOQuery1
DBGrid1 ReadOnly = True
DataSource = DataSource1
Kita akan menampilkan field “nama” saja, untuk itu klik kanan DBGrid1->Columns Editor. Lihat gambar di bawah, klik 1->Isi sesuai 2 dan 3. Dbgrid Column Editor
OpenPictureDialog1 Filter = All (*.jpg;*.jpeg;*.bmp)|*.jpg;*.jpeg;*.bmp|JPEG Image File (*.jpg)|*.jpg|JPEG Image File (*.jpeg)|*.jpeg|Bitmaps (*.bmp)|*.bmp
Label1 Caption = Nama
Edit1 Text = ” (kosongkan)
Image1 Stretch = True
Button1 Caption = Cari gambar dan simpan

Kode: Menyimpan gambar ke database

Selanjutnya kita akan menulis barisan kode programnya.
Tambahkan sedikit baris kode berikut pada bagian uses :

jpeg, axCtrls

Pada bagian type tambahkan barisan kode berikut :

procedure tampildata();
procedure convertobmp(filename:TFileName);

Tambahkan juga procedure berikut di bawah implementation :

// Untuk menyegarkan data pada ADOQuery1
procedure TForm1.tampildata();
begin
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.text := 'select * from tb_foto';
  ADOQuery1.Active:=true;
  DBGrid1CellClick(DBGrid1.Columns[0]);
end;

// Konversi setiap gambar ke format Bitmap
// Kode ini saya dapatkan dari stackoverflow.com
procedure TForm1.convertobmp(filename:TFileName);
Var
     OleGraphic               : TOleGraphic;
     fs                       : TFileStream;
     Source                   : TImage;
     BMP                      : TBitmap;
Begin
     Try
          OleGraphic := TOleGraphic.Create; //The magic class!

          fs := TFileStream.Create(filename, fmOpenRead Or fmSharedenyNone);
          OleGraphic.LoadFromStream(fs);

          Source := Timage.Create(Nil);
          Source.Picture.Assign(OleGraphic);

          BMP := TBitmap.Create; //Converting to Bitmap
          bmp.Width := Source.Picture.Width;
          bmp.Height := source.Picture.Height;
          bmp.Canvas.Draw(0, 0, source.Picture.Graphic);

          image1.Picture.Bitmap := bmp; //Show the bitmap on form
          image1.Refresh;
          fs.Free;
          OleGraphic.Free;
          Source.Free;
          bmp.Free;
     Finally

     End;
end;

Sekarang klik ganda button yang ada pada form dan gantikan kodenya dengan yang di bawah ini :

procedure TForm1.Button1Click(Sender: TObject);
var gambar : TMemorystream;
begin
  if(Edit1.Text = '') then begin
    ShowMessage('Silahkan isi nama dulu');
    edit1.SetFocus;
    exit;
  end;
  if OpenPictureDialog1.Execute then begin
    try
      convertobmp(OpenPictureDialog1.FileName);
      gambar := TMemorystream.Create;
      Image1.Picture.Graphic.SaveToStream(gambar);
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Text := 'insert into tb_foto (nama,gambar) values (:p0, :p1)';
      ADOQuery1.Parameters[0].Value :=  Edit1.text;
      ADOQuery1.Parameters[1].LoadFromStream(gambar,ftBlob);
      ADOQuery1.ExecSQL;
      tampildata();
    except
    on E:Exception do
      ShowMessage('Maaf terjadi kesalahan.' + #13 + 'Error : ' + E.Message);
    end;
  end;
end;

Ketika DbGrid di klik, gantikan kode eventnya sebagai berikut :

procedure TForm1.DBGrid1CellClick(Column: TColumn);
var
  Stream : TADOBlobStream;
  GambarBmp : TBitmap;
  Buffer : Word;
begin
  if (not ADOQuery1.Eof) then begin
    Edit1.Text:= DBGrid1.Fields[0].Text;
    GambarBmp := TBitmap.Create;
    Stream := TADOBlobStream.Create(ADOQuery1gambar,bmRead);
    Stream.Read(Buffer,SizeOf(Buffer));
    Stream.Position := 0;
    GambarBmp.LoadFromStream(Stream);
    Image1.Picture.Bitmap := GambarBmp;
    image1.Refresh;
  end;
end;

Edit: Dengan database MySQL

Saya mencoba untuk komponen MyDAC dari Devart perlu dimodifikasi sedikit untuk even DbGrid sebagai berikut:

procedure TForm1.DBGrid1CellClick(Column: TColumn);
var
  Stream : TMemoryStream;
  GambarBmp : TBitmap;
begin
  if (not MyQuery1.Eof) then begin
    Edit1.Text:= DBGrid1.Fields[0].Text;
    GambarBmp := TBitmap.Create;
    Stream := TMemoryStream.Create;
    try
      MyQuery1gambar.SaveToStream(Stream);
      Stream.Position := 0;
      GambarBmp.LoadFromStream(Stream);
      Image1.Picture.Bitmap := GambarBmp;
      image1.Refresh;
    finally
      Stream.Free;
    end;
  end;
end;

Sedangkan MySQL DAC dari microOLAP tidak terjadi masalah dengan kode yang sebelumnya.

Edit pada 21 Feb 2013: Dengan database Microsoft SQL Server

Untuk SQL Server <= 2005 biasanya tipe data blob untuk penyimpanan foto belum didukung, oleh karena itu bisa menggunakan alternatif lain yaitu gunakan tipe data varbinary(max). Nah jika MS. SQL Server > 2005, kayaknya sudah mendukung tipe data Blob.

Okey sekian tutorial saya kali ini, semoga mudah dipahami :D dan bermanfaat buat sahabat CB, jika sahabat ingin menyimpan gambar tanpa meyimpan gambarnya ke database, hanya di simpan kedalam folder maka silahkan lihat tutorial alternatif menyimpan gambar dengan Delphi 7. Jangan lupa berikan juga +1 Google sahabat di tulisan ini

Kami (Catatan Belajar) juga hadir di Facebook, like kami ya klik tombol berikut:

 
Signature :

No copy paste content please…. If you want do that, please include the original source. Original Post by catatanbelajar.com, written by Ivo Idham Perdameian, Google plus profile.

  1. SANGAT MEMBANTU MASS REQUES SEARCH BDE MA ADOCONETION

  2. mau naxk kan aq udah buat perintah seperti di atas berhasil tp kalo di tambah tanngal di data basenya kok eror ya mas mohon pencerahanya

  3. kalo di tambah tangal dll di data basenya kok erorya mass

    • Ini sekaligus jawaban yang di atas ya. Pesan errornya gimana? mungkin format tanggal pada DateTimePicker enggak sama dengan format di sistem windownya kali sehingga kalau di klik DBGrid-nya terjadi error, karena saya juga pernah ngalamin kayak gitu mas. Kalau masalahnya seperti itu samakan forma tanggalnya.

  4. kalau file gambarnya jpg gmn codingnya,Mas?
    trima kasih

    • Ini bisa kok jpg, cuma jpgnya akan dikonversi ke bmp

      • Mas,itu kn tombol buttonnya 2in1,meload skaligus simpan.
        Nah,saya kn bikin tabel pasien yg fieldnya tntg identitas pasien tsb dan ada field fotonya. button load/browse sy gunakan untuk load n tampilkan gbr di dbimage dan button save untuk menyimpan smua data berdasarkan field termasuk foto. Itu gmn coding simpannya ya,Mas?

    • procedure TForm1.Button1Click(Sender: TObject);
      var gambar : TMemorystream;
      begin
        if(Edit1.Text = '') then begin
          ShowMessage('Silahkan isi nama dulu');
          edit1.SetFocus;
          exit;
        end;
        if OpenPictureDialog1.Execute then begin
          try
            convertobmp(OpenPictureDialog1.FileName);
            gambar := TMemorystream.Create;
            Image1.Picture.Graphic.SaveToStream(gambar);
            ADOQuery1.Close;
            ADOQuery1.SQL.Clear;
            ADOQuery1.SQL.Text := 'insert into tb_foto (nama,gambar) values (:p0, :p1)';
            ADOQuery1.Parameters[0].Value :=  Edit1.text;
            ADOQuery1.Parameters[1].LoadFromStream(gambar,ftBlob);
            ADOQuery1.ExecSQL;
            tampildata();
          except
          on E:Exception do
            ShowMessage('Maaf terjadi kesalahan.' + #13 + 'Error : ' + E.Message);
          end;
        end;
      end;
      

      diubah menjadi :

      procedure TForm1.Button1Click(Sender: TObject);
      begin
        if(Edit1.Text = '') then begin
          ShowMessage('Silahkan isi nama dulu');
          edit1.SetFocus;
          exit;
        end;
        if OpenPictureDialog1.Execute then begin
          try
            convertobmp(OpenPictureDialog1.FileName);
          except
          on E:Exception do
            ShowMessage('Maaf terjadi kesalahan.' + #13 + 'Error : ' + E.Message);
          end;
        end;
      end;
      

      Trus anggap saja ini adalah button save :

      procedure TForm1.ButtonSaveClick(Sender: TObject);
      var gambar : TMemorystream;
      begin
            gambar := TMemorystream.Create;
            Image1.Picture.Graphic.SaveToStream(gambar);
            ADOQuery1.Close;
            ADOQuery1.SQL.Clear;
            ADOQuery1.SQL.Text := 'insert into tb_foto (nama,gambar) values (:p0, :p1)';
            ADOQuery1.Parameters[0].Value :=  Edit1.text;
            ADOQuery1.Parameters[1].LoadFromStream(gambar,ftBlob);
            ADOQuery1.ExecSQL;
            tampildata();
      end;
      
      • Mas,saya kn pakainya delphi6,ini coding saya tapi ko msh error ya di bagian2 yg saya ksh keterangan (//) :

        ======================================================================

        procedure Tfpasien.DBGrid1CellClick(Column: TColumn);
        var
        Stream : TADOBlobStream; // UNDECLARED IDENTIFIER TADOBlobStream
        GambarBmp : TBitmap;
        Buffer : Word;
        begin
        if (not Modul.ADOQpasien.Eof) then
        begin
        Edit1.Text:= DBGrid1.Fields[0].Text;
        GambarBmp := TBitmap.Create;
        Stream := TADOBlobStream.Create(Modul.ADOQpasien,bmRead); // TOO MANY ACTUAL PARAMETERS,MISSING OPERATOR or SEMICOLON,
        Stream.Read(Buffer,SizeOf(Buffer)); // LEFT SIDE CANNOT BE ASSIGNED TO, MISSING OPERATOR or SEMICOLON
        Stream.Position:= 0; //MISSING OPERATOR or SEMICOLON, INCOMPATIBLE TYPES : “TPosition & Integer”

        GambarBmp.LoadFromStream(Stream);
        Image1.Picture.Bitmap := GambarBmp;
        Image1.Refresh;
        end;
        end;
        end;

        procedure Tfpasien.BitBtnsimpanClick(Sender: TObject);
        var gambar : TMemorystream;
        begin
        gambar := TMemorystream.Create;
        Image1.Picture.Graphic.SaveToStream(gambar);
        Modul.ADOQpasien.Close;
        Modul.ADOQpasien.SQL.Clear;
        Modul.ADOQpasien.text:= ‘insert into pasien // UNDECLARED IDENTIFIER “TEXT”
        (Id_Pasien,Nama,Tempat,Tgl_Lahir,Alamat,Nama_Ortu/Klg,Riwayat,Contact,Tgl_Reg,Status,Foto) values (:p0, :p1, :p2, :p3, :p4, :p5, :p6, :p7, :p8, :p9, :p10,)’;
        Modul.ADOQpasien.Parameters[0].Value := Edit1.Text;
        Modul.ADOQpasien.Parameters[1].Value := Edit2.Text;
        Modul.ADOQpasien.Parameters[2].Value := Edit3.Text;
        Modul.ADOQpasien.Parameters[3].Value := DateTimePicker2.Date;
        Modul.ADOQpasien.Parameters[4].Value := Edit4.Text;
        Modul.ADOQpasien.Parameters[5].Value := Edit5.Text;
        Modul.ADOQpasien.Parameters[6].Value := Memo1.Text;
        Modul.ADOQpasien.Parameters[7].Value := Edit9.Text;
        Modul.ADOQpasien.Parameters[8].Value := DateTimePicker1.Date;
        Modul.ADOQpasien.Parameters[9].Value := Combobox1.Text;
        Modul.ADOQpasien.Parameters[10].LoadFromStream(gambar,ftBlob); // UNDECLARED IDENTIFIER “ftBlob”
        Modul.ADOQpasien.ExecSQL;
        tampildata();
        Edit1.SetFocus;
        enablebutton;
        end;

        ======================================================================
        Mhn bantuannya,udah pusing g nemu2 jwbn ni,Mas. Maaf sy sdh sangat merepotkan.Trimaksh sebelumnya.

      • pertanyaan saya yg benar yg ini,Mas.
        komentar yg jam 10.29 salah.
        maaf bikin bingung.

      • Maaf lama balas, baru login ke blog. Hmm… kalau tutorial ini di ikuti ada error gak sama sourcenya? klau gak ada bearti ada yang salah sama kode programnya mbak.

        Kalau mbak belum coba program yang saya jelaskan di atas, kalau mau saya kirimkan source code program ininya.

      • Blm tu,Mas.
        Saya langsung terapkan program Mas ini ke pogram saya.
        Kalau gt boleh dkirimkan ke email saya,Mas.
        anitameylinda@ymail.com
        Itu kn di fieldnya Mas hy ada nama dan foto,sedangkan saya ada text,combobox,memo,dan datetimepicker apa tdk ada tambahan/perubahan coding,Mas?
        Trs Mas kn pke delphi7 sy delphi6,apa ada perbedaan komponen ya,kok TADOBlobStream nya sy g detect?
        Mhn bantuannya,Mas.
        Trima ksh byk sebelumnya.

      • Iya nampaknya di delphi6 gak support tuh dengan TADOBlobStream atau saya yang tidak paham soalnya saya pake delphi 7. Sebentar saya kirim kodenya ke email, kalau masih gak detect bearti delphinya.

  5. Mas,saya kn pakainya delphi6,ini coding saya tapi ko msh error ya di bagian2 yg saya ksh keterangan (//) :

    ======================================================================

    procedure Tfpasien.DBGrid1CellClick(Column: TColumn);
    var
    Stream : TADOBlobStream; //undeclared identifier TADOBlobStream
    GambarBmp : TBitmap;
    Buffer : Word;
    begin
    if (not Modul.ADOQpasien.Eof) then
    begin
    Edit1.Text:= DBGrid1.Fields[0].Text;
    GambarBmp := TBitmap.Create;
    Stream := TADOBlobStream.Create(Modul.ADOQpasien,bmRead); // too many actual parameters,missing operator or semicolon
    Stream.Read(Buffer,SizeOf(Buffer)); // Left side cannot be assigned to,Missing operator or semicolon
    Stream.Position:= 0; //Missing operator or semicolon, Incompatible types:TPosition & Integer
    GambarBmp.LoadFromStream(Stream);
    Image1.Picture.Bitmap := GambarBmp;
    Image1.Refresh;
    end;
    end;
    end;

    procedure Tfpasien.BitBtnsimpanClick(Sender: TObject);
    var gambar : TMemorystream;
    begin
    gambar := TMemorystream.Create;
    Image1.Picture.Graphic.SaveToStream(gambar);
    Modul.ADOQpasien.Close;
    Modul.ADOQpasien.SQL.Clear;
    Modul.ADOQpasien.Locate:= ‘insert into pasien (Id_Pasien,Nama,Tempat,Tgl_Lahir,Alamat,Nama_Ortu/Klg,Riwayat,Contact,Tgl_Reg,Status,Foto) values (:p0, :p1, :p2, :p3, :p4, :p5, :p6, :p7, :p8, :p9, :p10,)’; // Incompatible types Boolean & string,Not enough actual parameters
    Modul.ADOQpasien.Parameters[0].Value := Edit1.Text;
    Modul.ADOQpasien.Parameters[1].Value := Edit2.Text;
    Modul.ADOQpasien.Parameters[2].Value := Edit3.Text;
    Modul.ADOQpasien.Parameters[3].Value := DateTimePicker2.Date;
    Modul.ADOQpasien.Parameters[4].Value := Edit4.Text;
    Modul.ADOQpasien.Parameters[5].Value := Edit5.Text;
    Modul.ADOQpasien.Parameters[6].Value := Memo1.Text;
    Modul.ADOQpasien.Parameters[7].Value := Edit9.Text;
    Modul.ADOQpasien.Parameters[8].Value := DateTimePicker1.Date;
    Modul.ADOQpasien.Parameters[9].Value := Combobox1.Text;
    Modul.ADOQpasien.Parameters[10].LoadFromStream(gambar,ftBlob); // Undeclared identifier ftBlob
    Modul.ADOQpasien.ExecSQL;
    tampildata();
    Edit1.SetFocus;
    enablebutton;
    end;

    ======================================================================
    Mhn bantuannya,udah pusing g nemu2 jwbn ni,Mas. Maaf sy sdh sangat merepotkan.Trimaksh sebelumnya.

  6. mas saya mau nanya juga ni.. tpi ahk mlenceng dari materi di atas..,
    kenpa y mas setiap aq mau run program delphi ku slalu muncul error
    Cannot focus a disabled or visible window…, padahal properties enabled dan visible nya sudah sya true smua…, mhon bantuanya y mas… saya sdh pusing ngotak-ngatik tp ngk bisa juga..

    • Owh itu karena kita focus pada saat window atau komponennya memiliki properties enabled = false atau visible = false.

      Pada permasalahan yang mas limsi itu kalau semua properties enabled dan visible nya sudah true, coba dilihat pada saat event form create-nya, jangan-jangan ada kode misalnya seperti ini edit1.SetFocus; atau kode lain yang intinya SetFocus. Kalau ada saya sarankan untuk dipindahkan ke event form show seperti ini :

      procedure TForm1.FormShow(Sender: TObject);
      begin
      edit1.SetFocus;
      end;

      Nah kenapa pada event form show? karena semua komponennya sudah visible, kalau pada form create-kan segala komponennya masih belum muncul.

      Oke selamat mengkoding lagi :)

      • masih belum bisa i mas…, sya kan buat procedure cleardata, apa yg setfocus di clear data di hapus juga trus dipindahkan ke form show smua,
        klw untuk form create sya tidak menggunkan kode setfocus…,

      • Coba perhatikan pemanggilan prosedure cleardata dari mana, apakah waktu klik button atau form create? coba saya lihat code prosedure cleardata nya kalau boleh.

      • Ini procedure tambahan yg saya gunakan :
        Procedure enablebutton;
        Procedure disablebutton;
        Procedure aktif;
        Procedure nonaktif;
        Procedure cleardata;

        procedure Tinput_agtmula.nonaktif;
        begin
        DateTimePicker1.Enabled:=False;
        edit1.Enabled:=False;
        edit2.Enabled:=False;
        edit3.Enabled:=False;
        dateTimePicker2.Enabled:=False;
        combobox3.Enabled:=False;
        combobox1.Enabled:=False;
        combobox2.Enabled:=False;
        edit4.Enabled:=False;
        edit6.Enabled:=False;
        edit11.Enabled:=False;
        edit7.Enabled:=False;
        edit8.Enabled:=False;
        dateTimePicker3.Enabled:=False;
        edit9.Enabled:=False;
        edit10.Enabled:=False;
        end;

        procedure Tinput_agtmula.aktif;
        begin
        DateTimePicker1.Enabled:=True;
        edit1.Enabled:=True;
        edit2.Enabled:=True;
        edit3.Enabled:=True;
        dateTimePicker2.Enabled:=True;
        combobox3.Enabled:=True;
        combobox1.Enabled:=True;
        combobox2.Enabled:=True;
        edit4.Enabled:=True;
        edit6.Enabled:=True;
        edit11.Enabled:=True;
        edit7.Enabled:=True;
        edit8.Enabled:=True;
        dateTimePicker3.Enabled:=True;
        edit9.Enabled:=True;
        edit10.Enabled:=True;
        end;

        procedure Tinput_agtmula.enablebutton;
        begin
        tambah.Enabled:=True;
        ubah.Enabled:=false;
        hapus.Enabled:=true;
        simpan.Enabled:=false;
        batal.Enabled:=true;
        end;

        procedure Tinput_agtmula.disablebutton;
        begin
        tambah.Enabled:=false;
        ubah.Enabled:=true;
        hapus.Enabled:=False;
        simpan.Enabled:=true;
        batal.Enabled:=true;
        end;

        Procedure Tinput_agtmula.cleardata;
        begin
        DateTimePicker1.Date:=now();
        edit1.Text:=”;
        edit2.Text:=”;
        edit3.Text:=”;
        dateTimePicker2.Date:=now();
        combobox3.Text:=”;
        combobox1.Text:=”;
        combobox2.Text:=”;
        edit4.Text:=”;
        edit6.Text:=”;
        edit11.Text:=”;
        edit7.Text:=”;
        edit8.Text:=”;
        dateTimePicker3.Date:=now();
        edit9.Text:=”;
        edit10.Text:=”;
        end;

        Kode pada Form :
        procedure Tinput_agtmula.FormShow(Sender: TObject);
        begin
        nonaktif;
        enablebutton;
        edit1.SetFocus;
        end;

        procedure Tinput_agtmula.FormCreate(Sender: TObject);
        begin
        cleardata;
        with mdpmr.Qagtmula do
        begin
        Active := False;
        SQL.Clear;
        SQL.Text :=’ SELECT * FROM agt_pmr_mula ‘;
        Active := True;
        end;
        end;

        procedure Tinput_agtmula.FormActivate(Sender: TObject);
        begin
        FormCreate(Sender);
        end;

      • Owh saya tau mas hehehe….

        Gini aja biar mudah, hapus edit1.SetFocus; pada event form show, trus tambahkan edit1.SetFocus; pada bagian akhir dari prosedure aktif.

        Kalau berhasil jangan lupa kasih tau ya :)

  7. O…Saya baru baca tutorial Mas yg VB tentang isi tabelnya.
    Ternyata yang Mas bikin disini tabel foto berdiri sendiri ya,jd ntr browsenya dari tabel tsb sesuai namanya gt.
    Punya saya kn g ada tabel fotonya Mas,foto itu merupakan salah satu field dr tabel pasien,jd browse fotonya bisa dr mana saja di komputer,sy tdk bikin tabel foto tersendiri.
    Kl kyk saya gini codingnya gmn,Mas?

  8. kok masih ngk bisa y mas…, bingung ni.., nyebutnya pakai mbk aj y mas..,

    • Owh mbak limsi ya? tak kira mas e hehe, sorry mbak :D. Dari kode yang mbak kasi tadi kok saya tidak menemukan pemanggilan prosedure aktif ya? supaya lebih tau prosesnya. Oke coba saya reka ya, begini :

      Form show :

      procedure Tinput_agtmula.FormShow(Sender: TObject);
      begin
      nonaktif;
      enablebutton;
      // edit1.SetFocus; // < = ini dihilangkan
      end;

      Prosedure aktif :

      procedure Tinput_agtmula.aktif;
      begin
      DateTimePicker1.Enabled:=True;
      edit1.Enabled:=True;
      edit2.Enabled:=True;
      edit3.Enabled:=True;
      dateTimePicker2.Enabled:=True;
      combobox3.Enabled:=True;
      combobox1.Enabled:=True;
      combobox2.Enabled:=True;
      edit4.Enabled:=True;
      edit6.Enabled:=True;
      edit11.Enabled:=True;
      edit7.Enabled:=True;
      edit8.Enabled:=True;
      dateTimePicker3.Enabled:=True;
      edit9.Enabled:=True;
      edit10.Enabled:=True;
      edit1.SetFocus; // <= tambahkan ini
      end;

      Semoga membantu, kalau tidak bisa, kalau bersedia silahkan kirim source codenya ke email kontak saya di http://catatanbelajar.com/about/ivo-idham-perdameian/

  9. saya juga sudah coba file yg mas kirim ke email sya, n bisa dijlnkan, ap krna msalah kodingnya yg menggunakan modul itu ya mas..? yg myebabkan muncul psan error sperti itu?

  10. sya percya kok sma mas idham…, krn sya thu mas juga org yg mempunyai iman kpd Tuhan, jd ngk mungkin mlkukan hal yg tidak di kehendaki oleh Tuhan.

  11. ngk mas, itu emg program sya buat skrg sbgai tugas sya slama mgang di pmi surakrta, memang ada yg prnah buat juga program sperti itu, tp di buat oleh relawan yg ad di sumedang…, ini mgang sya sdh mau slesai tp program itu lum jadi2 juga, pdhal nilainya ngk kluar klw program itu ngk jadi. kirimin ke dua sya tdi itu project yg sama yg sya buat ulang. y nanti sya coba sran mas…
    Terima kasih sudah banyak membantu…

    • Owh begitu, maaf mbak soalnya saya periksa errornya banyak, diantaranya ada pemanggilan prosedur yang tidak sesuai dengan formnya. Selain itu saya juga berkendala karena databasenya juga enggak ada, Klau mbak bersedia kirimkan juga databasenya.

  12. sudah sya kirimkan databasenya bersma dgn kiriman sya yg ke 2, ohx databasenya kan sya buat di Navicate Premium td yg sya kirimkan itu yg sdha sya eksport.
    Ohnya sya juga sdh coba sran mas yg td, bisa di run tp link2 form yg ad di menu utama tidak bisa di buka, malah muncuk error. mungkin krna formnya tidak masuk dlm Form auto create y mas..

  13. Mas pas saya compile ada error yang pesannya :

    [Error] unConvert.pas(122): Incompatible types: ‘TBlobField’ and ‘TADOQuery’
    [Fatal Error] prjConvert.dpr(5): Could not compile used unit ‘unConvert.pas’

    Isi koding dari Unit saya :

    unit unConvert;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, Grids, DBGrids, DB, ExtDlgs, ADODB, jpeg, axCtrls;
    
    type
      TForm1 = class(TForm)
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        OpenPictureDialog1: TOpenPictureDialog;
        DataSource1: TDataSource;
        Label1: TLabel;
        Edit1: TEdit;
        DBGrid1: TDBGrid;
        Image1: TImage;
        Button1: TButton;
        ADOQuery1Nama: TWideStringField;
        ADOQuery1gambar: TADOQuery;
        procedure tampildata();
        procedure convertobmp(filename:TFileName);
        procedure Button1Click(Sender: TObject);
        procedure DBGrid1CellClick(Column: TColumn);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    // Untuk menyegarkan data pada ADOQuery1
    procedure TForm1.tampildata();
    begin
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.text := 'select * from tb_foto';
      ADOQuery1.Active:=true;
      DBGrid1CellClick(DBGrid1.Columns[0]);
    end;
    
    // Konversi setiap gambar ke format Bitmap
    // Kode ini saya dapatkan dari stackoverflow.com
    procedure TForm1.convertobmp(filename:TFileName);
    Var
         OleGraphic               : TOleGraphic;
         fs                       : TFileStream;
         Source                   : TImage;
         BMP                      : TBitmap;
    Begin
         Try
              OleGraphic := TOleGraphic.Create; //The magic class!
    
              fs := TFileStream.Create(filename, fmOpenRead Or fmSharedenyNone);
              OleGraphic.LoadFromStream(fs);
    
              Source := Timage.Create(Nil);
              Source.Picture.Assign(OleGraphic);
    
              BMP := TBitmap.Create; //Converting to Bitmap
              bmp.Width := Source.Picture.Width;
              bmp.Height := source.Picture.Height;
              bmp.Canvas.Draw(0, 0, source.Picture.Graphic);
     
              image1.Picture.Bitmap := bmp; //Show the bitmap on form
              image1.Refresh;
              fs.Free;
              OleGraphic.Free;
              Source.Free;
              bmp.Free;
         Finally
     
         End;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var gambar : TMemorystream;
    begin
    
    
      if(Edit1.Text = '') then begin
        ShowMessage('Silahkan isi nama dulu');
        edit1.SetFocus;
        exit;
      end;
      if OpenPictureDialog1.Execute then begin
        try
          convertobmp(OpenPictureDialog1.FileName);
          gambar := TMemorystream.Create;
          Image1.Picture.Graphic.SaveToStream(gambar);
          ADOQuery1.Close;
          ADOQuery1.SQL.Clear;
          ADOQuery1.SQL.Text := 'insert into tb_foto (nama,gambar) values (:p0, :p1)';
          ADOQuery1.Parameters[0].Value :=  Edit1.text;
          ADOQuery1.Parameters[1].LoadFromStream(gambar,ftBlob);
          ADOQuery1.ExecSQL;
          tampildata();
        except
        on E:Exception do
          ShowMessage('Maaf terjadi kesalahan.' + #13 + 'Error : ' + E.Message);
        end;
      end;
    end;
    
    procedure TForm1.DBGrid1CellClick(Column: TColumn);
    var
      Stream : TADOBlobStream;
      GambarBmp : TBitmap;
      Buffer : Word;
    
    begin
      if (not ADOQuery1.Eof) then begin
        Edit1.Text:= DBGrid1.Fields[0].Text;
        GambarBmp := TBitmap.Create;
        Stream := TADOBlobStream.Create(ADOQuery1gambar,bmRead);
        Stream.Read(Buffer,SizeOf(Buffer));
        Stream.Position := 0;
        GambarBmp.LoadFromStream(Stream);
        Image1.Picture.Bitmap := GambarBmp;
        image1.Refresh;
      end;
    end;
    
    end.
    

    Tolong di reply ya mas, terima kasih

    • Trimakasih sudah berkunjung om Rifki, berdasarkan kodenya sudah betul 90%, tapi ada yang kurang yaitu pada bagian type ADOQuery1gambar: TADOQuery; seharusnya ADOQuery1gambar: TBlobField; saya sarankan untuk melihat struktur databasenya di sini seperti yang sudah saya sebutkan di tutorial di atas pada paragrap ke dua.

  14. terima kasih atas reply nya mas, saya coba dulu

  15. mas sudah saya ganti dengan TBlobField tp pas di compile tetap jadi TADOQuery dan message nya sama seperti sebelumnya..
    Blob itu sebenarnya apa ya mas? apa fitur itu ada di delphi 7?

  16. Tolong donk upload source codenya sekalian, ditunggu..! Trim’s ats bantuannya

  17. mas gimana yah cara bikin form client untuk koneksi ke database mysql di komputer server sebagai form konfigurasi dan menggenerate file config yang nantinya dipakai terus-menerus sebagai file acuan untuk mengkomunikasikan aplikasi client dengan database di komputer server?

    • Menurut saya jangan menggunakan file config, tapi langsung simpan ke registry Windows dalam bentuk ODBC. Jadi dari form client yang mengatur koneksi simpannya ke registry. Saya pernah buat tetapi untuk bahasa pemrograman Visual Basic 6.0 bukan delphi.

  18. maksud saya misalkan kita sudah membuat aplikasi sim rsud yg sudah di instal di beberapa komputer, kemudian pada saat aplikasi tersebut di run muncul form koneksi ke server dan database kemudian secara otomatis ketika sudah konek akan terbentuk file txt yg dijadikan file rujukan untuk koneksi ke server

  19. Koq kalo ane bwat field table-nya lebih banyak jadi error list index g2 ya … !!!

    Kenapa ya ??? Bisa membantu ???
    Ane kirim sourcecode ane nya boleh ????

  20. mas mau tanyak klo pakek DBImage, mirip sama punya masnya klo nama di DBGridnya di klik yg lain maka gambarnya yg Di DBImage jg brubah?
    maklum baru belajar delphi mas…
    makasih…

  21. salam kenal mas, sebelumnya saya ucapkan terimakasih atas tutorialnya.
    tapi saya ada kendala ni,
    untuk dbgrid nya, saat di klik untuk teks yang lain ikut berubah, tapi gambar yang muncul sama, sepertinya gambar untuk record yang pertama.
    kira2 itu apanya ya mas…??
    Terimakasih sebelumnya..

    • Terimakasih sudah mau berkunjung dan memberi komentar mas, saya melihat kendala yang mas dapatkan itu termasuk jarang alias langka hehe :), pertama coba mas pastikan sudah mengikuti semua langkah satu persatu seperti yang saya jelaskan di atas, kedua pastikan juga gambar yang di input merupakan gambar yang berbeda, yang ketiga jika mas sudah mengikuti langkah sebelumnya dan masih terjadi hal yang sama coba mas teliti lagi pada langkah yang pertama tadi pada bagian even DbGrid di klik, apakah sudah sama dengan yang ada pada contoh kode di atas?. Jika semuanya sudah mas coba dan ternyata tidak bisa, silahkan mas kontak saya dengan cara berkomentar kembali pada tutorial ini.

      Begitu mas, semoga membantu dan happy coding ;)

  22. untuk perintah delete dan update-nya bagaimana?

  23. Mas, punya saya waktu di compile error di baris yg saya kasih tanda seperti ini {…….}
    Mohon mas liat program yg saya tulis apakah emang ada yg salah ato gimana?
    Mohon bantuannya ya Mas…

    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtDlgs, DB, ADODB, StdCtrls, Grids, DBGrids, ExtCtrls,
      jpeg,axCtrls; 
    
    type
      TForm1 = class(TForm)
        Image1: TImage;
        DBGrid1: TDBGrid;
        Edit1: TEdit;
        Button1: TButton;
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        ADOQuery1sn: TWideStringField;
        ADOQuery1Nama: TWideStringField;
        ADOQuery1foto: TBlobField;
        DataSource1: TDataSource;
        OpenPictureDialog1: TOpenPictureDialog;
        procedure Button1Click(Sender: TObject);
    
        procedure tampildata();                   {unsatisfied forward or external declaration TForm1.tampildata'}
        procedure convertobmp(filename:TFileName);         {unsatisfied forward or external declaration 'TForm1.convertobmp'}
    
      private
        { Private declarations }
      public
    
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    var gambar : TMemorystream;
    begin
        if(Edit1.Text = '') then begin
        ShowMessage('Silahkan isi nama dulu');
        edit1.SetFocus;
        exit;
      end;
      if OpenPictureDialog1.Execute then begin
        try
          convertobmp(OpenPictureDialog1.FileName);
          gambar := TMemorystream.Create;
          Image1.Picture.Graphic.SaveToStream(gambar);
          ADOQuery1.Close;
          ADOQuery1.SQL.Clear;
          ADOQuery1.SQL.Text := 'insert into tb_foto (nama,gambar) values (:p0, :p1)';
          ADOQuery1.Parameters[0].Value :=  Edit1.text;
          ADOQuery1.Parameters[1].LoadFromStream(gambar,ftBlob);
          ADOQuery1.ExecSQL;
          tampildata();
        except
        on E:Exception do
          ShowMessage('Maaf terjadi kesalahan.' + #13 + 'Error : ' + E.Message);
        end;
      end;
    end;
    
    end.
    
    // Untuk menyegarkan data pada ADOQuery1
    procedure TForm1.tampildata();    {Text after final 'END',ignored by compiler}
    begin
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.text := 'select * from tb_foto';
      ADOQuery1.Active:=true;
      DBGrid1CellClick(DBGrid1.Columns[0]);
    end;
     
    // Konversi setiap gambar ke format Bitmap
    // Kode ini saya dapatkan dari stackoverflow.com
    procedure TForm1.convertobmp(filename:TFileName);
    Var
         OleGraphic               : TOleGraphic;
         fs                       : TFileStream;
         Source                   : TImage;
         BMP                      : TBitmap;
    Begin
         Try
              OleGraphic := TOleGraphic.Create; //The magic class!
    
              fs := TFileStream.Create(filename, fmOpenRead Or fmSharedenyNone);
              OleGraphic.LoadFromStream(fs);
    
              Source := Timage.Create(Nil);
              Source.Picture.Assign(OleGraphic);
    
              BMP := TBitmap.Create; //Converting to Bitmap
              bmp.Width := Source.Picture.Width;
              bmp.Height := source.Picture.Height;
              bmp.Canvas.Draw(0, 0, source.Picture.Graphic);
    
              image1.Picture.Bitmap := bmp; //Show the bitmap on form
              image1.Refresh;
              fs.Free;
              OleGraphic.Free;
              Source.Free;
              bmp.Free;
         Finally
    
         End;
    end;
    
    procedure TForm1.DBGrid1CellClick(Column: TColumn);
    var
      Stream : TADOBlobStream;
      GambarBmp : TBitmap;
      Buffer : Word;
    begin
      if (not ADOQuery1.Eof) then begin
        Edit1.Text:= DBGrid1.Fields[0].Text;
        GambarBmp := TBitmap.Create;
        Stream := TADOBlobStream.Create(ADOQuery1gambar,bmRead);
        Stream.Read(Buffer,SizeOf(Buffer));
        Stream.Position := 0;
        GambarBmp.LoadFromStream(Stream);
        Image1.Picture.Bitmap := GambarBmp;
        image1.Refresh;
      end;
    end;
    
    • Terimakasih untuk mbak Febri Nur yang sudah mau berkomentar pada tutorial ini,
      Yup saya sudah meneliti dengan seksama dari barisan kode yang mbak tulis di atas, namun saya menemui bahwa ternyata mbak hanya tidak teliti dalam penyusunannya saja, seharusnya procedure TForm1.tampildata(); diletakan di bawah implementation bukan seperti yang mbak tulis di atas. Coba baca dengan teliti lagi mbak seperti tutorial yang sudah saya tulis.

      Begitu mbak, semoga jawaban saya membantu. Terimakasih :)

  24. selamatbelanja.com

    maaf tanya lagi nih :D
    apa di field nama pasti ke isi BMz6( ya ? bukan isinya edit1..
    pas oncell click error read stream tu knp ya ?

    • Yup betul sekali, klo menggunakan kode yang di tutorial di atas pasti error soalnya berbeda database. Saya sudah nyobanya tadi gan, oleh karena itu perlu modifikasi sedikit seperti ini :

      procedure TForm1.DBGrid1CellClick(Column: TColumn);
      var
        Stream : TMemoryStream;
        GambarBmp : TBitmap;
      begin
        if (not MyQuery1.Eof) then begin
          Edit1.Text:= DBGrid1.Fields[0].Text;
          GambarBmp := TBitmap.Create;
          Stream := TMemoryStream.Create;
          try
            MyQuery1gambar.SaveToStream(Stream);
            Stream.Position := 0;
            GambarBmp.LoadFromStream(Stream);
            Image1.Picture.Bitmap := GambarBmp;
            image1.Refresh;
          finally
            Stream.Free;
          end;
        end;
      end;
      

      Semoga membantu :)

  25. selamatbelanja.com

    update sudah bisa gan..
    ada kesalahan koding saya..
    makasi bantuannya + maaf ngrepotin :D

  26. selamatbelanja.com

    waduh tanya lagi nih :Peace:
    pas saya pasang di project saya pasang bmp langsung error pas convert tapi kalau buat cuma simpan gambar saja bisa..
    kira2 knp ya ?

  27. mas…
    Saya terapkan seperti mbak meylinda..

    Nah paramater ftBlog gak d kenal. gmn mas?

  28. Mas q mau tanya nch,apa shortcode itu jg bs wt database SQL server2005????

  29. Muakasih tenan lho mas,.. programku udah ktmu titik terangnya

  30. mas saya sudah pakai listing yang mas posting,namun ada sedikit kendala, ada erornya : ‘LIST INDEX OUT OF BOUNDS(8)’
    berikut listing yang saya gunakan.

    procedure TF_dataBarang.Btn_SimpanClick(Sender: TObject);
    var gambar: TMemorystream;
    begin
      gambar:=TMemorystream.Create;
      Image1.Picture.Graphic.SaveToStream(gambar);
      DM.AQ_DtBrg.Close;
      DM.AQ_DtBrg.SQL.Clear;
      DM.AQ_DtBrg.SQL.Text:='insert into T_DataPenjualan(ID_Barang,Nama_Barang,Jenis,Status,Umur_Barang,Stok, Keterangan,Foto) values (:p0, :p1)';
      DM.AQ_DtBrg.Parameters[0].Value:=Edit1.Text;
      DM.AQ_DtBrg.Parameters[8].LoadFromStream(gambar,ftBlob);
      DM.AQ_DtBrg.ExecSQL;
      tampildata()
    end;
    

    parameters[8] saya pakai karena field untuk foto ada diurutan 8, itu yang bikin saya bingung mas :(
    tolong pencerahannya.
    terima kasih

  31. mas saya sudah pake listing yang mas posting, untuk memisah antara listing tombol load dan simpan data. nah terus terjadi eror ketika akan ditekan tombol simpan.
    eror : ‘LIST INDEX OUT OF BOUNDS (2)’

    Berikut Listingnya mas :

    procedure TF_dataBarang.Btn_SimpanClick(Sender: TObject);
    var gambar: TMemorystream;
    begin
      gambar:=TMemorystream.Create;
      Image1.Picture.Graphic.SaveToStream(gambar);
      DM.AQ_DtBrg.Close;
      DM.AQ_DtBrg.SQL.Clear;
      DM.AQ_DtBrg.SQL.Text:='insert into T_DataPenjualan(ID_Barang,Nama_Barang,Jenis,Status,Umur_Barang,Stok,Harga,Keterangan,Foto) values (:p0, :p1)';
      DM.AQ_DtBrg.Parameters[0].Value:=Edit1.Text;
      DM.AQ_DtBrg.Parameters[1].Value:=Edit2.Text;
      DM.AQ_DtBrg.Parameters[2].Value:=ComboBox1.Text;
      DM.AQ_DtBrg.Parameters[3].Value:=ComboBox2.Text;
      DM.AQ_DtBrg.Parameters[4].Value:=Edit3.Text;
      DM.AQ_DtBrg.Parameters[5].Value:=Edit4.Text;
      DM.AQ_DtBrg.Parameters[6].Value:=Edit5.Text;
      DM.AQ_DtBrg.Parameters[7].Value:=Memo1.Text;
      DM.AQ_DtBrg.Parameters[8].LoadFromStream(gambar,ftBlob);
      DM.AQ_DtBrg.ExecSQL;
      tampildata()
    end;
    

    mohon pencerahannya :D
    terima kasih

    • Saya jawab sekaligus untuk pertanyaan mas yang di atas ya.

      Permasalahannya bukan pada program yang saya buat, tapi pada koding yang mas punya itu untuk penggunaan parameter dalam insert/update. Dicontoh saya gunakan cuma 2 parameter :p0, :p1.

      Untuk permasalahan yang mas punya saya ilustrasikan seperti ini:

      //                                                 :p0      , :p1       , :p2 , :p3  , :p4       , :p5, :p6 , :p7      , :p8
      DM.AQ_DtBrg.SQL.Text:='insert into T_DataPenjualan(ID_Barang,Nama_Barang,Jenis,Status,Umur_Barang,Stok,Harga,Keterangan,Foto)....';
      

      Seharusnya menjadi seperti ini mas:

      DM.AQ_DtBrg.SQL.Text:='insert into T_DataPenjualan(ID_Barang,Nama_Barang,Jenis,Status,Umur_Barang,Stok,Harga,Keterangan,Foto) values (:p0, :p1, :p2, :p3, :p4, :p5, :p6, :p7, :p8)';
      DM.AQ_DtBrg.Parameters[0].Value:=Edit1.Text;
      DM.AQ_DtBrg.Parameters[1].Value:=Edit2.Text;
      DM.AQ_DtBrg.Parameters[2].Value:=ComboBox1.Text;
      DM.AQ_DtBrg.Parameters[3].Value:=ComboBox2.Text;
      DM.AQ_DtBrg.Parameters[4].Value:=Edit3.Text;
      DM.AQ_DtBrg.Parameters[5].Value:=Edit4.Text;
      DM.AQ_DtBrg.Parameters[6].Value:=Edit5.Text;
      DM.AQ_DtBrg.Parameters[7].Value:=Memo1.Text;
      DM.AQ_DtBrg.Parameters[8].LoadFromStream(gambar,ftBlob);
      

      Semoga membantu ;)

      • ia bang saya sudah ganti apa yang abang posting diatas, tapi masih ada erornya bang ‘THE FIELD IS TOO SMALL TO ACCEPT THE AMOUNTOF DATA YOU ATTEMPTED TO ADD’

        berikut listing full yang saya posting bang, mohon dibantu untuk memecahkan maslah saya :D

        unit U_dtBarang;
        
        interface
        
        uses
          Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
          Dialogs, StdCtrls, DBCtrls, Grids, DBGrids, ExtCtrls, ExtDlgs, Jpeg ,axCtrls ,DB,
          ADODB;
        
        type
          TF_dataBarang = class(TForm)
            GroupBox1: TGroupBox;
            Edit1: TEdit;
            Edit2: TEdit;
            ComboBox1: TComboBox;
            ComboBox2: TComboBox;
            Edit3: TEdit;
            Edit4: TEdit;
            Edit5: TEdit;
            Label1: TLabel;
            Label2: TLabel;
            Label3: TLabel;
            Label4: TLabel;
            Label5: TLabel;
            Label6: TLabel;
            Label7: TLabel;
            Label8: TLabel;
            Memo1: TMemo;
            Label9: TLabel;
            Btn_Cari: TButton;
            Label10: TLabel;
            GroupBox3: TGroupBox;
            RadioButton1: TRadioButton;
            RadioButton2: TRadioButton;
            RadioButton3: TRadioButton;
            RadioButton4: TRadioButton;
            Edit7: TEdit;
            GroupBox2: TGroupBox;
            Btn_Tambah: TButton;
            Btn_Simpan: TButton;
            Btn_Edit: TButton;
            Btn_Hapus: TButton;
            Btn_Reset: TButton;
            Btn_Batal: TButton;
            Btn_Keluar: TButton;
            Label11: TLabel;
            Label12: TLabel;
            OpenPictureDialog1: TOpenPictureDialog;
            Edit6: TEdit;
            Image1: TImage;
            DBGrid1: TDBGrid;
            DBImage1: TDBImage;
            procedure Btn_KeluarClick(Sender: TObject);
            procedure Btn_TambahClick(Sender: TObject);
            procedure Btn_CariClick(Sender: TObject);
            procedure ComboBox2Change(Sender: TObject);
            procedure Btn_SimpanClick(Sender: TObject);
            procedure tampildata();
            procedure converttobmp(TF_dataBarang:TObject);
            procedure DBGrid1DblClick(Sender: TObject);
            procedure FormCreate(Sender: TObject);
            procedure DBGrid1CellClick(Column: TColumn);
          private
            { Private declarations }
          public
            { Public declarations }
          end;
        
        var
          F_dataBarang: TF_dataBarang;
        
        implementation
        
        uses U_DM;
        
        {$R *.dfm}
        
        procedure TF_dataBarang.tampildata();
        begin
          DM.AQ_DtBrg.Close;
          DM.AQ_DtBrg.SQL.Clear;
          DM.AQ_DtBrg.SQL.Text:='select * from T_DataPenjualan';
          DM.AQ_DtBrg.Active:=true;
          DBGrid1CellClick(DBGrid1.Columns[0]);
        end;
        
        procedure TF_DataBarang.converttobmp;
        var
          OleGraphic : TOleGraphic;
          fs : TFileStream;
          Source : TImage;
          BMP : TBitmap;
        begin
          try
            OleGraphic:=TOleGraphic.Create;
            fs:=TFileStream.Create('filename', fmOpenRead or fmSharedenyNone);
            OleGraphic.LoadFromStream(fs);
        
            Source:=Timage.Create(Nil);
            Source.Picture.Assign(OleGraphic);
            BMP:=TBitmap.Create;
            bmp.Width:=Source.Picture.Width;
            bmp.Height:=Source.Picture.Height;
            bmp.Canvas.Draw(0,0, source.Picture.Graphic);
        
            F_dataBarang.Image1.picture.Bitmap:=bmp;
            F_dataBarang.Image1.Refresh;
            fs.Free;
            OleGraphic.Free;
            Source.Free;
            bmp.Free;
          Finally
          end;
        
        end;
        
        procedure TF_dataBarang.Btn_KeluarClick(Sender: TObject);
        begin
        close;
        end;
        
        procedure TF_dataBarang.Btn_TambahClick(Sender: TObject);
        begin
          DBGrid1.Enabled:=false;
          Edit1.Enabled:=True;
          Edit2.Enabled:=True;
          Edit3.Enabled:=True;
          Edit4.Enabled:=True;
          Edit5.Enabled:=True;
          Edit6.Enabled:=True;
          ComboBox1.Enabled:=True;
          ComboBox2.Enabled:=True;
          Memo1.Enabled:=True;
          Edit1.Text:='';
          Edit2.Text:='';
          Edit3.Text:='';
          Edit4.Text:='';
          Edit5.Text:='';
          Edit6.Text:='';
          Edit1.Text:=Edit1.Text+'KB000'+inttostr(DM.AQ_DtBrg.RecordCount+1);
          Edit1.SetFocus;
          ComboBox1.Text:='';
          ComboBox2.Text:='';
          Memo1.Text:='';
          Edit1.Enabled:=False;
          Btn_Simpan.Enabled:=True;
          Btn_Edit.Enabled:=True;
          Btn_Reset.Enabled:=True;
          Btn_Cari.Enabled:=True;
          Btn_Tambah.Enabled:=False;
          Btn_Hapus.Enabled:=False;
        end;
        
        procedure TF_dataBarang.Btn_CariClick(Sender: TObject);
        var strfile:string;
        begin
          if(OpenPictureDialog1.Execute) then
          begin
          strfile:=OpenPictureDialog1.FileName;
          Image1.Picture.Graphic.LoadFromFile(strfile);
          Edit6.Text:=strfile;
          end;
        end;
        
        procedure TF_dataBarang.ComboBox2Change(Sender: TObject);
        begin
        if ComboBox2.Text='BARU' then
          begin
          Edit3.Enabled:=False;
          Label5.Enabled:=false;
          end
        else
          begin
          Edit3.Enabled:=True;
          Label5.Enabled:=true;
          end
        end;
        
        procedure TF_dataBarang.Btn_SimpanClick(Sender: TObject);
        var gambar: TMemorystream;
        begin
          gambar:=TMemorystream.Create;
          Image1.Picture.Graphic.SaveToStream(gambar);
          DM.AQ_DtBrg.Close;
          DM.AQ_DtBrg.SQL.Clear;
          DM.AQ_DtBrg.SQL.Text:='insert into T_DataPenjualan (ID_Barang,Nama_Barang,Jenis,Status,Umur_Barang,Stok,Harga,Keterangan,Foto) values (:p0,:p1,:p2,:p3,:p4,:p5,:p6,:p7,:p08)';
          DM.AQ_DtBrg.Parameters[0].Value:=Edit1.Text;
          DM.AQ_DtBrg.Parameters[1].Value:=Edit2.Text;
          DM.AQ_DtBrg.Parameters[2].Value:=ComboBox1.Text;
          DM.AQ_DtBrg.Parameters[3].Value:=ComboBox2.Text;
          DM.AQ_DtBrg.Parameters[4].Value:=Edit3.Text;
          DM.AQ_DtBrg.Parameters[5].Value:=Edit4.Text;
          DM.AQ_DtBrg.Parameters[6].Value:=Edit5.Text;
          DM.AQ_DtBrg.Parameters[7].Value:=Memo1.Text;
          DM.AQ_DtBrg.Parameters[8].LoadFromStream(gambar,ftBlob);
          DM.AQ_DtBrg.ExecSQL;
          tampildata();
          Edit1.SetFocus;
        end;
        
        procedure TF_dataBarang.DBGrid1DblClick(Sender: TObject);
        begin
        end;
        {var tampil:string;
        begin
          Edit6.Text:=DM.AQ_DtBrg['Foto'];
          if Edit6.Text='' then
          begin
            Edit1.Text:=DM.AQ_DtBrg['ID_Barang'];
            Edit2.Text:=DM.AQ_DtBrg['Nama_Barang'];
            Edit3.Text:=DM.AQ_DtBrg['Umur_Barang'];
            Edit4.Text:=DM.AQ_DtBrg['Stok'];
            Edit5.Text:=DM.AQ_DtBrg['Harga'];
            ComboBox1.Text:=DM.AQ_DtBrg['Jenis'];
            ComboBox2.Text:=DM.AQ_DtBrg['Status'];
            Memo1.Text:=DM.AQ_DtBrg['Keterangan'];
          end
          else
          begin
            Edit1.Text:=DM.AQ_DtBrg['ID_Barang'];
            Edit2.Text:=DM.AQ_DtBrg['Nama_Barang'];
            Edit3.Text:=DM.AQ_DtBrg['Umur_Barang'];
            Edit4.Text:=DM.AQ_DtBrg['Stok'];
            Edit5.Text:=DM.AQ_DtBrg['Harga'];
            ComboBox1.Text:=DM.AQ_DtBrg['Jenis'];
            ComboBox2.Text:=DM.AQ_DtBrg['Status'];
            Memo1.Text:=DM.AQ_DtBrg['Keterangan'];
            tampil:=Edit6.Text;
            DBImage1.Picture.LoadFromFile(tampil);
          end;
        end;
        }
        procedure TF_dataBarang.FormCreate(Sender: TObject);
        begin
        tampildata();
        end;
        
        procedure TF_dataBarang.DBGrid1CellClick(Column: TColumn);
        var
          Stream:TMemoryStream;
          GambarBmp:TBitmap;
        begin
          if (not DM.AQ_DtBrg.Eof) then begin
          Edit1.Text:=DBGrid1.Fields[0].Text;
          GambarBmp:=TBitmap.Create;
          Stream:=TMemoryStream.Create;
          try
            DM.AQ_DtBrgFoto.SaveToStream(Stream);
            Stream.Position:=0;
            GambarBmp.LoadFromStream(Stream);
            Image1.Picture.Bitmap:=GambarBmp;
            Image1.Refresh;
          finally
            Stream.Free;
          end;
        end;
        
        end;
        
        end.
        

        bang boleh minta listingnya abang yang di posting supaya saya bisa membedakan secara langsung listing saya dgn listingnya abang, kalau bisa kirim di email saya bang yah:)
        semoga berkenan :D
        terima kasih sebelumnya

      • Sekali lagi permasalahannya bukan pada program yang saya buat hehehe…. :D, Kalau pesan errornya ‘THE FIELD IS TOO SMALL TO ACCEPT THE AMOUNT OF DATA YOU ATTEMPTED TO ADD’ dan databasenya MS. Access itu artinya datanya lebih besar dari yang bisa ditampung dri databasenya atau misalnya begini type datanya string(10) mas kasi data lebih dari 10.

        Kalau saya lihat kodenya mas itu pake data modul ya? Nah program yang saya buat ini gak pake data modul mas, karena saya masih belum bisa buat konfigurasinya untuk yang menyimpan gambar.

        Saya sarankan khusus untuk yang menyimpan gambar(tabel yang ada gambar) jangan pake Data Modul tapi terapkan seperti yang saya bahas di tutorial di atas, ikuti langkah perlangkah pasti berhasil kok buktinya dah banyak yang nyoba dan sukses.

        Semoga membantu. :)

      • ia bang permasalahannya ada pada program saya :D
        hehehehe
        ia bang saya pake data modul, jadi ADOQuerynya di pindah ke formnya yah.?
        okedeh bang makasih sarannya :D

  32. bang saya sudah mengikuti saran yang sudah abang berikan tapi masih eror, erornya tetap sama ‘THE FIELD IS TOO SMALL TO ACCEPT THE AMOUNT OF DATA YOU ATTEMPTED TO ADD’. ketika eror delphi langsung mengarah ke listing pada baris ke-197 tampildata(); dengan garis biru. kira2 apa lagi yang harus diperbaiki lagi.??

    saya sudah ikuti tutor yang abang posting, mohon bantuaanya :D
    terima kasih

    • Error THE FIELD IS TOO SMALL TO ACCEPT THE AMOUNT OF DATA YOU ATTEMPTED TO ADD itu dari data yang mas bro tambahin bukan error dari kode yang menyimpan gambar, coba buka databasenya => kemudian buka tabel yang menyimpan gambar => klik Design View. Nah coba lihat type data masing-masing field. Perkiraan saya pada field Keterangan. Begini aja untuk menguji coba isi datanya seperti ini: ID_Barang=91,Nama_Barang=1,Jenis=ComboBox1.Text,Status=ComboBox2.Text,Umur_Barang=1,Stok=1,Harga=1,Keterangan=1. Setidaknya error yang disebutkan tidak muncul.

      Semoga membantu ;)

  33. bang, klo pke database ms sql server codingnya gmn? saya dah coba berbagai sumber sama yg pny mas ini tp masih eror,,help please.. :(

  34. maaf mas ,,sya pke D2007, DB MS SQL server 2005,
    yg mau saya kasih foto/gambar db karyawan yg fieldnya : nama,tgl,alamat,status,shift

    ni coding delphi untuk tmbol save sya:

    procedure Tf_mkaryawan.CmdsimpanClick(Sender: TObject);
    begin
      qmkaryawan.Close;
      qmkaryawan.SQL.Clear;
      qmkaryawan.SQL.Add('exec tsimpankar :kode,:nama,:tgl,:alamat,:status,:shift');
      qmkaryawan.Prepared;
      qmkaryawan.Parameters.ParamByName('kode').Value:=txtkodekar.Text;
      qmkaryawan.Parameters.ParamByName('nama').Value:=txtnamakar.Text;
      qmkaryawan.Parameters.ParamByName('tgl').Value:=txttgl.Text;
        qmkaryawan.Parameters.ParamByName('alamat').Value:=txtalamat.Text;
      if txtstatus.Checked=true then qmkaryawan.Parameters.ParamByName('status').Value:='1'
      else
      qmkaryawan.Parameters.ParamByName('status').Value:='0';
       qmkaryawan.Parameters.ParamByName('shift').Value:=txtsif.Text;
      qmkaryawan.ExecSQL;
      tampilawal;
      tampildata;
    end;
    

    saya mau tmbh field foto di DB nya, codingnya gmn y mas?:(

  35. mas,punya saya sudah bisa tampil gambarnya,tapi ketika Data di klik misal: ‘A’ yg tdk ada gambarnya ,muncul gambar data si ‘B’
    yg ada gambarnya,
    biar waktu klik data yg tdk ada gambarnya trus di Timage nya gambarnya kosong gmn y?

    • Coba begini:

      // tambahkan ini sebelum menampilkan gambarnya
      Image1.Picture:=nil;
      // dst.... kode untuk menampilkan gambar
      

      Yang sebelumnya apa masalahnya? kok sekarang udah bisa tampilkan gambar?

      • ok mas dah bisa..

        iya tadi yg bagian ini Stream := TADOBlobStream.Create(ADOQuery1gambar,bmRead);

        adoquerynya saya ganti pake

        Stream := TADOBlobStream.Create(ADOStoredProc1foto,bmRead);

        soalnya saya kan pake stored procedure di sql

        makasih ya mas,blog nya sangat menginspirasi :D

      • Wah senang mendengarnya kalau masalahnya udah terselesaikan. Oke deh selamat melanjutkan dan terimakasih juga atas motivasinya ;)

  36. mas saya masih dapat kendala, erornya kayak gini : “Data Type Mismatch in criteria expression” itu kira2 apa lagi yah.?

    saya mau tanya mas kalau di tampil data :
    procedure TForm1.tampildata();
    begin
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.text := ‘select * from tb_foto’;
    ADOQuery1.Active:=true;
    DBGrid1CellClick(DBGrid1.Columns[0]);
    end;

    itu Columns [0]nya itu memang nol atau mengikuti field pada columns foto databasenya mas.?
    dan untuk type field foto pada databasenya itu OleObject atau text.? karena saya lihat di tutor yang satunya fieldnya “TEXT”.
    makasih mas mohon bantuannya :D

  37. mas saya masih dapat eror “Data type mismatch in criteria expression”
    kira2 apa yah.?

    trus pada procedure tampil data
    procedure TForm1.tampildata();
    begin
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.text := ‘select * from tb_foto’;
    ADOQuery1.Active:=true;
    DBGrid1CellClick(DBGrid1.Columns[0]);
    end;

    pada (DBGrid1.Columns[0]); itu columnsnya[0] mengikuti field foto columnsnya atau tetap o.?

    trus saya mau tanya lagi pada type field foto pada databasenya itu OleObject atau text.? karena saya lihat tutor yang satu fieldnya text.
    terima kasih, mohon bantuannya :D

  38. newbie mau nanya mas, tipe data pada databasenya buat field fotonya apaan ya mas..?

  39. mas sori nih ikut nimbrung. saya mau tanya. saya buat program mau simpan grafik (foto) ke database paradox. saya pakai delphi 7 tapi kok yg grafiknya ga masuk ke tabel.

    Ini sourcenya:
    procedure simpan;
    begin
    with DM.Tbarang do
    with Finputbarang do
    begin
    fieldbyname (‘kode’).AsString:=edkode.Text;
    fieldbyname (‘nama_barang’).AsString:=ednama.Text;
    fieldbyname (‘kategori’).AsString:=cbkategori.Text;
    fieldbyname (‘harga’).AsString:=edharga.Text;
    fieldbyname (‘satuan’).AsString:=cbsatuan.Text;
    FieldByName(‘foto’).Assign(DBImage1.Picture);
    post;
    refresh;
    DM.Tbarang.Active:=false;
    DM.Tbarang.Active:=true;
    end;
    end;

    yg saya tanyakan kok yg tipe string masuk semua (kode, nama barang, kategori, dll) tapi kok yg grafik ga masuk ke tabel ya? apa salah di perintahnya? mohon bantuannya ya mas….

    • Saya kurang paham juga ya untuk database paradox, khusus buat tutorial saya ini tidak menggunakan DM(Data Module) sedangkan maskan pke DM, jadi alangkah baiknya mas ikutin tutorialnya dari awal dengan membuat form percobaan untuk database paradox.

  40. mas pngn nanya, sya msih newbi, jdi krang mngrti. maksd dri “(:p0, :p1);” itu apa?
    sya remake lgi app mas d ats (g pke dbgrid+d database nya sya cman bikin table yg isinya cman ad field Gambar).
    mohon bantuanya.

  41. Mas Ivo, luar biasa akhirnya saya dapat referensi yang sesuai setelah obrak-abrik google. :D

    Saya pake db Firebird + UIB. Tapi macet di parameter untuk insert blob pic-nya. Ini dia codenya:

    with UIBQuery1 do
    try
    SQL.Clear;
    SQL.Add(‘INSERT INTO EMPLOYEE’);
    SQL.Add(‘(ID, NAME, PIC)’);
    SQL.Add(‘VALUES’);
    SQL.Add(‘(:ID, :NAME, :PIC)’);
    params.AsInteger[0] := StrToInt(edtID.Text);
    params.AsString[1] := edtName.Text;
    // How to give a param for blob here?
    Execute;
    Transaction.Commit;
    bsSkinMessage1.MessageDlg2(‘Has been saved.’,’New Record’,mtInformation,[mbok],0);
    except
    Transaction.RollBack;
    raise;
    end;

    Gimana ya mas? Saya bingung sampai sakit kepala mikirin ini, soalnya setelah parameter ga ada member lagi utk dimasukkin valuenya. Saya tanya ke forum di luar negeri pun belum ada yg tau. Help me mas ivo.

    • Pertama, pastikan databasenya support type data blob. Kemudian mas ikutin langkah-langkah seperti tutorial yang saya tulis di atas.
      Kalau bisa mas ubah querynya seperti ini:
      UIBQuery1.Close;
      UIBQuery1.SQL.Clear;
      UIBQuery1.SQL.Text := ‘INSERT INTO EMPLOYEE (id,name,foto) values (:p0, :p1, :p2)’;
      UIBQuery1.Parameters[0].Value := StrToInt(edtID.Text);
      UIBQuery1.Parameters[1].Value := edtName.Text;
      UIBQuery1.Parameters[2].LoadFromStream(gambar,ftBlob);
      UIBQuery1.ExecSQL;

      • Terima kasih banyak Mas Ivo atas responnya.

        Khusus untuk UIBQuery parameternya tidak bisa dibuat seperti ini mas: “UIBQuery1.Parameters[0].Value” sebab syntax yang diterima hanya “Params” saja. Alternatifnya: “UIBQuery1.Params.ByNameAsString['p0'] := StrToInt(edtID.Text);” selain yang saya tuliskan di atas. Dan, setelah Params tidak ada lagi membernya, termasuk LoadFromStream, dsb. Ini yang bikin saya stucked berat.

        Saya coba jadi seperti ini: TBLOBField(Params.ByNameAsString['PIC']).LoadFromStream(gambar); bisa running tapi saat dieksekusi ACCESS VIOLATION. Duh, saya benar² nyerah ga punya clue lagi… :(

        Help me please, Mas Ivo..

      • UIBQuery itu komponen apa?

        Kalau komponen dari mydac seperti ini:
        MyQuery1.Close;
        MyQuery1.SQL.Clear;
        MyQuery1.SQL.Text := ‘insert into tb_foto (nama,gambar) values (:p0, :p1)’;
        MyQuery1.Params[0].Value := Edit1.text;
        MyQuery1.Params[1].LoadFromStream(gambar,ftBlob);
        MyQuery1.ExecSQL;

      • UIB = Unified Interbase, mas. Websitenya: http://sourceforge.net/projects/uib/

        Cuma entah kenapa sayangnya uncontinued padahal bagus en lumayan stabil. Situs pembuatnya http://www.progdigy.com

        Kalau mas Ivo berkenan, mungkin bisa coba download dan mencoba. Tapi kalau mas Ivo sibuk gpp kok mas, mungkin saya harus pakai cara alternatif aja selain pakai blob atau kemungkinan terburuk ganti komponen, wah wes kadung setengah jalan je. Hik… hik… ;(

  42. om,makasih banyak niih share sangat membantu skali ..tambah smngat niih ngodingnya :D

    skedar share untuk temen” yg kesulitan untuk menympan gambar kapasistas besar dengan MYSQL,
    kita kasih perintah sql=’set global max_allowed_packet=10000000000′
    bisa diatur brapa kapasitas foto yg bsa kita simpan ke Mysql ..

    cm ada satu masalah niih om,,saya udah bisa simpan gambar ,cm ketika ada sudah tersimpan..saya run project lagi ada
    “error Jpeg #53″

    btuh pncerahan niih,,trima kasih :)

  43. Saya sudah download komponen UIB-nya dan coba instal, tapi ada sedikit masalah. Selain itu sya jga tidak menginstal db Firebird. Menurut saya kalau memang perlu ganti komponen saja, dan ikuti panduan saya di tutorial, kalau mas mau lihat alternative penyimpanan gambar di delphi silahkan lihat tutorialnya di http://catatanbelajar.com/2012/11/alternatif-menyimpan-gambar-dengan-delphi-7/

  44. …..
    GambarBmp := TBitmap.Create;
    Stream := TADOBlobStream.Create(ADOQuery1gambar,bmRead);
    disini saya error mulu
    akhirnya nyoba
    …..

    …..
    GambarBmp := TBitmap.Create;
    Stream := TADOBlobStream.Create(adoquerymaster.fieldbyname(‘foto’)as TBlobField,bmRead);
    …..

    sudah bisa
    makasi ilmu nya yang di share bung Ivo :)

  45. Kalo untuk mencetak data gambarnya gimana caranya ya … ?

    • Masih belum saya bahas, pake quick report mungkin bisa.

      • Alhamdulillah sudah menemukan .. mas, saya menggunakan Revo, komponen yang digunakannya menggunakan Bitmap Componen terus setting DataView dan DataField nya ..

      • Saya dulu pernah pake seagate crystal report klo gak salah, masalahnya udah lama juga jadi lupa. Sekarang saya enggak fokus ke pemrograman desktop tetapi ke pemrograman website. Makanya saya buat tutorial ini simpan gambarnya format bmp(bitmap) supaya bisa tampil dalam report.

  46. mas.. mhon pncrahan sedikit tntang mengganti foto yang udah tersimpan ke database..

    mksh mas..

  47. permisi pak idam…sy mau nanya nih…sy kan buat program yg menggunakan fitur memo nih…saat sy coba buat gabungin program sy dengan fitur quickreport, record memo yang ada di database tu ngk muncul normal…sebagai contoh sy punya 3 record di database setelah sy tekan tombol print yang muncul di quickreport tuh malah memo yg di record pertama…dan terus menerus sampai ke record ke 3…tp sy heranx cuma field memox aja yg kyk gitu kalau field lain munculx normal mulai dari record 1 sampai ke 3…mohon pencerahanx mas

  48. pak kok program delphi yg sy buat gk mau running…[Fatal Error] Could not create output file ‘D:\Document\Praktikum Basis Data\Software Log Book \Project1.exe’

    • Itu pake window 7 kyknya ya?

      Langkah-langkah berikut ini adalah cara mengatasinya.
      1. Kita tutup dulu semua jendela program Delphi 7;
      2. Lalu buka deh tuh folder C:\Program Files\Borland\Delphi7\Bin
      3. Cari file application yang bernama delphi32 (biasanya berukuran 533 kB)
      4. Klik kanan pada file tersebut, pilih Properties, buka tab Compatibility dan beri tanda centang (√) pada kotak Run this program as an administrator, kemudian klik OK

  49. Terima Kasih Banyak atas Tutorialnya Mas. Bener2x membantu banget Buat TA saya.

    Semoga Tambah Maju jaya untuk kita semua.

  50. @bro, qu udah kirim email tuh gan..

  51. mas saya mau tanya ni …kok waktu mau active kan true di property ADOQuery1 muncul error missing sql property ya … mohon bantuannya

  52. terimakasih sudah mau berbagi saya selalu mengikuti tulisan bang Ivo, jarang ada orang yang mau berbagi seperti abang, Bravo bang….

Tinggalkan Balasan