• 0
DMS

[Android] Вспомогательные формы и ShowModal

Вопрос

Господа знатоки FMX и Android, подскажите пожалуйста, как решить такую проблему.

Приложение для Андроид.
Есть главная форма и две вспомогательные формы (создаются вручную)

Нужно из главной формы сначала вызвать первую вспомогательную форму, а следом вторую вспомогательную форму (но ее только после закрытия первой вспомогательно).

Вызываю так:
      dlg := TForm2.Create(nil);
      dlg.ShowModal(
        procedure(ModalResult: TModalResult)
        begin
          ...
        end);

      dlg2 := TForm3.Create(nil);
      dlg2.ShowModal(
        procedure(ModalResult: TModalResult)
        begin
          ...
        end);

Но они вызываются сразу друг за другом. Под Windows ShowModal приостанавливает код, следующий за ним, а под Андроид выполняется сразу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

16 ответов на этот вопрос

  • 0

этот код

 

 dlg2 := TForm3.Create(nil);
      dlg2.ShowModal(
        procedure(ModalResult: TModalResult)
        begin
          ...
        end);

после закрытия первой вспомогательной вызывай!

DMS понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
8 часов назад, wamaco сказал:

этот код

 


 dlg2 := TForm3.Create(nil);
      dlg2.ShowModal(
        procedure(ModalResult: TModalResult)
        begin
          ...
        end);

после закрытия первой вспомогательной вызывай!

В OnClose первой вспомогательной?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

модальность реализуется в мобильных системах не так как на десктопе
по сути, мы когда запускаем форму ShowModal, даем ей процедуру, куда идти после закрытия
по сути, тот же OnClose 
так что я бы написал так, чтобы вложенные простыни не плодить

procedure TForm1.ShowForm2;
var f:TForm2;
begin
    f:=TForm2.Create(NIL);
    f.showModal(Form2Closed);
end;


procedure TForm1.Form2Closed(AResult: TModalResult);
var f:TForm3;
begin
  if AResult=mrOK then
  begin
    f:=TForm3.Create(NIL);
    f.showModal(Form3Closed);
  end
end;

procedure TForm1.Form3Closed(AResult: TModalResult);
begin
  if AResult=mrOK then
  begin
    // что там надо после формы3
  end
end;

 

DMS понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

krapotkin, спасибо за ответ. Сделал, как вы сказали - формы вызываются одна за другой. Всё работает.

Но почему-то после закрытия последней вспомогательной формы Андроид-приложение аварийно закрывается. Решил сделать логирование. Последним вызывается OnClose последней вспомогательной формы, а потом crash.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Хмм.. простое тестовое приложение, сделанное по этому принципу, работает без краша. Почему рабочее вылетает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

попробуйте  вместо NIL  Self. Падать перестанет скорее всего.

Но чтобы реально знать что не так, нужно видеть кот

Изменено пользователем krapotkin
DMS понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
5 часов назад, krapotkin сказал:

попробуйте  вместо NIL  Self. Падать перестанет скорее всего.

Но чтобы реально знать что не так, нужно видеть кот

Увы, не помогло. Я не могу понять, почему тестовое приложение работает, а рабочее нет. Причем если вызывать формы по одной и закрывать их (в одной процедуре), то приложение не вываливается

Возможно, где-то некорректное обращение к памяти при вызове и закрытии модальных форм. Может глюк Delphi?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

делфи точно ни при чем

при чем может быть только управление жизненным циклом объектов, которое нужно учитывать

DMS понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
3 часа назад, krapotkin сказал:

делфи точно ни при чем

при чем может быть только управление жизненным циклом объектов, которое нужно учитывать

но ведь всё с объектами форм нормально, если формы вызывать по отдельности.

Crash появляется именно при вызове друг за другом нескольких форм

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
3 часа назад, krapotkin сказал:

делфи точно ни при чем

 

Я тоже думаю, что где-то есть изящное решение проблемы или костыль))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Меня смущает, почему в официальной справке рекомендуют nil:

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_FireMonkey_Modal_Dialog_Boxes

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

не используйте nil используйте Application

это легко проверить создайте вторую форму с параметром nil и закройте главную, выйдет ошибка.

а корректное завершение будет через Application

 

это справедливо для Windows

DMS понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
4 часа назад, Равиль Зарипов (ZuBy) сказал:

не используйте nil используйте Application

это легко проверить создайте вторую форму с параметром nil и закройте главную, выйдет ошибка.

а корректное завершение будет через Application

 

это справедливо для Windows

это и для Андроида справедливо?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

еще раз. Для windows подойдет вообще все что угодно, там диалоги вообще модальные.

В мобильных ОС используется ARC - автоподсчет ссылок. Почитайте.

При использовании Create(v), на форму начинает ссылаться компонент v, поэтому подсчет ссылок не дает ей самоубиться. Но это же говорит о том, что при закрытии она висит в памяти. Не особо страшно, но...

Если указать NIL, то форма будет убита сразу после выхода, и обращение к ней даст AV

Поэтому я и говорю, надо смотреть код. 

Равиль Зарипов (ZuBy) и DMS понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

krapotkin, а есть такая функция в Delphi, которая позволяла бы получить текущий список ссылок приложения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

в моем понимании нет никаких "ссылок приложения". хотя мало ли что...

почитайте статью ярослава по жизненным циклам объектов

DMS понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу