Pregunta

En Delphi para Windows no hay ningún problema para cerrar el formulario secundario creado dinámicamente de forma gratuita (Form.free) porque dónde está el método "ShowModal".Pero Delphi para Android no admite Form.ShowModal y tenemos que usar el método Show.Pero descubrí que cuando cierro el formulario secundario (Form.close) todavía está en la memoria e incluso ejecuto el evento Onresize del código (???).¿Cuál es la mejor manera de obtener formularios gratuitos en llamadas no modales?

En otras palabras:¿Cómo cierro un formulario desde un controlador de eventos OnClick en ese formulario y me aseguro de que se ejecute el destructor del formulario?

¿Fue útil?

Solución

Actualizar

Vea la nota importante a continuación.


En XE5 para Android existe la posibilidad de mostrar un formulario con resultados modales, un formulario sobrecargado ShowModal procedimiento mediante un método anónimo:

procedimiento ShowModal(const ResultProc:TProc);sobrecarga;

Puedes encontrarlo descrito en este artículo de Marco Cantú, Delphi XE5 Anonymous ShowModal and Android.

Aquí está el ejemplo de cómo utilizar este procedimiento:

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

Tenga en cuenta que el dlg.DisposeOf; forzará la destrucción del formulario, anulando el manejo automático de ARC.

También puede encontrar una descripción en la documentación, Using Modal Dialog Boxes in Mobile Apps y aquí, ShowModal Dialogs in FireMonkey Mobile Apps.


Según lo encontrado por otros, http://www.malcolmgroves.com/blog/?p=1585, llamando DisposeOf dentro del método anónimo es incorrecto porque el marco anónimo debe poder manejar ModalResult desde un objeto válido.Utilice este patrón en su lugar para liberar el diálogo modal, Liberando su cuadro de diálogo modal.

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

Otros consejos

No olvides establecer en el ObjectInspector

ModalResult = mrOK

o en su

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

para el ejemplo dlg.showmodal arriba!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top