![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Результат обработки сообщения [D5, Win2k]
Fktrc © (2004-08-31 08:21:00)Привет, ALL.
Судя по хелпу, SendMessage возвращает результат обработки сообщения, причем результат зависит от посланного сообщения.
Передо мной следующая проблема. Я посылаю самопальное сообщение от второстепенного потока главной форме. У формы перегружен метод WndProc, в нем я и обрабатываю сообщения
if Msg.Msg = WM_MyMessage then begin
DoSomething (Msg.WParam, Msg.LParam);
end;
Каким образом мне передать результат обработки сообщения так, чтобы SendMessage из второстепенного потока возвратила этот результат?
KSergey (2004-09-07 07:58:00) [1]> [10] delphi32 (07.09.04 06:48)
> PS Если сообщение не является стандартным, то его надо регистрить
> самому, поэтому его номер становится известным только во
> время выполнения программы, при компиляции он недоступен,
> и конструкция вида procedure WMMyMessage(var Message: TMessage);
> message WM_MyMessage; не может быть откомпилирована.
Да ну???
Ой, спасибо подсказал, а то я именно такую конструкцию и использую. Хоть буду знать, что она не компилируется (компилятор, видимо, нагло молчит об этом)
Другое дело, что этой констранте WM_MyMessage я сам назначаю некое значение из допустимого диапазона... см. [11]
Sergey Kaminski (2004-09-07 07:02:00) [2]
PS Если сообщение не является стандартным, то его надо регистрить самому
Ну, зачем же так строго :(
Only use RegisterWindowMessage when more than one application must process the same message. For sending private messages within a window class, an application can use any integer in the range WM_USER through 0x7FFF. (Messages in this range are private to a window class, not to an application)
Win32 Programmer's refference.
delphi32 (2004-09-07 06:48:00) [3]PS Если сообщение не является стандартным, то его надо регистрить самому, поэтому его номер становится известным только во время выполнения программы, при компиляции он недоступен, и конструкция вида
procedure WMMyMessage(var Message: TMessage); message WM_MyMessage;не может быть откомпилирована.
Взято из примера Григорьева Антона DksView.
Fktrc (2004-09-02 12:38:00) [4]Всем спасибо. Все принято к сведению, особенно сообщение GuAV
KSergey (2004-09-02 10:20:00) [5]> [3] Fktrc (01.09.04 19:10)
А нафиг вообще инхеритеть свои сообщения-то?
Впрочем, [4] GuAV © (01.09.04 23:45)уже писал об этом.
Digitman (2004-09-02 09:22:00) [6]
> Например, сообщения с Handle=HWND_BROADCAST нельзя так словить
это почему же ?
если окно формы является top-level-окном, то оно обязательно будет принимать бродкаст-сообщения
procedure TControl.WndProc(var Message: TMessage);
..
begin
...
Dispatch(Message); //вот здесь и произойдет вызов вышеупомянутого метода
end;
procedure TCustomForm.WndProc(var Message: TMessage);
..
begin
..
inherited WndProc(Message);
end;
Defunct (2004-09-02 09:02:00) [7]> стоило ли так извращаться ?
вполне возможно, что стоило.
> procedure WMMyMessage(var Message: TMessage); message WM_MyMessage;
не всегда работает. Например, сообщения с Handle=HWND_BROADCAST нельзя так словить.
Digitman (2004-09-02 08:34:00) [8]
> У формы перегружен метод WndProc
стоило ли так извращаться ? все намного проще :
type
TMyForm = class(..)
..
private
procedure WMMyMessage(var Message: TMessage); message WM_MyMessage;
..
end;
...
procedure TMyForm.WMMyMessage(var Message: TMessage);
begin
Message.Result := DoSomething (Message.WParam, Message.LParam);
end;
GuAV (2004-09-01 23:45:00) [9]
> begin
> inherited; //выполняем всё то, что должно происходить
> при поступлении сообщения окну
>
> //Если пришло моё сообщение - выполняем следующий код
> if Msg.Msg = WM_MyMessage then begin
> Msg.Result := DoSomething (Msg.WParam, Msg.LParam);
> end;
Имхо лучше так:
if Msg.Msg = WM_MyMessage then begin
Msg.Result := DoSomething (Msg.WParam, Msg.LParam);
end
else
inherited; //выполняем всё то, что должно происходить при поступлении сообщения окну
Fktrc (2004-09-01 19:10:00) [10]По результатам экспериментов выяснил, что для корректного возврата результата метод WndProc должен выглядеть примерно так:
procedure TFMain.WndProc(var Msg: TMessage);
begin
inherited; //выполняем всё то, что должно происходить при поступлении сообщения окну
//Если пришло моё сообщение - выполняем следующий код
if Msg.Msg = WM_MyMessage then begin
Msg.Result := DoSomething (Msg.WParam, Msg.LParam);
end;
т.е. inheritedдолжен стоять до обработки своего сообщения. Иначе SendMessage возвратит нуль.
Fktrc (2004-08-31 09:29:00) [11]Тьфу, блин, настолько элементарно.
Спасибо!
KSergey (2004-08-31 08:27:00) [12]Msg.Result