Usuwanie komponentów

0

Witam! Jeszcze raz ja ;)

Napisalem instrukcej do tworzenia dynamicznego Menu wyglada tak:

procedure TForm1.Edit1ContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean);
const
N = 4;
Tab : Array[1..N] of String[10] = ('WYTNIJ','KOPIUJ','WKLEJ','ZAZNACZ');
var
Punkt : TPoint;
PopUpMenu : TPanel;
Button1 : TSpeedButton;
i, y : Byte;
begin
If FindComponent('PopUp')<>nil Then Schowaj;
Handled := True;

GetCursorPos(Punkt);
Send:=Sender;

y:=0;

//Tworzenie panelu na ktorym beda przyciski
PopUpMenu:=TPanel.Create(Self);
PopUpMenu.Left:=Punkt.X-Form1.Left-26;
PopUpMenu.Top:=Punkt.Y-Form1.Top-26;
PopUpMenu.Name:='PopUp';
PopUpMenu.Parent:=Dod_Mod_Inf;

For i:=1 To 4 Do
Begin
Button1:=TSpeedButton.Create(Self);
Button1.Width:=80;
Button1.Height:=22;
Button1.Left:=0;
Button1.Name:='Pop'+IntToStr(i);
Button1.Top:=y;
Button1.Caption:=Tab[i];
Button1.Parent:=PopUpMenu;

  y:=y+24;
end;

PopUpMenu.AutoSize:=True;
PopUpMenu.Refresh;

TSpeedButton(Self.FindComponent('Pop1')).OnClick:=Wytnij;
TSpeedButton(Self.FindComponent('Pop2')).OnClick:=Kopiuj;
TSpeedButton(Self.FindComponent('Pop3')).OnClick:=Wklej;
TSpeedButton(Self.FindComponent('Pop4')).OnClick:=Zaznacz;
end;

I Teraz Procedury Wytnij kopiuj wklej zazancz wygladaja mniej wiecej tak:

Procedure TForm1.Kopiuj(Sender : TObject);
begin
TEdit(Send).CopyToClipboard;
Schowaj;
end; ....

i wlasnie problem tkwi w procedurze Schowaj, kiedy np klikne Zaznacz wyrzyca mi blad: Access Viloation procedura wyglada tak:

procedure TForm1.Schowaj;
var
i : Byte;
Begin
For i:=1 To 4 Do
Begin
TSpeedButton(Self.FindComponent('Pop'+IntToStr(i))).Parent:=Nil;
TSpeedButton(Self.FindComponent('Pop'+IntToStr(i))).Free;
end;
TPanel(Self.FindComponent('PopUp')).Parent:=Nil;
TPanel(Self.FindComponent('PopUp')).Free;
end;

Co tu jest nie tak?? prosze o pomoc.

Zauwazylem jedna wazna rzecz, ze np jak kliknie sie Zaznacz i petle FOR w procedurze schowaj zrobi sie od 1 do 3 to wparwdzie ten przycisk Zaznacz nie znika ale wtedy nie pojawia sie blad.</b>

0

Znalazlem, informacje w pomocy delphi, ze nie mozna zwalniac komponentu z ktorego zostala wywolana procedura :( I dlatego pojawia sie blad kiedy cos klikne.

Ma ktos pomysl jak mozna by to bylo obejsc ?? na razie robie Visible false ale to nie jest zbyt dobre rozwiazanie.

0

robie Visible false ale to nie jest zbyt dobre rozwiazanie.

Dlaczego nie?

P.s. Koloruj składnię kodu w postach.

0

Dlaczego nie?

Bo jak stworze te menu i wybiore jakas opcje to to mi tylko zniknie a nie zwolni pamieci, wiem ze to maly bol ;) bo jak drugi raz wywoalam to menu to sie usunie to pierwsze i stworzy sie nowe, ale zawsze cos to zajmie ;)

PS: Mam jeszcze jedno pytanie, da sie zrobic jaks taka globalna procedure, ze jak sie kliknie poza to menu to sie zwolni pamiec ??, bo nie chcĘ do kazdego komponentu dawac dodatkowej komendy w OnClick na zwolnienie :(

Dzieki, za pomoc.</quote>

1 użytkowników online, w tym zalogowanych: 0, gości: 1