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

Два вопроса по модальным окнам


Ллирик

Вопрос

Вопрос 1. Как закрыть приложение из модального окна на андроиде? Делаю так:


procedure ExitQwery(MainSelf: TForm);
var
  FormExitQwery: TFormExitQwery;
begin
  Application.CreateForm(TFormExitQwery, FormExitQwery);
  FormExitQwery.BringToFront;
  FormExitQwery.StyleBook := MainSelf.StyleBook;
  FormExitQwery.Label1.Width := 1;
  FormExitQwery.ShowModal(
    procedure(Result: TModalResult)
    begin
      if Result = mrOk then
      begin
              FormExitQwery.Free;
              MainSelf.Close;
              MainSelf.Free;
 Application.Terminate;
       end
      else if Result = mrCancel then
      begin
        FormExitQwery.CloseModal;
        FormExitQwery.Free;
      end;

    end);
end;

procedure TFormExitQwery.Close(Sender: TObject; var Action: TCloseAction);
begin
  Action := TCloseAction.caFree;
end;

end.

, но приложение не закрывается.

 

Вопрос 2. По нажатию на TImage и по таймеру создаются два модальных окна

procedure ShowMessageModal(Self: TForm; const AMessage: string;
  ADefProc: TProc);
var
  locMessageForm: TMessageForm;
begin
  Application.CreateForm(TMessageForm, locMessageForm);
  locMessageForm.BringToFront;
  // locMessageForm.ModalResult := mrOk;
  locMessageForm.CurWidth := false;
  locMessageForm.SelfWidth := Self.Width;
  locMessageForm.StyleBook := Self.StyleBook;
//  locMessageForm.Parent := Self;
  locMessageForm.MessText.BeginUpdate;
  locMessageForm.MessText.Text := AMessage;
  locMessageForm.MessText.EndUpdate;
  locMessageForm.ButtonHeight := Round(locMessageForm.Buttton.Height);
  locMessageForm.ButtonWidth := Round(locMessageForm.Buttton.Width) + 24;
  locMessageForm.MessText.Width := 1;
  locMessageForm.Buttton.ModalResult := mrOk;
  locMessageForm.showModal(
    procedure(Result: TModalResult)
    begin
      if Result = mrOk then
      begin
        ADefProc();
        locMessageForm.CloseModal;
      end;
    end);
end;

end.

Если на экране смартфона уже есть окно от нажатия на TImage, то окно по таймеру уже не показывается. Как быть?

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

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

  • 0

не нужно ничего закрывать из модального окна. и в других ОС тоже.

его нужно использовать как и везде для диалога с юзером.

просто та часть, где идет проверка и реакция на ввод, сейчас живет в отдельной процедуре

соответственно if Result = mrOk then Application.Terminate;

procedure ExitQwery(MainSelf: TForm);

 

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

не нужно ничего закрывать из модального окна. и в других ОС тоже.

его нужно использовать как и везде для диалога с юзером.

просто та часть, где идет проверка и реакция на ввод, сейчас живет в отдельной процедуре

соответственно if Result = mrOk then Application.Terminate;


procedure ExitQwery(MainSelf: TForm);

 

Не понял, а я как тогда сделал? Чем Ваш код отличается от моего? И у меня главный вопрос всё таки второй. Он вообще никак не связан с первым

Ссылка на комментарий
  • 0
8 минут назад, chaplin.u@gmail.com сказал:

может проблема в этом : 


locMessageForm.Buttton.ModalResult := mrOk;

А как я тогда узнаю, что произошло нажатие кнопки ОК? В винде всё работает, проблема только на андроиде

Ссылка на комментарий
  • 0
50 минут назад, chaplin.u@gmail.com сказал:

Я имею ввиду 


Buttton

как говорит Леонид Якубович : в этом слове есть 3 такие буквы значит вам полагается шкатулочка...

Если тут была бы ошибка, то компилятор просто бы не скомпилировал программу) Так что тут никакой ошибки нет))

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

