Перейти к содержанию
Fire Monkey от А до Я
  • 0

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


DMS

Вопрос

Господа знатоки 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 приостанавливает код, следующий за ним, а под Андроид выполняется сразу.

Ссылка на комментарий

Рекомендуемые сообщения

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

 

Ссылка на комментарий
  • 0

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

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

Ссылка на комментарий
  • 0

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

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

Изменено пользователем krapotkin
Ссылка на комментарий
  • 0
5 часов назад, krapotkin сказал:

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

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

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

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

Ссылка на комментарий
  • 0
3 часа назад, krapotkin сказал:

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

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

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

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

Ссылка на комментарий
  • 0
  • Модераторы

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

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

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

 

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

Ссылка на комментарий
  • 0
4 часа назад, Равиль Зарипов (ZuBy) сказал:

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

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

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

 

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

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

Ссылка на комментарий
  • 0

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

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

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

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

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

Ссылка на комментарий
  • 0

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

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

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...