Hubungan pewarisan TMemoryStream adalah sebagai berikut
Objek
|
aliran TS
|
Aliran Memori Khusus
|
Aliran Memori
Bagaimana cara menggunakan TMemoryStream?
Faktanya, TmemoryStream digunakan seperti TStream.
Untuk atribut dan metode tertentu, silakan lihat bantuan.
Berikut ini contohnya:
Apa yang harus saya lakukan jika saya ingin membaca dan menulis Bitmap langsung di memori?
TmemoryStream banyak membantu Anda
var
BitmapMemoryStream:TMemoryStream;
Bitmap1:TBitmap;
Prosedur TForm.Button1Click(Pengirim:TObject);
mulai
BitmapmemroyStream:=TmemoryStream.Buat; file://Buat MemoryStream
Bitmap1:=TBitmap.Buat;
mencoba
Bitmap1.LoadFromFile('d:Bitmap1.bmp');
kecuali
ShowMessage('Kesalahan Pada LoadFile bitmap1.bmp');
akhir;
akhir;
procedure TForm.Button2Click(Sneder:Tobject);
mulai
jika Ditugaskan (Bitmap1) lalu
Bitmap1.SaveToStream(BitmapmemoryStream);
akhir;
prosedur TForm.Button3Click(Pengirim:TObject);
mulai
jika BitmapMemoryStream<>nihil maka
mulai
mencoba
BitmapMemroyStream.SaveToFile('Bitmap1.str'); file://penyimpanan aliran memori, ukuran dan
file://Bitmap1.bmp sama
kecuali
showmessage('kesalahan pada memori akses!');
akhir;
akhir;
akhir;
prosedur TForm.Button4Click(Pengirim:TObject);
var
Buffer:Array[0..53] dari char;
mulai
jika Ditugaskan(BitmapMemroyStream) lalu
mencoba
BitmapMemroyStream.Seek(0,soFromBeginning);
BitmapMemoryStream.Baca(Buffer,54);
jika Buffer[0]='B' dan Buffer[1]='M' maka file://rewrite konten memori
mulai
BitmapMemoryStream.Seek(0,soFromBeginning);
BitmapmemoryStream.Write('ICE',3);
Button3Click(Sender);//Tulis konten yang ditulis ulang ke file
akhir;
kecuali
ShowMessage('kesalahan Pada Akses memroyStream');
akhir;
akhir;
Anda dapat melihat betapa nyamannya menggunakan TMemoryStream untuk membaca dan menulis memori. Tentu saja, tidak perlu membuat Bitmap terlebih dahulu.
Anda dapat menggunakan LoadFromFile untuk mem-boot file secara langsung, tetapi untuk aliran memori lainnya, Anda dapat menggunakan cara di atas.
Di atas hanyalah pengenalan saja. Untuk fungsi lainnya, Anda dapat membaca bantuan dan mencari tahu sendiri!
Masih banyak objek streaming lainnya, semuanya hampir sama, jadi Anda bisa menggunakan semuanya!
Cara menulis konten aliran ke clipboard dan memprosesnya
Teknik ini dicapai dengan mengacu pada implementasi kelas clipboard Delphi. Masukkan konten aliran ke clipboard,
Pertama, daftarkan format Anda sendiri menggunakan fungsi RegisterClipboardFormat()
Kemudian lakukan tiga langkah berikut:
1. Buat aliran konten dan tulis konten ke dalamnya
2. Buat area konten global dan tulis konten streaming
3. Panggil ClipBoard.SetAsHandle() untuk menulis konten ke clipboard
Tulis konten ke papan klip
var
hbuf :Pegangan;
bufptr : Penunjuk;
mstream: TMemoryStream;
mulai
mstream := TMemoryStream.Buat;
mencoba
{-- Kode untuk memproses aliran --}
hbuf := GlobalAlloc(GMEM_MOVEABLE, mstream.size);
mencoba
bufptr := GlobalLock(hbuf);
mencoba
Pindahkan(mstream.Memory^, bufptr^, mstream.size);
Papan Klip.SetAsHandle(CF_MYFORMAT, hbuf);
Akhirnya
Buka Kunci Global(hbuf);
akhir;
kecuali
GlobalGratis(hbuf);
mengangkat;
akhir;
Akhirnya
mstream.Gratis;
akhir;
akhir;
Harap berhati-hati untuk tidak melepaskan buffer global yang dialokasikan. Pekerjaan ini dilakukan oleh clipboard Saat membaca data
Anda harus menyalinnya dan memprosesnya nanti.
Baca isi clipboard
var
hbuf :Pegangan;
bufptr : Penunjuk;
mstream: TMemoryStream;
mulai
hbuf := Papan Klip.GetAsHandle(CF_MYFORMAT);
jika hbuf <> 0 maka mulai
bufptr := GlobalLock(hbuf);
jika bufptr <> nihil maka mulailah
mencoba
mstream := TMemoryStream.Buat;
mencoba
mstream.WriteBuffer(bufptr^, Ukuran Global(hbuf));
mstream.Posisi := 0;
{-- Kode untuk memproses aliran --}
Akhirnya
mstream.Gratis;
akhir;
Akhirnya
Buka Kunci Global(hbuf);
akhir;
akhir;
akhir;
akhir;
Tips menggunakan TStream untuk membaca dan menulis data di Dephi
Tipe data abstrak TStream disediakan di Dephi untuk mendukung operasi pada streaming data. Data ini biasanya berasal dari file, database, objek memori, objek OLE, dll. TStream menyediakan metode terpadu dan ringkas untuk membaca dan menulis data. Dalam keadaan normal, kita tidak perlu menggunakan kelas TStream secara langsung, dan pembacaan dan penulisan data streaming dikemas dalam metode kontrol VCL. Namun jika metode ini tidak dapat memenuhi persyaratan kami, kami perlu mengontrol sendiri pembacaan dan penulisan data secara manual.
1. Metode dan properti TStream yang umum digunakan:
---- 1. fungsi Baca(var Buffer; Hitung: Longint): Longint virtual;
---- 2. fungsi Tulis(const Buffer; Hitung: Longint): Longint virtual;
---- 3. fungsi Mencari(Offset: Longint; Asal: Word): Longint;
---- 4. Posisi Properti: Longint;
---- 5. Ukuran Properti: Longint
---- Baca, Tulis, dan Cari adalah fungsi virtual murni, yang menyediakan metode abstrak untuk membaca, menulis, dan memposisikan data. Metode Baca membaca data dari Aliran ke dalam Buffer, dan metode Tulis mengimplementasikan operasi sebaliknya. Nilai yang dikembalikan menunjukkan ukuran sebenarnya dari data yang dibaca dan ditulis. Seek menyediakan metode untuk memindahkan penunjuk data di Stream. Parameter Asal dapat mengambil tiga nilai: soFromBeginning, soFromCurrent, dan soFromEnd. Offset adalah offset, dan nilai yang dikembalikan adalah posisi penunjuk data Stream saat ini.
---- Posisi mewakili posisi penunjuk data di Aliran. Properti ini dapat dibaca dan ditulis. Ini sebenarnya diimplementasikan dengan memanggil metode Seek, sehingga lebih mudah untuk menggunakan properti ini dalam penggunaan sebenarnya. Atribut Ukuran menunjukkan ukuran Aliran saat ini. Untuk Aliran yang berbeda, terkadang hanya dapat dibaca.
2. Membaca dan menulis data aliran.
---- 1. SaveToStream(Stream: TStream); file://menulis data di kelas ke posisi Stream saat ini
---- 2. LoadFromStream(Stream: TStream); file://Baca data di Stream dari posisi saat ini
---- Dalam penggunaan sebenarnya, pada dasarnya kita hanya perlu menggunakan dua fungsi di atas.
3. Contoh
---- Diagram pohon warisan TStream ditunjukkan pada Gambar 1 (dihilangkan). Dalam penggunaan sebenarnya, TFileStream, TMemoryStream, dan TblobStream lebih umum digunakan.
---- Buat form Form1, letakkan tiga tombol btnRead, btnInvert, btnSave dan kotak dialog pembuka file OpenDialog1 serta kontrol data DataSource1, Table1, test.
---- Gunakan Database Desktop yang disediakan oleh Dephi untuk membuat tabel tes. Ada bidang Gambar di tabel, dan nama file database disimpan sebagai test.db. Tempatkan dbTest kontrol TDatabase, kontrol TTable Table1, kontrol DataSource DataSource1, dan DBNavigator1 kontrol TDBNavigator pada formulir. Hubungkan dbTest ke database yang baru saja dibuat oleh Desktop, atur properti TableName dari Table1 ke test.db, atur properti DataSet dari DataSource1 ke Table1, atur properti DataSource dari DBNavigator1 ke DataSource1, dan atur empat properti VisibleButtons pertama ke TRUE. Selain itu, atur properti Connected dari dbtest ke TRUE dan properti Active dari Table1 ke TRUE agar database terbuka dari awal.
---- Kode event ditulis sebagai berikut:
---- 1. Klik acara btnRead, di sini menunjukkan penggunaan TFileStream.
var
MS: TFileStream;
mulai
jika OpenDialog1.Jalankan lalu
mulai
MS:=TFileStream.Buat
(OpenDialog1.Nama File, fmOpenRead);
Gambar1.Gambar.Bitmap.LoadFromStream(MS);
MS.Gratis;
akhir;
akhir;
---- 2. Klik acara btnInvert, di sini menunjukkan penggunaan TMemoryStream. Fungsi Invert digunakan, yaitu fungsi sederhana yang membalikkan warna suatu gambar (hanya berlaku untuk gambar berwarna sebenarnya).
var
M
S: Aliran Memori;
gambar: penunjuk;
mulai
MS:=TMemoryStream.buat;
Gambar1.Gambar.Bitmap.SaveToStream(MS);
MS.Posisi:=0;
pImage:=Balikkan(MS.Memori, MS.ukuran);
Atribut file://Memory adalah penunjuk ke blok memori sebenarnya
MS.Write(pImage^,MS.size);
MS.Posisi:=0;
Baris kode sebelumnya di file:// memindahkan penunjuk ke akhir Aliran, sehingga perlu diatur ulang.
Gambar1.Gambar.Bitmap.LoadFromStream(MS);
FreeMem(pGambar);
MS.Gratis;
akhir;
Fungsi Invert adalah sebagai berikut:
fungsi TForm1.Balikkan
(pImage: penunjuk; ukuran: Integer): penunjuk;
var
pData, pMem: PChar;
saya: Bilangan bulat;
mulai
pMem:=AllocMem(ukuran);
CopyMemory(pMem,pImage,ukuran);
pData:=pMem+54;
untuk i:=0 hingga ukuran-54-1 lakukan
mulai
pData^:=Char(bukan bilangan bulat(pData^));
pData:=pData+1;
akhir;
Hasil:=pMem;
akhir;
---- 1. Klik acara btnSave, di sini menunjukkan penggunaan lain dari TMemoryStream, menulis data di Stream ke database.
var
MS: TMemoryStream;
mulai
MS:=TMemoryStream.buat;
Gambar1.Gambar.Bitmap.SaveToStream(MS);
MS.Posisi:=0;
Tabel1.Lampirkan;
file://menambahkan catatan dalam database
TBlobField(Tabel1.FieldbyName
('gambar')).LoadFromStream(MS);
Tabel1.Posting;
file://menulis pembaruan ke database
akhir;
---- 4. Klik event DBNavigator1, di sini mendemonstrasikan penggunaan TBlobStream, menggunakan metode yang berbeda dari menulis hingga membaca data gambar dari database.
var
MS: TSstream;
mulai
dengan Tabel1 lakukan
MS:=BuatBlobStream
(FieldbyName('gambar'),bmRead);
Gambar1.Gambar.Bitmap.
LoadFromStream(MS);
MS.Gratis;
akhir;
Itu saja. Terima kasih telah membaca artikel ini. Saya tidak mempunyai cukup poin untuk digunakan, jadi saya harus mendapatkan sejumlah poin untuk menukarkannya. Jika Anda merasa artikel ini bermanfaat bagi Anda, silakan pilih saya, terima kasih.