Delphi-XE5 Android-Entwicklung.Was ist der beste Weg, um nichtmodale Formulare zu befreien?
-
21-12-2019 - |
Frage
In Delphi für Windows gibt es kein Problem zu befreien (Formular.kostenloses) geschlossenes sekundäres dynamisch erstelltes Formular, da where die "ShowModal" -Methode ist.Delphi für Android unterstützt jedoch kein Formular.ShowModal, und wir müssen die Show-Methode verwenden.Aber ich habe herausgefunden, was passiert, wenn ich schließe (Formular.schließen) sekundäres Formular, es befindet sich noch im Speicher und führt sogar Code Onresize-Ereignis aus (???).Was ist der beste Weg, um Formulare im nichtmodalen Aufruf freizugeben?
Mit anderen Worten:Wie schließe ich ein Formular über einen OnClick-Ereignishandler in diesem Formular und stelle sicher, dass der Destruktor des Formulars ausgeführt wird?
Lösung
Update
Siehe wichtiger Hinweis unten.
In XE5 für Android gibt es die Möglichkeit, ein Formular mit modalen Ergebnissen anzuzeigen, ein überladenes ShowModal
verfahren mit einer anonymen Methode:
prozedur ShowModal(Konstante Ergebnisproz:TVERFAHREN);überladen;
Sie finden es in diesem Artikel von Marco Cantu beschrieben, Delphi XE5 Anonymous ShowModal and Android
.
Hier ist das Beispiel für die Verwendung dieses Verfahrens:
var
dlg: TForm1;
begin
dlg := TForm1.Create(nil);
// select current value, if avaialble in the list
dlg.ListBox1.ItemIndex := dlg.ListBox1.Items.IndexOf(Edit1.Text);
dlg.ShowModal(
procedure(ModalResult: TModalResult)
begin
if ModalResult = mrOK then
// if OK was pressed and an item is selected, pick it
if dlg.ListBox1.ItemIndex >= 0 then
edit1.Text := dlg.ListBox1.Items [dlg.ListBox1.ItemIndex];
dlg.DisposeOf; // Wrong !!!, see note below
end);
Beachten Sie, dass die dlg.DisposeOf;
erzwingt die Zerstörung des Formulars und überschreibt die automatische ARC-Behandlung.
Eine Beschreibung finden Sie auch in der Dokumentation, Using Modal Dialog Boxes in Mobile Apps
und hier, ShowModal Dialogs in FireMonkey Mobile Apps
.
Wie von anderen gefunden, http://www.malcolmgroves.com/blog/?p=1585, Aufruf DisposeOf
innerhalb der anonymen Methode ist falsch, da der anonyme Frame in der Lage sein muss, ModalResult von einem gültigen Objekt zu verarbeiten.Verwenden Sie stattdessen dieses Muster, um den modalen Dialog freizugeben, Freigeben Ihres modalen Dialogfelds.
procedure TModalForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := TCloseAction.caFree;
end;
Andere Tipps
Vergessen Sie nicht, in der Objektinspektor
einzustellen generasacodicetagpre.oder in Ihrem
generasacodicetagpre.für das Beispiel dlg.showmodal oben!