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?

War es hilfreich?

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!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top