Разработка Delphi-XE5 для Android.Как лучше всего освободить немодальные формы?

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

Вопрос

В Delphi для Windows нет проблем с закрытой вторичной динамически созданной формой Free (Form.free), потому что там находится метод «ShowModal».Но Delphi для Android не поддерживает Form.ShowModal, и нам приходится использовать метод Show.Но я понял, что когда я закрываю (Form.close) вторичную форму, она все еще находится в памяти и даже запускает событие Onresize кода (???).Как лучше всего использовать свободные формы при немодальном вызове?

Другими словами:Как закрыть форму из обработчика событий OnClick в этой форме и обеспечить запуск деструктора формы?

Это было полезно?

Решение

Обновлять

См. важное примечание ниже.


В XE5 для Android есть возможность показывать форму с модальными результатами, перегруженную ShowModal процедура с использованием анонимного метода:

процедура ShowModal(const ResultProc:ТПрок);перегрузка;

Вы можете найти это описание в этой статье Марко Канту, Delphi XE5 Anonymous ShowModal and Android.

Вот пример использования этой процедуры:

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

Обратите внимание, что dlg.DisposeOf; приведет к принудительному уничтожению формы, отменяя автоматическую обработку ARC.

Вы также можете найти описание в документации, Using Modal Dialog Boxes in Mobile Apps и здесь, ShowModal Dialogs in FireMonkey Mobile Apps.


Как обнаружили другие, http://www.malcolmgroves.com/blog/?p=1585, звоню DisposeOf внутри анонимного метода неверно, поскольку анонимный фрейм должен иметь возможность обрабатывать ModalResult из допустимого объекта.Вместо этого используйте этот шаблон, чтобы освободить модальное диалоговое окно, Освобождение модального диалогового окна.

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

Другие советы

Не забудьте установить в objectsSpector

ModalResult = mrOK
.

или в вашем

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

Для примера dlg.showmodal выше!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top