2011 m. kovo 21 d., pirmadienis

Delphi. How to free dynamically created components at runtime?

Form1+Panel2+Image1. Dinamiškai: ant Image1 sukuriamas TImage Image_x.., jame pavaizduojamas GIF'as, Image_x..'ui prikabinamas TPopumMenu su eilutėmis ADD,FREE.

TForm1 = class(TForm)
...
Panel2: TPanel;
Image1: TImage;

PopupMenu1: TPopupMenu;
ADD: TMenuItem;
FREE: TMenuItem;
procedure ADDClick(Sender: TObject);
procedure FREEClick(Sender: TObject);

//Su MouseMove pastoviai atsimename peliuko koordinates:
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);

// Šita procedūra nustato, kuris TImage paspaustas:
procedure OnImageClick(Sender: TObject);

private
Im_W,Im_H,
mouseX,mouseY:integer; //peliuko koordinatės
foto_Last:TImage;
foto_Last_name:string;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
begin
mouseX:=X;
mouseY:=Y;
end;

//Dinaminis TImage (idedame ir 24x24 GIF'ą)sukūrimas:
//'meniu ADD' eilutės kodas:

procedure TForm1.ADDClick(Sender: TObject);
var
Code:integer;
s1,s2:string;
begin
with TImage.Create(Panel2) do
begin
Enabled:=false;
str(mouseX:4,s1);
str(mouseY:4,s2);
//Vardas suteikiamas automatiškai, bet galima ir taip:
name:='Image_x'+trim(s1)+trim(s2);
parent:= Panel2;
Width:=24;
Height:=24;
Top:=mouseY-12; // patrauktas per pusę GIF'o
Left:=mouseX-12;
Picture.LoadFromFile('..\RESOURCE\GIF\24x24red.gif');
Visible:=true;
OnClick:=OnImageClick;
Enabled:=true;
end;


procedure TForm1.OnImageClick(Sender: TObject);
var
foto:Timage;
begin
//kuris GIF-as paspaustas?:
foto := Sender as TImage;
//atsimenam paspasta GIF'ą
foto_Last:=foto;
foto_Last_Name:=foto.Name;
//is kart iskviečiam meniu - kairio pelės mygtuko paspaudimas
Popupmenu1.Popup(mouseX+Form1.Left+12,mouseY+Form1.Top+12);
end;

Naikinimas:
//Popupmenu1 meniu eilutės FREE kodas:
// (Owner).ComponentCount.
// Form1 turi panel2, be jo būtų Owner'is būtų Form1.ComponentCount

procedure TForm1.FREEClick(Sender: TObject);
var
x:integer;
begin
for x := 0 to (panel2.ComponentCount -1) do
begin
if (panel2.Components[x].Name=foto_last_Name) then
begin
TImage(Panel2.components[x]).free;
exit;
end
end;
end;

Komentarų nėra: