Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2012, 14:14   #1
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию как отловить нажатие кнопки на сообщении?

вот к примеру появляется у меня messagedlg, как мне отловить ситуацию, что юзер закрыл это сообщение?
kate158 вне форума Ответить с цитированием
Старый 25.09.2012, 14:21   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
как мне отловить ситуацию, что юзер закрыл это сообщение?
Выполнится следующая за вызовом "MessageDlg " строчка программы
Если нужно знать как именно пользователь закрыл окно (какую кнопку нажал), то обработайте ModalResult, который вернул MessageDlg
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 25.09.2012, 14:48   #3
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Код:
  case MessageDlg('Вы уверены в своих действиях?',  mtConfirmation,
    mbYesNoCancel, 0) of
    mrCancel:
      begin

      end;
    mrYes:
      begin

      end;
    mrNo:
      begin

      end;
  end;
Я обычно пишу так:
Код:
 if MessageDlg('Confirm?',  mtConfirmation, [mbYes, mbNo], 0) <> mrYes then Exit;
_SERGEYX_ вне форума Ответить с цитированием
Старый 25.09.2012, 16:04   #4
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию

ок. а еще вопрос. как организовать счетчик по количеству показанных сообщений?
у меня стоит таймер, и по нему через 30 секунд вылезает сообщение. если пользователь соглашается, то сообщение больше не будет показано (в базу пишется 1). если не соглашается, то оно вылазит каждые 30 секунд.
как сделать так: прошло 30 секунд, пользователь увидел сообщение и единожды нажал на кнопку cancel?
прошло снова 30 секунд, и никаких сообщений нет
а то получается у меня если юзер выбирает кнопку cancel, то сообщение будет вылазить каждые 30 секунд, пока юзер не нажмет да.

в общеМ, кто нибудь меня понял?))
таймер стоит для автоматической проверки изменений в бд

Последний раз редактировалось kate158; 25.09.2012 в 16:08.
kate158 вне форума Ответить с цитированием
Старый 25.09.2012, 16:10   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
если пользователь соглашается, то сообщение больше не будет показано
т.е. где-то стоит(ставится) блокирока/удаление таймера.

Цитата:
если юзер выбирает кнопку cancel, то сообщение будет вылазить каждые 30 секунд,
кто мешает в этом случае также выполнить аналогичную блокировку таймера.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 25.09.2012, 16:10   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А таймер зачем вообще? Один раз сообщение и пользователь соглашается или нет. Если уж по таймеру, то как-то прекращаете цикл по 'да', аналогично прекратить и по cancel или нет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.09.2012, 16:15   #7
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию

таймер нужен, чтобы проверять были ли изменения в бд. если были, появляется сообщение.
так вот сидит юзер, и через 30 сек у него начинают всплывать окна, и те что он видел пока работал в проге, но не стал отвечать "да", и новые
вот мой
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
...
if ((dm.notedomain_name.AsString = GetUserFromWindows) and
      (dm.NOTESTATUS.asboolean = false)) then
    begin
      case MessageDlg('У вас есть новые записки! Пометить как прочтенные?', mtConfirmation,
        [mbYes, mbNo], 0) of
        mrCancel:
          begin
            Abort
          end;
        mrYes:
          begin
            if dm.dbl_note.Active then dm.dbl_note.Close;
            dm.dbl_note.SQL.Clear;
            dm.dbl_note.SQL.add('update dbo.note set status=1 where id_note=' +
              dm.noteid_note.AsString);
            dm.dbl_note.ExecSQL;
            dm.NOTE.Close;
            dm.NOTE.Open;
          end;
        mrNo:
          begin
            RxTrayIcon1.animated := true;
            RxTrayIcon1.Hint := 'Имеются записки, не выполненные в срок!';
            Abort
          end;
      end;
    end;

Последний раз редактировалось kate158; 25.09.2012 в 16:29.
kate158 вне форума Ответить с цитированием
Старый 25.09.2012, 16:38   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
так вот сидит юзер, и через 30 сек у него начинают всплывать окна, и те что он видел пока работал в проге, но не стал отвечать "да", и новые
Отключать таймер сразу по входе в процедуру. До показа сообщения. Теперь пока пользователь не отреагирует никаких новых сообщений показано быть не может. А после реакции пользователя на сообщение можно включить таймер снова, если это конечно нужно.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 25.09.2012, 17:02   #9
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Упаси боже нас от программ, где каждые 30 секунд вылазит сообщение. Хватит с нас и интернетовской рекламы... Сори за офтоп.
_SERGEYX_ вне форума Ответить с цитированием
Старый 25.09.2012, 17:08   #10
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := (MessageDlg('У вас есть новые записки! Пометить как прочтенные?', mtConfirmation, [mbYes, mbNo], 0) = mrNo);
end;
и ничего кроме не нужно...
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# Отловить нажатие кнопки в другом приложении drayvhard C# (си шарп) 2 13.07.2012 13:30
Как симулировать нажатие кнопки? Iceman Общие вопросы Delphi 1 18.10.2009 13:22
вывод сообщении только на правой кнопки мыши! KWN, lnc Общие вопросы Delphi 1 21.03.2009 08:26
Как отследить нажатие кнопки? Bezdar Microsoft Office Excel 9 17.12.2008 11:12
Отловить нажатие левой кнопки мыши на р листе SAndrus Microsoft Office Excel 2 14.07.2007 13:13