Заменяю TControl.WindowProc. В своей процедуре вызываю др. процедуры своего объекта. Но во время работы моей виндовой процедуры она вызывается еще раз!! Как быть? (обрабатваться должно последовательно)
Здравствуйте, GrayFace, Вы писали:
GF>Заменяю TControl.WindowProc. В своей процедуре вызываю др. процедуры своего объекта. Но во время работы моей виндовой процедуры она вызывается еще раз!! Как быть? (обрабатваться должно последовательно)
Хм. Писать в коде то, что хочешь получить
"Само" ничего не происходит. Если процедура окна вызвана — значит, либо была обработка очереди сообщений, либо кто-то воспользоваться SendMessage или аналогичной функциональностью. Сохраняя "свою" логику, ты можешь только не делать этого сам и не вызывать методов, которые это делают. Как вариант, если это тебе подойдет, можешь отлавливать вложенный вызов и вызывать старую процедуру окна, не пытаясь его обработать.
Другой вопрос, что в качестве оконной процедуры странно видеть нечто, что должно вызываться строго определенным образом. Обработчик событий, которым является процедура окна, должен быть готов к самым необычным вариантам вызовов — иначе получается программа, которая "иногда падает".
Здравствуйте, GrayFace, Вы писали:
GF>Заменяю TControl.WindowProc. В своей процедуре вызываю др. процедуры своего объекта. Но во время работы моей виндовой процедуры она вызывается еще раз!! Как быть? (обрабатваться должно последовательно)
А в др. процедурах нет никаких действий, которые бы воздействовали на твой контрол, отправляя в его очередь сообщений новое ? Если есть, то можно ввести доп. флаг "в обработке":
void TControl::WindowProc(...)
{
if (!m_inProcess)
{
m_inProcess = true;
...
m_inProcess = false;
}
}
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?
Здравствуйте, 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
Все. Я разобрался. Стандартная виндовская процедур, в ответ на некоторые сообщения, вызывает методы, которые снова вызывают ее. Теперь все просто.