Отследить наличие окна, созданного ф-цией MessageBox()
От: Charly22  
Дата: 30.05.17 19:35
Оценка:
Всем привет!
Прошу подсказать, как избежать каскадного появления окон с сообщением, которые создаются ф-цией MessageBox() из модуля Windows.
То есть, если одно окно с сообщением появилось, то больше этих окон плодить не нужно.
Чтобы было понятно, я поясню.
Показ сообщения вызывается из обработчика события OnChange компонента TSpinEditor.
После появления первого окна выполнение обработчика OnChange не прекращается,
что вызывает появление все новых и новых окон пока не возникнет переполнение стека.
messagebox окно
Re: Отследить наличие окна, созданного ф-цией MessageBox()
От: Charly22  
Дата: 30.05.17 19:47
Оценка:
Забыл сказать, что программа пишется на Delphi
messagebox
Re[2]: Отследить наличие окна, созданного ф-цией MessageBox()
От: Alexander G Украина  
Дата: 30.05.17 20:21
Оценка:
Здравствуйте, Charly22, Вы писали:

C>Забыл сказать, что программа пишется на Delphi


1. Лучше Balloon Tooltip для недопустимого значения, или другая подсказка, не требующая нажатия "Ок", чем меседж бокс.
2. Меседж бокс модален, то есть дизейблит окно владельца.
Поэтому ситуаций "какое-то действие пользователя во время месседж бокса" обычно не бывает.
Возможно, не был задан первый параметр, там нужно передать Handle (HWND) той TForm, для которой вызван.
3. При работе с библиотекой контролов имеет смысл предпочитать диалоги из этой же библиотеки, то есть MessageDlg для VCL.
4. При программной установки значения не должно быть никаких MessageBox, они могут возникать только при действиях пользователя.
Русский военный корабль идёт ко дну!
Re[3]: Отследить наличие окна, созданного ф-цией MessageBox()
От: Charly22  
Дата: 31.05.17 04:29
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>2. Меседж бокс модален, то есть дизейблит окно владельца.


Вы хотите сказать, что модальное окно не получится никак отследить? Не помогут ф-ции GetWindow() и FindWindowEx()?
Re: Отследить наличие окна, созданного ф-цией MessageBox()
От: kov_serg Россия  
Дата: 31.05.17 05:46
Оценка:
Здравствуйте, Charly22, Вы писали:

C>Всем привет!

C>Прошу подсказать, как избежать каскадного появления окон с сообщением, которые создаются ф-цией MessageBox() из модуля Windows.
C>То есть, если одно окно с сообщением появилось, то больше этих окон плодить не нужно.
C>Чтобы было понятно, я поясню.
C>Показ сообщения вызывается из обработчика события OnChange компонента TSpinEditor.
MessageBox блокирует поток выполнения пока не закроет окно.
Как костыль можно написать примерно так
  TForm1 = class(TForm)
    se1: TSpinEdit;
    se1_lock:boolean;
...
procedure TForm1.se1Change(Sender: TObject);
begin
  if not se1_lock then
  begin
    se1_lock:=true;
    MessageBox(Handle,'text','caption',MB_OK);
    se1_lock:=false;
  end;
end;


C>После появления первого окна выполнение обработчика OnChange не прекращается,

C>что вызывает появление все новых и новых окон пока не возникнет переполнение стека.
Подозреваю что проблема не в MessageBox, а втом что где-нибудь например из таймера вы меняете значение своему SpinEdit-у
Re[4]: Отследить наличие окна, созданного ф-цией MessageBox()
От: Alexander G Украина  
Дата: 31.05.17 08:13
Оценка:
Здравствуйте, Charly22, Вы писали:

C>Вы хотите сказать, что модальное окно не получится никак отследить? Не помогут ф-ции GetWindow() и FindWindowEx()?


