Странная проблема с WindowProc контрола
От: GrayFace Россия http://www.grayface.chat.ru
Дата: 17.08.04 06:45
Оценка:
Заменяю TControl.WindowProc. В своей процедуре вызываю др. процедуры своего объекта. Но во время работы моей виндовой процедуры она вызывается еще раз!! Как быть? (обрабатваться должно последовательно)
Re: Странная проблема с WindowProc контрола
От: Softwarer http://softwarer.ru
Дата: 17.08.04 06:58
Оценка: +2
Здравствуйте, GrayFace, Вы писали:

GF>Заменяю TControl.WindowProc. В своей процедуре вызываю др. процедуры своего объекта. Но во время работы моей виндовой процедуры она вызывается еще раз!! Как быть? (обрабатваться должно последовательно)


Хм. Писать в коде то, что хочешь получить

"Само" ничего не происходит. Если процедура окна вызвана — значит, либо была обработка очереди сообщений, либо кто-то воспользоваться SendMessage или аналогичной функциональностью. Сохраняя "свою" логику, ты можешь только не делать этого сам и не вызывать методов, которые это делают. Как вариант, если это тебе подойдет, можешь отлавливать вложенный вызов и вызывать старую процедуру окна, не пытаясь его обработать.

Другой вопрос, что в качестве оконной процедуры странно видеть нечто, что должно вызываться строго определенным образом. Обработчик событий, которым является процедура окна, должен быть готов к самым необычным вариантам вызовов — иначе получается программа, которая "иногда падает".
Re: Странная проблема с WindowProc контрола
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 17.08.04 08:03
Оценка:
Здравствуйте, GrayFace, Вы писали:

GF>Заменяю TControl.WindowProc. В своей процедуре вызываю др. процедуры своего объекта. Но во время работы моей виндовой процедуры она вызывается еще раз!! Как быть? (обрабатваться должно последовательно)


А в др. процедурах нет никаких действий, которые бы воздействовали на твой контрол, отправляя в его очередь сообщений новое ? Если есть, то можно ввести доп. флаг "в обработке":

void TControl::WindowProc(...)
{
   if (!m_inProcess)
   {
      m_inProcess = true;
      ...
      m_inProcess = false;
   }
}
"Что не завершено, не сделано вовсе" Гаусс
Re[2]: Странная проблема с WindowProc контрола
От: GrayFace Россия http://www.grayface.chat.ru
Дата: 18.08.04 03:55
Оценка:
GF>>Заменяю TControl.WindowProc. В своей процедуре вызываю др. процедуры своего объекта. Но во время работы моей виндовой процедуры она вызывается еще раз!! Как быть? (обрабатваться должно последовательно)

S>А в др. процедурах нет никаких действий, которые бы воздействовали на твой контрол, отправляя в его очередь сообщений новое ? Если есть, то можно ввести доп. флаг "в обработке":


S>
S>void TControl::WindowProc(...)
S>{
S>   if (!m_inProcess)
S>   {
S>      m_inProcess = true;
S>      ...
S>      m_inProcess = false;
S>   }
S>}
S>

А что делать если m_InProcess = true? Не игнорировать же те сообщения, которые пришли параллельно.

Вроде ничего такого не вызываю. Единственное, что я вызываю — это предыдущая WindowProc.

ЗЫ: В C++ есть boolean?
Re[3]: Странная проблема с WindowProc контрола
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 18.08.04 06:49
Оценка:
Здравствуйте, GrayFace, Вы писали:

GF>А что делать если m_InProcess = true? Не игнорировать же те сообщения, которые пришли параллельно.

Тогда можно поподробнее о проблеме...

GF>Вроде ничего такого не вызываю. Единственное, что я вызываю — это предыдущая WindowProc.

Т.е. как в help-е описано — интересующие сообщения обрабатываешь сам, а все остальные в дефолтную процедуру? (думаю, что в Delphi не очень отличается)
void __fastcall TMyListBoxDescendant::SubClassWndProc(Messages::TMessage &Message)

{
  if (Message.Msg == WM_STYLEMESSAGE)
    Style = (TListBoxStyle)Message.WParam;
  else
    WndProc(Message);
}


GF>ЗЫ: В C++ есть boolean?

Есть bool
"Что не завершено, не сделано вовсе" Гаусс
Re: Странная проблема с WindowProc контрола
От: GrayFace Россия http://www.grayface.chat.ru
Дата: 19.08.04 02:36
Оценка:
Все. Я разобрался. Стандартная виндовская процедур, в ответ на некоторые сообщения, вызывает методы, которые снова вызывают ее. Теперь все просто.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.