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

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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

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

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


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

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

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

Изменено пользователем krapotkin

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


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

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

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

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

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

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


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

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

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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

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


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

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

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

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

 

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

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

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


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

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

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

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

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

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

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


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

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

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


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

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

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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


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

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