Gibt es einen Ausfallschutz, um eine Delphi-Steuerelement freizugeben?
Ich habe eine TStringGrid-Abstammung, in der ich ein benutzerdefiniertes Steuerelement "einbetten", um einen Editor vor Ort zu erstellen. Wenn der Benutzer innerhalb der Zellen des Rasters über die Tabulator- oder Pfeiltasten navigiert, muss ich ein dynamisches Steuerelement erstellen, wenn die Zelle bearbeitbar ist. Ich habe die erforderlichen Ereignisse verknüpft und nutze das OnKeyDown-Ereignis meines benutzerdefinierten Steuerelements, um die Navigationsbefehle an das übergeordnete TStringGrid zurückzugeben.
Zuvor würde die TStringGrid-Nachkommenschaft einfach FreeAndNil auf dem eingebetteten Steuerelement aufrufen, aber unter bestimmten Umständen könnte dies zu Zugriffsverletzungen innerhalb von UpdateUIState/GetParentForm führen. Beim Blick auf den Aufrufstapel scheint es, dass manchmal nachdem das Steuerelement freigegeben wurde, trotzdem eine WM_KEYDOWN (TWinControl.WMKeyDown)-Nachricht auftrat.
Ich habe bereits die diskutierten Änderungen unter Wie kann ein Steuerelement innerhalb seines Ereignishandlers freigegeben werden? angesehen und umgesetzt. Dies scheint das Problem gelöst zu haben, aber ich frage mich, ob es noch andere Fallstricke bei diesem Ansatz gibt.
Im Grunde genommen hat dieser Workaround die Zerstörung des Steuerelements einfach verzögert, bis nachdem alle bestehenden Nachrichten in der Warteschlange zum Zeitpunkt der Postung der CM_RELEASE-Nachricht verarbeitet wurden.
Wäre es nicht möglich, dass nachdem CM_RELEASE gepostet wurde, eine andere WM_KEY* oder ähnliche Nachricht bereits in die Nachrichtenwarteschlange gepostet wurde?
Mein aktueller CM_RELEASE-Handler sieht wie folgt aus:
Verfahren TMyCustomControl.HandleRelease(var Msg: TMessage);
begin
Frei;
end;
Wird dies also in allen Fällen sicher sein oder sollte ich etwas unternehmen, um andere Nachrichten aus der Warteschlange zu löschen? ( SendMessage(Self.Handle, WM_DESTROY, 0, 0) fällt mir ein )