Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FMX TForm OnCloseQuery TDialogService.MessageDialog / 13 сообщений из 13, страница 1 из 1
09.04.2020, 12:29
    #39945239
S_Gur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FMX TForm OnCloseQuery TDialogService.MessageDialog
Господа, прошу помощи начинающему программисту мобильных приложений. Дошли у меня руки впервые поиграться с Multi-Device приложениями. Создал самое примитивное приложение, проверил его под виндами и на своем андроидном телефоне. Затем решил обработать OnCloseQuery - стандартный запрос, что-то типа: "Вы уверены, что хотите покинуть программу?" И вот в результате экспериментов выяснилось следующее:

Конструкция

Код: pascal
1.
2.
3.
4.
procedure TFmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := True
end;


работает идеально.

Конструкция

Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TFmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
Var
  B : Boolean;
begin
  B := True (или False);
  CanClose := B
end;


тоже никаких проблем не вызывает.

Конструкция

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TFmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
Var
  B : Boolean;
begin
  TDialogService.MessageDialog('You Want To Leave The Program?', TMsgDlgType.mtConfirmation, mbYesNo, TMsgDlgBtn.mbNo, 0, Procedure(Const AResult : TModalResult)
  Begin
    If AResult = mrYes Then B := True
    Else B := False
  End);
  CanClose := B
end;


прекрасно работает под виндами, но на мобиле никакой реакции на то, какую я кнопку нажимаю в диалоговом окне - программа не закрывается. Честно говоря, я пока не понимаю, в какую сторону мне копать - в сторону областей видимости переменных?

Подскажите, пожалуйста...

Модератор: Пользуйтесь тегом (кнопкой) SRC для оформления кода, пожалуйста.
...
Рейтинг: 0 / 0
09.04.2020, 12:45
    #39945247
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FMX TForm OnCloseQuery TDialogService.MessageDialog
S_Gur> Честно говоря, я пока не понимаю, в какую сторону мне копать

Для начала - в сторону отладки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.04.2020, 12:48
    #39945251
S_Gur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FMX TForm OnCloseQuery TDialogService.MessageDialog
Гаджимурадов Рустам, отладка при компиляции под виндовс дает именно то, что и надо. А как отлаживать под андроид, я пока не знаю. Слышал, что можно на эмуляторе в отладке работать, но пока до настройки эмулятора я не дошел
...
Рейтинг: 0 / 0
09.04.2020, 12:56
    #39945254
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FMX TForm OnCloseQuery TDialogService.MessageDialog
Если не научились дебажить интерактивно - просто логируйте
куда-нибудь значения всех изменяемых переменных.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.04.2020, 13:01
    #39945256
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FMX TForm OnCloseQuery TDialogService.MessageDialog
S_Gur
Гаджимурадов Рустам, отладка при компиляции под виндовс дает именно то, что и надо. А как отлаживать под андроид, я пока не знаю. Слышал, что можно на эмуляторе в отладке работать, но пока до настройки эмулятора я не дошел


точно так же как и под виндой. Нажать ран и вперед.
...
Рейтинг: 0 / 0
09.04.2020, 13:08
    #39945262
S_Gur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FMX TForm OnCloseQuery TDialogService.MessageDialog
Vizit0r, нажать Run, конечно, можно. Точку останова поставить нельзя
...
Рейтинг: 0 / 0
09.04.2020, 13:30
    #39945275
S_Gur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FMX TForm OnCloseQuery TDialogService.MessageDialog
В общем-то, с поставленным вопросом я разобрался. Выяснилось, что внутренняя процедура обработки TDialogService.MessageDialog срабатывает уже после того, как CanClose получает ее результат. Но осталась проблема областей видимости переменных. Эта процедура не видит ни параметра CanClose, ни переменной Result, если поместить вызов диалога в отдельную функцию. Как можно возвратить результат наружу, я пока не нашел. В примерах ее использования только ShowMessage('Вы нажали кнопку "Yes"')
...
Рейтинг: 0 / 0
09.04.2020, 13:32
    #39945277