Можно, но это несколько хак.
Имя класса у окна #32770, но лучше бы на это не полагаться.
Потом, могут быть другие MessageBox, не тот, и попробуй отфильтруй.
Русский военный корабль идёт ко дну!
Re: Отследить наличие окна, созданного ф-цией MessageBox()
От: wildwind Россия  
Дата: 31.05.17 08:47
Оценка:
Здравствуйте, Charly22, Вы писали:

C>Показ сообщения вызывается из обработчика события OnChange компонента TSpinEditor.


Вот в этом и ошибка. Не следует открывать окна (любые) "из обработчика события OnChange компонента TSpinEditor". Найди способ получше довести информацию (какую?) до пользователя.
Re[2]: Отследить наличие окна, созданного ф-цией MessageBox()
От: Charly22  
Дата: 31.05.17 20:54
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Вот в этом и ошибка. Не следует открывать окна (любые) "из обработчика события OnChange компонента TSpinEditor". Найди способ получше довести информацию (какую?) до пользователя.


Ситуация для меня прояснилась. Сейчас для меня стала очевидна бессмысленность попытки решить проблему путем блокировки появления новых окон.
Буду думать.
Благодарю всех за участие в обсуждении! Тема закрыта.
Re: Отследить наличие окна, созданного ф-цией MessageBox()
От: Кодт Россия  
Дата: 01.06.17 14:04
Оценка:
Здравствуйте, Charly22, Вы писали:

C>Показ сообщения вызывается из обработчика события OnChange компонента TSpinEditor.

C>После появления первого окна выполнение обработчика OnChange не прекращается,
C>что вызывает появление все новых и новых окон пока не возникнет переполнение стека.

<strateg mode on>
1. Если окно, владеющее контролом, задисаблено — не показывать диалог. (А задисаблено оно бывает, в частности, из-за того, что показан модальный диалог — и необязательно этот, но и любой другой).
2. Научиться отличать происхождение событий. OnChange возникает как вследствие действий пользователя — и тогда можно показать диалог, так и по инициативе программы. Собственно говоря, это увязывается с (1).
3. Устранять дребезг (если пользователь многажды покликал, то возникнет серия OnChange). Проще всего — взведением флажка "ой, уже работаем!" (задисабленость из (1) — разновидность такого флажка). Чуть сложнее — введением асинхронности: запускать одноразовый таймер, в обработчике которого показывать диалог.
</strateg mode off>
Перекуём баги на фичи!
Re: Отследить наличие окна, созданного ф-цией MessageBox()
От: RainBoy  
Дата: 05.06.17 14:48
Оценка:
Здравствуйте, Charly22, Вы писали:

C>Всем привет!

C>Прошу подсказать, как избежать каскадного появления окон с сообщением, которые создаются ф-цией MessageBox() из модуля Windows.
C>То есть, если одно окно с сообщением появилось, то больше этих окон плодить не нужно.
C>Чтобы было понятно, я поясню.
C>Показ сообщения вызывается из обработчика события OnChange компонента TSpinEditor.
C>После появления первого окна выполнение обработчика OnChange не прекращается,
C>что вызывает появление все новых и новых окон пока не возникнет переполнение стека.

Что мешает где-то хранить признак того, что оконо уже открыто, и не открывать его повторно? При закрытии окна сбрасывать этот признак.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[2]: Отследить наличие окна, созданного ф-цией MessageBox()
От: DarkMaster Украина http://www.bdslib.at.ua
Дата: 16.06.17 12:16
Оценка:
Здравствуйте, RainBoy, Вы писали:


C>>Прошу подсказать, как избежать каскадного появления окон с сообщением, которые создаются ф-цией MessageBox() из модуля Windows.


RB>Что мешает где-то хранить признак того, что оконо уже открыто, и не открывать его повторно? При закрытии окна сбрасывать этот признак.


Ну хотя бы то, что показывается системный MessageBox. Кодт правильно ситуацию обрисовал.
WBR, Dmitry Beloshistov AKA [-=BDS=-]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.