Hmm..
Kenne zwar nur
VCL, aber, Du machst IM BtnClick ein Free des Buttons selber, somit können events, welche NACH dem BtnCLick noch kommen könnten gegen einem nicht mehr vorhandenen Button laufen.
Unter
VCL würde ich im BtnClick NUR ein PostMessage absetzen mit dem Index des Eintrages und dann in der Behandlungsroutine den ListBoxEntry löschen.
So ist sichergestellt, dass alle noch zum BtnClick gehöhrenden Events abgearbeitet sind, bevor der Btn selber gelöscht wird.
Ja, genau das ist der Grund, das aufrufende Objekt wird zerstört, bevor das Event, das es ausgelöst hat, abgearbeitet wurde.
Die hier beschriebene Lösungs-Variante mit Postmessage ginge natürlich nur unter Windows. Es ginge aber das allgemeine Messaging (TmessageManager) oder man macht es z.B. so:
Delphi-Quellcode:
procedure TForm46.DelBtnClick(Sender: TObject);
var
lbi: TListBoxItem;
begin
if TFmxObject(Sender).Parent is TListBoxItem then
begin
lbi := TListBoxItem(TFmxObject(Sender).Parent);
lbi.IsSelected := True;
TTask.run (procedure
begin
TThread.Synchronize(NIL, procedure
begin
lbi.free;
ListBox1.ItemIndex := -1;
end);
end);
end;
end;
TTask.Run wird erst nach Beendigung des Klick-Events ausgeführt, dann kann man gefahrlos das Objekt zerstören.