S_Gur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FMX TForm OnCloseQuery TDialogService.MessageDialog
Все, разобрался. Вопрос закрыт, всем спасибо
...
Рейтинг: 0 / 0
09.04.2020, 13:37
    #39945281
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FMX TForm OnCloseQuery TDialogService.MessageDialog
S_Gur
Как можно возвратить результат наружу, я пока не нашел.

S_Gur
Все, разобрался.

Теперь колись, чтобы другие с такими же проблемами не искали тебя с фонарем через 10 лет :)
...
Рейтинг: 0 / 0
09.04.2020, 13:53
    #39945300
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FMX TForm OnCloseQuery TDialogService.MessageDialog
S_Gur
Vizit0r, нажать Run, конечно, можно. Точку останова поставить нельзя


да ну? )

Странно, а почему у меня ставились и работали?


S_Gur
В общем-то, с поставленным вопросом я разобрался. Выяснилось, что внутренняя процедура обработки TDialogService.MessageDialog срабатывает уже после того, как CanClose получает ее результат. Но осталась проблема областей видимости переменных. Эта процедура не видит ни параметра CanClose, ни переменной Result, если поместить вызов диалога в отдельную функцию. Как можно возвратить результат наружу, я пока не нашел. В примерах ее использования только ShowMessage('Вы нажали кнопку "Yes"')


о, ты открыл для себя мир асинхронных MessageDialog из FMX - это очень грустная, но необходимая для изучения тема, особенно в случае мобильников.
...
Рейтинг: 0 / 0
09.04.2020, 13:55
    #39945302
S_Gur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FMX TForm OnCloseQuery TDialogService.MessageDialog
Не уверен, что именно разобрался, но выкрутился. Получилось что-то типа этого:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Var
  IsCanClose : Boolean;

procedure TFmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin
  If Not IsCanClose Then TDialogService.MessageDialog('You Want To Leave The Program?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], TMsgDlgBtn.mbNo, 0, Procedure(Const AResult : TModalResult)
  Begin
    IsCanClose := AResult = mrYes;
    If IsCanClose Then Close
  End);
  CanClose := IsCanClose
end;



Во всяком случае, оно работает
...
Рейтинг: 0 / 0
09.04.2020, 14:06
    #39945306
S_Gur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FMX TForm OnCloseQuery TDialogService.MessageDialog
"Странно, а почему у меня ставились и работали?"

Vizit0r, не знаю, почему. Может, это фича 10.3.3, может редакции Delphi Professional. Когда выбираешь Target Android и телефон, отладка отрубается. На днях собираюсь поиграться с эмулятором андроида - говорили, что в нем отладка работать должна

"ты открыл для себя мир асинхронных MessageDialog из FMX"

Насколько я понял свою проблему, дело не в асинхронности, а именно в областях видимости переменных. Я не могу напрямую обработать CanClose. Пробовал сделать отдельную функцию - и так же не смог обработать ее Result. Это отладчиком не прощупаешь, это надо знать, а я только вчера первый раз в это влез. Буду разбираться
...
Рейтинг: 0 / 0
09.04.2020, 15:04
    #39945373
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FMX TForm OnCloseQuery TDialogService.MessageDialog
S_Gur
"Странно, а почему у меня ставились и работали?"

Vizit0r, не знаю, почему. Может, это фича 10.3.3, может редакции Delphi Professional. Когда выбираешь Target Android и телефон, отладка отрубается. На днях собираюсь поиграться с эмулятором андроида - говорили, что в нем отладка работать должна


Хм. Ясно.



S_Gur

"ты открыл для себя мир асинхронных MessageDialog из FMX"

Насколько я понял свою проблему, дело не в асинхронности, а именно в областях видимости переменных. Я не могу напрямую обработать CanClose. Пробовал сделать отдельную функцию - и так же не смог обработать ее Result. Это отладчиком не прощупаешь, это надо знать, а я только вчера первый раз в это влез. Буду разбираться


у меня таких моментов штук пять по коду. Сохранение измененных файлов при закрытии, и подобным им. Для мобильных систем, где все MessageDialog принудительно асинхронные (без возможности поменять), пришлось лепить костыли из дополнительного кода.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FMX TForm OnCloseQuery TDialogService.MessageDialog / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]