Bagian 2: Menggunakan DBImage untuk mengekstrak JPEG—dengan cara yang salah
DBImage - ambil satu (DBImage - ambil satu)
Saat mencoba melakukan sesuatu yang baru dengan Delphi, hal pertama yang saya lakukan adalah meminta bantuan bawaan Delphi untuk mengetahui suatu metode. Inilah yang akan dijawab oleh dokumentasi bantuan: TDBImage (di halaman Kontrol Data pada Palet Komponen) mewakili gambar grafis dari bidang BLOB dalam catatan database saat ini. Gunakan TDBImage untuk mewakili nilai bidang grafis. TDBImage memungkinkan formulir untuk menampilkan data grafis dari database. TDBImage hanya memiliki lebih banyak properti visibilitas data daripada komponen TImage. Dua properti terpenting adalah: DataSource (sumber data) dan Field (bidang). Properti DataSource menghubungkan komponen grafis ke database. Di formulir kami ada komponen DataSource bernama DataSource1 - yang mewakili kumpulan data. Properti Bidang menunjukkan bidang (dalam tabel) yang menampung gambar.
Semuanya sudah jelas, sekarang tempatkan komponen DBImage pada form dan beri nama DBImage1 secara default. Untuk benar-benar menghubungkan DBImage ke bidang BLOB pada tabel, kita hanya perlu melakukan konfigurasi berikut (menggunakan Object Inspector):
DBImage1.DataSource = Sumber Data1
DBImage1.Field = Gambar
Ini adalah trik yang diperlukan untuk menampilkan gambar JPEG yang ada di bidang Gambar pada tabel aplikasi.
Untuk memverifikasi bahwa konfigurasi ini berfungsi, satu-satunya hal yang perlu kita lakukan adalah mengatur properti Aktif komponen ADOTable1 ke True. Kita bisa melakukannya di Object Inspector selama desain. Setelah Anda melakukan ini, kotak dialog berikut akan muncul:
Apa? Mengapa muncul pesan "Gambar bitmap tidak valid"? Kami memiliki gambar JPEG dan bukan gambar BMP - apakah itu masalahnya? Ayo kembali untuk membantu.
Setelah beberapa saat mengklik bantuan, saya sampai pada kesimpulan: untuk mendapatkan gambar JPG di database, kita harus menggunakan objek TJpegImage. Untuk menampilkan gambar, kita memerlukan versi komponen Gambar yang sederhana dan tidak terlihat. Pada saat yang sama, kita perlu menggunakan aliran untuk memuat gambar dari objek BLOB. Deskripsi dokumen bantuan: Kita harus menggunakan TADOBlobStream untuk mengakses atau mengubah nilai bidang BLOB atau memo (catatan) di kumpulan data ADO.
Bagian 3: Menggunakan aliran untuk mengekstrak JPEG—metode yang salah
Menarik JPEG - ambil dua!
Karena kita tidak dapat melakukan apa pun dengan DBImage - hapus dari formulir dan masukkan komponen TImage biasa (halaman tambahan) bernama ADOImage. Sayangnya, komponen Image tidak memiliki properti data-aware, sehingga diperlukan program terpisah untuk menampilkan gambar dari tabel database yang diwakilinya. Cara termudah untuk mencapai hal ini adalah dengan menempatkan Tombol pada formulir, meletakkan semua kode program dalam acara OnClick, dan memberi nama tombol: "btnShowImage".
Untuk menggunakan ADOBLOBStream, dokumentasi bantuan merekomendasikan pembuatan instance TADOBlobStream, menggunakan metode "stream" untuk membaca bidang grafik dari kumpulan data, dan kemudian melepaskan aliran BLOB. Di tengah-tengah, kita perlu memuat gambar JPEG dari objek TADOBlobStream menggunakan metode LoadFromStream. Properti Gambar dan Grafis dari komponen Gambar akan digunakan untuk menyimpan dan menampilkan gambar.
Objek lapangan, apa itu?
Pada titik ini, saya berasumsi bahwa sedikit pengetahuan tentang objek lapangan sudah lebih dari cukup bagi Anda untuk menguasai bab ini. Dalam pengembangan database Delphi, salah satu objek utamanya adalah objek TField. Komponen bidang adalah objek non-visual yang mewakili bidang kumpulan data pada waktu proses (atau desain). TADOTable (dan subkelas TDataSet lainnya) menyediakan akses waktu desain ke Editor Bidang. Editor Bidang memungkinkan Anda memilih bidang yang ingin Anda sertakan dalam kumpulan data. Lebih penting lagi, ini membuat daftar lengkap komponen bidang yang digunakan dalam kumpulan data aplikasi. Untuk memanggil Fields Editor, klik dua kali komponen TADOTable. Secara default, daftar bidang kosong. Klik tombol Tambah untuk membuka kotak dialog yang mencantumkan bidang tabel Aplikasi. Secara default, semua bidang dipilih, lalu pilih OK.
Delphi akan memberikan nama default field sebagai berikut: Nama tabel (tabel) + Nama field (bidang). Ini berarti bidang gambar kita diberi nama: ADOTable1Picture.
Metode Create pada TADOBlobStream membuat instance untuk membaca atau menulis objek bidang BLOB tertentu, dalam hal ini bidang ADOTable1Picture.
Kami menulis kode program di acara OnClick pada tombol btnShowImage. Kode ini akan membaca gambar dari kolom Gambar pada baris yang dipilih saat ini. Kode sumbernya adalah sebagai berikut:
menggunakan jpeg;
...
Prosedur TForm1.btnShowImageClick(Pengirim: TObject);
var bS: TADOBlobStream;
foto: TJpegImage;
mulai
bS := TADOBlobStream.Buat
(AdoTable1Picture, bmRead);
mencoba
Gambar:=TJpegImage.Buat;
mencoba
Gambar.LoadFromStream(bS);
ADOImage.Picture.Graphic:=Gambar;
Akhirnya
Gambar.Gratis;
akhir ;
Akhirnya
bS.Gratis
akhir ;
akhir ;
Oke, mari kita jalankan proyek ini. Tentu saja, atur properti ADOTable1.Active ke True. Setelah formulir ditampilkan, klik tombol tersebut dan akan muncul tampilan berikut:
Eh, apa yang terjadi? Kodenya 100% benar tetapi mengapa gambarnya tidak muncul? Ingat "jangan pernah menyerah, jangan pernah menyerah"! Mari menelusuri hingga ke level byte dan melihat apa yang terjadi!