Delphi-XE5 Desenvolvimento Android.Qual é a melhor forma de se libertar de formulários não-modal?

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

Pergunta

Em Delphi para windows, não há nenhum problema para Free (Formulário.livre) fechado secundário dynamicaly formulário criado porque onde está o "ShowModal" método.Mas Delphi para Android não suporta Formulário.ShowModal, e temos que usar o método Show.Mas eu descobri que quando eu fechar (Formulário.fechar) forma secundária está ainda na memória e até mesmo executar o código de evento Onresize (???).Qual é a melhor maneira de formas Livres em não Modal chamada?

Em outra palavras:Como faço para fechar um formulário a partir de um manipulador de eventos OnClick no formulário, e garantir que o formulário do destrutor é executado?

Foi útil?

Solução

Atualização

Consulte a nota abaixo.


Em XE5 para Android, há uma possibilidade de mostrar um formulário com os modais de resultados, um sobrecarregado ShowModal procedimento usando um método anônimo:

procedimento ShowModal(const ResultProc:TProc);sobrecarga;

Você pode encontrá-lo descrito neste artigo por Marco Cantu, Delphi XE5 Anonymous ShowModal and Android.

Aqui está o exemplo de como usar este procedimento:

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

Observe que o dlg.DisposeOf; vai forçar o formulário para ser destruído, substituindo o ARCO manuseio automático.

Você também pode encontrar uma descrição na documentação, Using Modal Dialog Boxes in Mobile Apps e aqui, ShowModal Dialogs in FireMonkey Mobile Apps.


Como encontrado por outros, http://www.malcolmgroves.com/blog/?p=1585, chamando DisposeOf dentro do método anônimo é errado, porque o anônimo quadro deve ser capaz de lidar com ModalResult a partir de um objeto válido.Use esse padrão em vez de libertar a caixa de diálogo modal, Libertando Sua Caixa De Diálogo Modal.

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

Outras dicas

Não se esqueça de definir o ObjectInspector

ModalResult = mrOK

ou no seu

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

para o exemplo da dlg.ShowModal acima!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top