Delphi-XE5 Desenvolvimento Android.Qual é a melhor forma de se libertar de formulários não-modal?
-
21-12-2019 - |
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?
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!