Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Реакция на нажатие mbOk CreateMessageDialog


Автор: Arex 24.3.2010, 00:46
Добрый день.
Требуется помощь.
В сети существует много примеров с использованием CreateMessageDialog.
Однако, везде используется Showmodal.
Т.е. программа ожидает реакции пользователя.
Задача состоит в том, чтобы вывести сообщение и продолжить работу ( используя Show а не Showmodal ),
а при нажатии пользователем кнопки Ok в окне сообщения ( возможно нажатие произойдет через продолжительное время ), произвести действие.
Собственно, вопрос как отследить нажатие mbOk на форме ?

Типичный пример, ожидания реакции пользователя:

Код

var
  MyMsgDialog: TForm;
...............
MyMsgDialog := CreateMessageDialog('   сообщение   ', mtInformation, [mbOk]);
...............
Case MyMsgDialog.ShowModal of 
       ID_YES: ;  
       ID_NO:  ; 
     end; 




Автор: former 24.3.2010, 08:54
Эта строка
Код

MyMsgDialog := CreateMessageDialog('   сообщение   ', mtInformation, [mbOk]);

противоречит этой (ОК и YES NO)
Код

Case MyMsgDialog.ShowModal of 
       ID_YES: ;  
       ID_NO:  ; 
     end; 

Окно диалога возвращает "модальный" результат. Выход - создай свой диалог и управляй им как хочешь.

Автор: Grag 24.3.2010, 09:17
Сделай как посоветовал Former, сделай свою форму диалога, выведи ее на экран, только не забудь разместить ее поверх всех окон, а то может затеряться.... А нужные действия выполняй в обработчике кнопки "Ok" этой формы...

Автор: Arex 24.3.2010, 11:01
Цитата(former @ 24.3.2010,  08:54)
противоречит этой (ОК и YES NO)

Противоречит ? В чем именно ?
Вот пример, многократно тиражированный в сети.
Взят отсюда: http://www.delphisources.ru/pages/faq/base/add_component_to_message_dialog.html

Код


procedure TForm1.Button1Click(Sender: TObject);
var
  AMsgDialog: TForm;
  ACheckBox: TCheckBox;
begin
  AMsgDialog := CreateMessageDialog('This is a test message.', mtWarning, [mbYes, mbNo]);
  ACheckBox := TCheckBox.Create(AMsgDialog);

  with AMsgDialog do
    try
      Caption := 'Dialog Title' ;
      Height := 169;

      with ACheckBox do
      begin
        Parent := AMsgDialog;
        Caption := 'Don''t show me again.';
        top := 121;
        Left := 8;
        Width := 140;
      end;

      case ShowModal of
        ID_YES: ;//здесь Ваш код после того как диалог будет закрыт
        ID_NO: ;
      end;

      if ACheckBox.Checked then
      begin
        //...
      end;

    finally
      ACheckBox.Free;
      Free;
    end;
end;

Так вот, если использовать Show ( без оператора case ) вместо Showmodal, то ответ от пользователя мы не ждем, а идем дальше как и требуется.
Вопрос в том как отследить последующее нажатие на кнопку Ok на форме ? Форма есть, кнопка есть, а отследить невозможно ?


Автор: former 24.3.2010, 12:57
Цитата(Arex @  24.3.2010,  11:01 Найти цитируемый пост)
Противоречит ? В чем именно ?

Диалог создаешь с кнопкой OK, а проверяешь YES и NO.
В статье (по ссылке) следующий код
Код

AMsgDialog := CreateMessageDialog('This is a test message.', mtWarning, [mbYes, mbNo]);

Цитата(Arex @  24.3.2010,  11:01 Найти цитируемый пост)
Вопрос в том как отследить последующее нажатие на кнопку Ok на форме ? Форма есть, кнопка есть, а отследить невозможно ?

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

Автор: Arex 24.3.2010, 13:28
Цитата(former @ 24.3.2010,  12:57)
Диалог создаешь с кнопкой OK, а проверяешь YES и NO.


Согласен на 100% - недоглядел.
Но по большому счету, это отношения к делу не имеет.

Я вот о чем говорю , в случае если мы указывает в коде
Код

AMsgDialog.Showmodal;

///действия 


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

AMsgDialog.Show;

///действия 

мы переходим к действиям, как и нужно, НО если пользователь отмерзнет только через полчаса и нажмет таки кнопку Ok ( или Yes , это не важно ) на форме,
то как выполнить какие-либо действия.
Вот в чем вопрос.
Если возможно, приведите код как именно отследить нажатие на кнопку на появившейся после Show форме, а как ее назвать -  Ok или Yes это дело десятое.

Спасибо.

Автор: former 24.3.2010, 13:49
Держи пример (D 2009)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)