Конференция "WinAPI" » Перестали показываться MessageBox'ы [D7, Win2k]
 
  • GreyWolf © (03.02.11 00:43) [0]
    У меня есть программа где используется много разных компонентов, и в какой-то момент перестали показываться MessageBox'ы, включая даже прямые вызовы API-функций MessageBoxW & MessageBoxA. При их вызове заголовок главной формы становится неактивным (отрисовывается в этом цвете), хотя все контролы функционируют, и чтобы он снова стал в активном цвете, нужно переключиться на другое окно и обратно в главную форму, а сам MessageBox нигде не появлется.
    С чем это может быть связано?
  • KilkennyCat © (03.02.11 02:28) [1]

    > есть программа где используется много разных компонентов

    в остальных программах используется мало разных компонентов...

    код вызова?
  • clickmaker © (03.02.11 11:10) [2]
    MessageBox(...) <> 0 ?
  • Студент (03.02.11 13:10) [3]

    > хотя все контролы функционируют


    Какие у вас параметры в MessageBox()? На чём программа - чистый апи или кто?


    > При их вызове заголовок главной формы становится неактивным


    Хм... Что будет если после такого нажать на клавиатуре например кнопку Alt?
  • GreyWolf © (03.02.11 21:18) [4]

    > clickmaker ©   (03.02.11 11:10) [2]

    Да, действительно, возвращает ноль,
    Код вызова например такой:

         Res := MessageBoxA(Self.Handle, 'Search text not found', 'Error', MB_OK or MB_ICONERROR);
         if (Res = 0) then
         begin
           Self.sbStatus.SimpleText := 'Not enough memory!!!';
         end;


    Причем замена MessageBoxA на MessageBoxW и Application.MessageBox ничего не меняет. При этом в другом месте программы MessageBox ы вызываются всегда нормально (тот же поток, не понимаю в чем разница). "Недостаточно памяти" - не может быть, что причина в этом - для всего остального, включая создание разных форм и объектов, память есть!
    Пограмма на VCL + много сторонних компонентов.
    Я просто думаю, что может быть какие-то компоненты (madExcept, TMS (TNT) Unicode Controls, некоторые из JVCL, WmiConnection, TEmbeddedWB, еще что-нибудь) могут зачем-то перехватывать вызовы MessageBox или устанавливать какие-то хуки на создание окон, и приводить к такому "через раз" отрабатыванию диалогов.
    Клавиша Alt работает штатно.
  • QAZ (07.02.11 10:51) [5]
    сразу видно что не сам писал :D
    что есть Self.Handle ?
    и где связь между MessageBoxA=0 и 'Not enough memory!!!' ?????
  • GreyWolf (07.02.11 22:30) [6]
    Что значит не сам писал??? Self.Handle - HWND главной формы, owner window для окна диалога, код вызова находится в одной из процедур (методе) этой формы.
    Связь из справки:
    The return value is zero if there is not enough memory to create the message box.
    (Win32 Developer's Reference от Delphi 7, статья "MessageBox")

    Я конечно понимаю, на этом форуме принято почти всех по умолчанию считать студентами-недоучками, но это не всегда так.

    Пока проблема временно ОБОЙДЕНА использованием MessageDlg, предположительно дело в состоянии HWND Application и других окон, используемых в приложении.
  • clickmaker © (07.02.11 22:51) [7]
    > The return value is zero if there is not enough memory to
    > create the message box.
    > (Win32 Developer's Reference от Delphi 7, статья "MessageBox")

    чего гадать?

    if MessageBox() = 0 then
     RaiseLastWin32Error;
  • QAZ (08.02.11 14:05) [8]

    > Я конечно понимаю, на этом форуме принято почти всех по
    > умолчанию считать студентами-недоучками

    ну так и есть,только студенты читают справку делфи по апи функциям вместо msdn
    где собсна ясно сказано че делать если результат=0 и окно владелец нафиг не обязательно и может быть 0,а уш если надо то и писать form.handle  а не пугать компилятор своим словарным запасом
  • GreyWolf © (08.02.11 19:57) [9]

    > if MessageBox() = 0 then  RaiseLastWin32Error;


    Ошибка возникает только если третий параметр <> nil (заголовок окна)
    Код ошибки:
    1421: Control ID not found.
    Причину не понимаю.
  • QAZ (08.02.11 21:55) [10]
    аты собственно проверял на какой модуль мприходятся вызовы MessageBox
    может какойнить из твоей кучи "много разных компонентов" его переопределяет
    замени все вызовы "MessageBox" на "Windows.MessageBox" может че изменица
  • Плохиш © (10.02.11 09:48) [11]

    > QAZ   (08.02.11 21:55) [10]

    Ну зачем ты относишься к нему как к студенту-недоучке? Он же это в первую очередь проверил. Это всë баги в делфи и вындовс!
  • GrayFace © (10.02.11 12:12) [12]
    QAZ   (07.02.11 10:51) [5]
    > ну так и есть,только студенты читают справку делфи по апи
    > функциям вместо msdn где собсна ясно сказано че делать если
    > результат=0 и окно владелец нафиг не обязательно и может
    > быть 0,а уш если надо то и писать form.handle  а не пугать
    > компилятор своим словарным запасом

    Form1.Handle?! Это, сударь, неслыханное ламерство! Оно требут немедленого удаления верхних конечностей путем отрывания! Достопочтенный компилятор будет нагружен лишней работой, многоуважаемый кодер будет писать лишние буковки, а многострадальная форма сможет показываться только в 1 экземпляре.
    Окно-владелец тоже желательно - как я помню, на что-то оно влияет.
  • QAZ (10.02.11 13:05) [13]

    > Окно-владелец тоже желательно - как я помню, на что-то оно
    > влияет.

    пока не ответиш на сообщение не сможеш перейти в окну владельцу
    а с 0 никакие окна не блокируются
    смотря какие цели преследуеш, тем и пользуешся
 
Конференция "WinAPI" » Перестали показываться MessageBox'ы [D7, Win2k]
Есть новые Нет новых   [134431   +12][b:0][p:0.001]