все там показывается

сколько ни создай окон

они так друг на друге и сидят

Глюк появляется, когда у модальной формы включён Transparency

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

посмотрите вот этот пример

Если в Вашем примере добавить вызов TMyMsgDlg.Create по таймеру, например так

procedure TFormMain.Button3Click(Sender: TObject);
var
  mY: TMyMsgDlg;
begin
  mY := TMyMsgDlg.Create('Вывести сообщение по закрытию окна?', self,
    procedure
    begin
      ShowMessage('Сообщение по закрытию окна');
    end, false);
  mY.ShowMe;
  timerr := 10;
  Timer1.Enabled := true;
end;

procedure TFormMain.Timer1Timer(Sender: TObject);
var
  mY: TMyMsgDlg;
begin
Timerr := Timerr -1;
if Timerr = 0 then begin
Timer1.Enabled := false;
  mY := TMyMsgDlg.Create('Таймер сработал!!!! Вывести сообщение по закрытию окна?', self,
    procedure
    begin
      ShowMessage('Сообщение по закрытию окна');
    end, false);
  mY.ShowMe;
  end;
end;

, то на андроиде будет точно такой же глюк, как у меня, то есть если на экране сообщение 'Вывести сообщение по закрытию окна?', то сообщение 'Таймер сработал!!!! Вывести сообщение по закрытию окна?' на экране не появится

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

что вообще происходит?

вам нужно вызвать диалог через 10 секунд?

извращение какое-то происходит

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

В этой теме:

http://fire-monkey.ru/topic/3760-there-is-no-overloaded-version-of-messagedialog-that-can-be-called-with-these-arguments/#comment-23646

я хотела ответить автору кодом из С++ Builder и скриншотами, что он не прав. Но жаль, что тему закрыли.

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

что вообще происходит?

вам нужно вызвать диалог через 10 секунд?

Так это просто пример) В моем приложении таймер устанавливается на 30 секунд и срабатывает отдельно от других диалогов, если пользователь не успел правильно ответить на вопрос

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

В этой теме:

http://fire-monkey.ru/topic/3760-there-is-no-overloaded-version-of-messagedialog-that-can-be-called-with-these-arguments/#comment-23646

я хотела ответить автору кодом из С++ Builder и скриншотами, что он не прав. Но жаль, что тему закрыли.

И в чём же я был не прав, Сударыня?

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

в том, что на билдере выполнение процедуры останавливается в ShowMessage

код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   Label1->Text = L"До";
   ShowMessage(L"Привет");
   Label1->Text = L"После";
}

android.jpg

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

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

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

а на закрытие диалога повесить form.Release

тогда все будет как вы хотите

сначала выйдет сообщение. Потом закроется форма

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

в том, что на билдере выполнение процедуры останавливается в ShowMessage

код


void __fastcall TForm1::Button1Click(TObject *Sender)
{
   Label1->Text = L"До";
   ShowMessage(L"Привет");
   Label1->Text = L"После";
}

 

Да, действительно код не останавливается. Но четыре месяца назад я писал приложение в билдере, в котором при вызове ShowMessage выполнение кода останавливалось и мой друг может это подтвердить)  В общем чудеса какие-то.....)

 

1 час назад, krapotkin сказал:

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

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

а на закрытие диалога повесить form.Release

тогда все будет как вы хотите

сначала выйдет сообщение. Потом закроется форма

Так мне не нужно, чтобы форма сама закрывалась

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

Но четыре месяца назад я писал приложение в билдере, в котором при вызове ShowMessage выполнение кода останавливалось и мой друг может это подтвердить

Или покойный театральный гуру Станиславский c его знаменитой фразой "НЕ ВЕРЮ!" не прав, или не прав krapotkin. :)

Оба варианта говорят, что не прав Ллирик...

Изменено пользователем Kitty
Ссылка на комментарий

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

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

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

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

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

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

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

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

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

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