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".
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;
Faktycznie w Delphi działa, ale w Lazarusie bez zmian :/
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.
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.