// 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;