Delphi-Xe5 Sviluppo Android.Qual è il modo migliore per liberare forme non modali?
-
21-12-2019 - |
Domanda
In Delfi per Windows non ci sono problemi a Free (Form.Free) Form Closed Dynamicaly Dynamicaly-creato modulo perché dov'è il metodo "showmodal".Ma Delphi per Android non supporta Form.ShowModal, e dobbiamo usare il metodo Mostra.Ma ho capito cosa quando chiudo (Form.Close) forma secondaria è ancora in memoria e persino eseguire il codice onResize Event (???).Qual è il modo migliore per liberare forme in chiamata non modale?
In altre parole: Come chiudere un modulo da un gestore di eventi onclick su quella forma e assicurarmi che il distruttore del modulo corre?
Soluzione
Aggiornamento
Vedi nota importante qui sotto.
.
In XE5 per Android c'è la possibilità di mostrare un modulo con risultati modali, una procedura ShowModal
sovraccaricata utilizzando un metodo anonimo:
.Procedura Showmodal (Const Resultproc: TPROC); sovraccarico;
Puoi trovarlo descritto in questo articolo di Marco Cantu, Delphi XE5 Anonymous ShowModal and Android
. .
Ecco l'esempio Come utilizzare questa procedura:
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);
.
Nota che il dlg.DisposeOf;
costringerà il modulo da distruggere, sovrascrivere la gestione automatica dell'arco.
Puoi anche trovare una descrizione nella documentazione, Using Modal Dialog Boxes in Mobile Apps
e qui, ShowModal Dialogs in FireMonkey Mobile Apps
.
.
Come trovato da altri, http://www.malcolmgroves.com/blog/?p= 1585 , chiamare DisposeOf
all'interno del metodo anonimo è sbagliato perché il telaio anonimo deve essere in grado di gestire modalresult da un oggetto valido. Utilizzare questo modello invece per liberare la finestra di dialogo modale, Libera la finestra di dialogo Modal .
Altri suggerimenti
Non dimenticare di impostare nell'oggettoSpector
ModalResult = mrOK
.
o nel tuo
procedure TForm1.ExitButtonClick(Sender: TObject);
begin
ModalResult := mrOK;
end;
.
per l'esempio dlg.showmodal sopra!