Mega Code Archive

 
Categories / Delphi / OOP
 

[] Tstringlist,tstrings,tmemorystream

// makaleler bölümünden alıntıdır. Görsel olmayan bileşenlerden olan bu üç componenui er geç programlarımızda kullanma ihtiyacı duyacağız. Tstringlist Tstrings Componentinden türetilmiştir. Tstrings programlama sırasında asla doğrudan kullanılmaz. Mutlaka create edildikten sonra free edilmesi gerekir. Bunu garantilemenin en güzel yolu try...finally blokları arasında kullanmaktır. Aşağıdaki prosüdürü inceleyiniz: procedure TForm1.Button1Click(Sender: TObject); var TempList: TStrings; { declare the list } begin TempList := TStringList.Create; {Buraya dikkat Tstrings Kullanmıyoruz.} try { use the string list } finally TempList.Free; { destroy the list object } end; end; Tstringsi bütün program boyunca kullanacaksak FormCreate olayı ile yaratıp FormDestroy olayı ile hafızadan atmalıyuz.aşağıdaki uniti inceleyiniz. unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; {For CLX: uses SysUtils, Classes, QGraphics, QControls, QForms, Qialogs;} type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } public { Public declarations } ClickList: TStrings; { declare the field } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin ClickList := TStringList.Create; { construct the list } end; procedure TForm1.FormDestroy(Sender: TObject); begin ClickList.SaveToFile(ChangeFileExt(Application.ExeName, '.LOG')); { save the list } ClickList.Free; { destroy the list object } end; procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ClickList.Add(Format('Click at (%d, %d)', [X, Y])); { add a string to the list } end; end. Sıra geldi,Tstrings ile Tmemorystream arasındaki ilişkiye. Tstrings'in savetofrom, LoadfromStream özelliklerini kullanabilmek için TmemoryStream componentine ihtiyaç duyacağız. aşağıdaki örneği inceleyiniz. procedure TForm1.Button1Click(Sender: TObject); var TempStream : TMemoryStream; begin TempStream := TMemoryStream.Create; ListBox1.Items.SaveToStream(TempStream); // Satýrlarý hafýzaya attýk. //Herhangi bir satýra doðrudan ulaþmak þimdilik imkansýz. TempStream.Position := 0; //LoadFromStreamdan önce bunu mutlaka yapýn. //Poziyon hafýzaya yüklenen bayt kadar arttý. RichEdit1.Lines.LoadFromStream( TempStream); // Richedit.lines bir Tstring soyundan töreyen //Tstringlist componenti. TempStream.Free; end; Şimdi biraz James Bondculuk oynayalım ve bir bitmapın içine yazı gömüp sonrada bu yazıyı tekrar elde edelim. Forma iki Tbitmap, iki Tbutton, bir Tmemo ekleyin.image1 normal resmi, image2 içinde yazı olan resmi gösterecek. Buttonların onclik olayına aşağıdaki prosüsüdürleri yazın.Resmimiz en az 20.000 bayt olsun. Button1 her iki resmi gösterecek, button2 Stringi memo1e ekleyecek. procedure TForm1.Button1Click(Sender: TObject); var ms1,ms2:Tmemorystream; strlist:Tstrings; Bitmap: TBitmap; begin MS1 := TMemoryStream.Create; MS2 := TMemoryStream.Create; strlist:= TStringList.Create; Bitmap := TBitmap.Create; try ms1.LoadFromFile('C:\resimler\resmim.bmp'); bitmap.LoadFromStream(ms1); image1.Picture.Graphic:=bitmap;//imga1.picture.assign(bitmap) da oluyor. strlist.Add('Ben Sana ne dedim!'); strlist.Add('sen ne anladın.'); strlist.SaveToStream(ms2); ms2.Position:=0; ms1.Position:=10000; ms1.CopyFrom(ms2,0); ms1.Position:=0; bitmap.LoadFromStream(ms1); image2.Picture.Graphic:=bitmap; finally ms1.Free; ms2.Free; strlist.Free; bitmap.Free; end; end; procedure TForm1.Button2Click(Sender: TObject); var ms1:Tmemorystream; Bitmap: TBitmap; buffer:PChar; MemSize: Integer; x:integer; begin MS1 := TMemoryStream.Create; MS2 := TMemoryStream.Create; Bitmap := TBitmap.Create; MemSize := 37;//son karekter #0 olsunki stringin bittiğini anlasın. Buffer := AllocMem(MemSize); {Hafızada 38 baytlık yer ayır.Dikkat 0,1..37 diye gidiyor.} memo1.clear; try bitmap.Assign(image2.Picture.Graphic);//image2'deki grafiği bitmapa yükle bitmap.SaveToStream(ms1); ms1.Position:=10000;//Stringimizin başladığı pozisyona gel. ms1.Read(Buffer^,memsize);//Streamdan 37 baytı buffere oku. Memo1.SetTextBuf(Buffer); //Bufferdeki bilgiyi göster. finally FreeMem(Buffer, MemSize);//mutlaka hafızadan atılmalı ms1.Free; bitmap.Free; end; end;