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

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


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

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

  • 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

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

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

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


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

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

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

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

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

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

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

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

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


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

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

×
×
  • Создать...