Développement Android Delphi-XE5.Quelle est la meilleure façon de libérer des formulaires non modaux ?
-
21-12-2019 - |
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 ?
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!