Autodestrukcja komponentu

0

Witam!
Czy jest możliwe wykonanie takiej operacji, aby jakiś button, po kliknięciu na niego, sam się usunął?
Oczywiście przy próbie usunięcia przez ten komponent samego siebie otrzymuję "Access Violation".

0

Twój Button musi mieć nadaną jakaś sensowną nazwę i jak odwołasz się do konkretnej formatki to nie
będzie błędu "Access Violation". Przynajmniej taki kod jak poniżej działa prawidłowo i przycisk "znika":

begin
  with Sender as TButton do
    begin
    TButton(Form1.FindComponent(Name)).Free;
    end;
end;
0

Faktycznie w Delphi działa, ale w Lazarusie bez zmian :/

0
olesio napisał(a)
begin
  with Sender as TButton do
    begin
    TButton(Form1.FindComponent(Name)).Free;
    end;
end;

Aleś nalał wody:

begin
  Sender.Free();
end;

powinno zadziałać w Lazarusie, jeśli nie, to jeszcze możesz wywalić ją z dzieci parenta

begin
  TButton(Sender).Parent.RemoveControl(TButton(Sender));
  FreeAndNil(Sender);
end;

Obiekt nie może zniszczyć sam siebie, bo po wykonaniu Free potrzebuje wyjść z metody, a to akurat wymaga kilku odwołań do zwolnionej pamięci, czyli wymaga istnienia obiektu. Olesio podał zły przykład (ale działający), bo obiekt jest niszczony w metodzie innego obiektu. Działa, ale nie tak jak byś tego chciał. Jednak inaczej się nie da.

0

Taki kod powoduje, że Button znika:

begin
  TButton(Sender).Parent.RemoveControl(TButton(Sender));
end;

Ale po dodaniu "FreeAndNil(Sender)" wywale AccessViolation. A bez tego pewnie nasz niewidoczny Button dalej żre pamięć...
Z poleceniem "FreeAndNil" przy Buttonie może nie dać rady, bo on chce się jeszcze odświeżyć po podniesieniu przycisku myszy.

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