Développement Android Delphi-XE5.Quelle est la meilleure façon de libérer des formulaires non modaux ?

StackOverflow https://stackoverflow.com//questions/20015519

Question

Dans Delphi pour Windows, il n'y a aucun problème avec le formulaire secondaire créé dynamiquement fermé Free (Form.free), car où se trouve la méthode "ShowModal".Mais Delphi pour Android ne prend pas en charge Form.ShowModal et nous devons utiliser la méthode Show.Mais j'ai compris que lorsque je ferme le formulaire secondaire (Form.close), il est toujours en mémoire et j'exécute même le code Onresize (???).Quelle est la meilleure façon de libérer des formulaires lors d'un appel non modal ?

En d'autres mots:Comment fermer un formulaire à partir d'un gestionnaire d'événements OnClick sur ce formulaire et m'assurer que le destructeur du formulaire s'exécute ?

Était-ce utile?

La solution

Mise à jour

Voir la note importante ci-dessous.


Dans XE5 pour Android, il est possible d'afficher un formulaire avec des résultats modaux, un formulaire surchargé ShowModal procédure utilisant une méthode anonyme :

procédure ShowModal(const ResultProc :TProc);surcharge;

Vous pouvez le trouver décrit dans cet article de Marco Cantu, Delphi XE5 Anonymous ShowModal and Android.

Voici l'exemple d'utilisation de cette procédure :

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);

Notez que le dlg.DisposeOf; forcera la destruction du formulaire, annulant la gestion automatique de l'ARC.

Vous pouvez également trouver une description dans la documentation, Using Modal Dialog Boxes in Mobile Apps et ici, ShowModal Dialogs in FireMonkey Mobile Apps.


Comme l'ont trouvé d'autres, http://www.malcolmgroves.com/blog/?p=1585, appelant DisposeOf à l'intérieur de la méthode anonyme est erroné car le cadre anonyme doit être capable de gérer ModalResult à partir d'un objet valide.Utilisez plutôt ce modèle pour libérer la boîte de dialogue modale, Libérer votre boîte de dialogue modale.

procedure TModalForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := TCloseAction.caFree;
end;

Autres conseils

N'oubliez pas de définir dans l'ObjectInspector

ModalResult = mrOK

ou dans votre

procedure TForm1.ExitButtonClick(Sender: TObject);
begin
   ModalResult := mrOK;
end;

pour l'exemple dlg.showmodal ci-dessus!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top