Разработка Delphi-XE5 для Android.Как лучше всего освободить немодальные формы?
-
21-12-2019 - |
Вопрос
В 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 выше!