Форум: "Основная";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
ВнизРезультат обработки сообщения Найти похожие ветки
← →
Fktrc (2004-08-31 08:21) [0]Привет, ALL.
Судя по хелпу, SendMessage возвращает результат обработки сообщения, причем результат зависит от посланного сообщения.
Передо мной следующая проблема. Я посылаю самопальное сообщение от второстепенного потока главной форме. У формы перегружен метод WndProc, в нем я и обрабатываю сообщения
if Msg.Msg = WM_MyMessage then begin
DoSomething (Msg.WParam, Msg.LParam);
end;
Каким образом мне передать результат обработки сообщения так, чтобы SendMessage из второстепенного потока возвратила этот результат?
← →
KSergey © (2004-08-31 08:27) [1]Msg.Result
← →
Fktrc (2004-08-31 09:29) [2]Тьфу, блин, настолько элементарно.
Спасибо!
← →
Fktrc (2004-09-01 19:10) [3]По результатам экспериментов выяснил, что для корректного возврата результата метод 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 возвратит нуль.
← →
GuAV © (2004-09-01 23:45) [4]
> 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; //выполняем всё то, что должно происходить при поступлении сообщения окну
← →
Digitman © (2004-09-02 08:34) [5]
> У формы перегружен метод 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;
← →
Defunct © (2004-09-02 09:02) [6]> стоило ли так извращаться ?
вполне возможно, что стоило.
> procedure WMMyMessage(var Message: TMessage); message WM_MyMessage;
не всегда работает. Например, сообщения с Handle=HWND_BROADCAST нельзя так словить.
← →
Digitman © (2004-09-02 09:22) [7]
> Например, сообщения с 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;
← →
KSergey © (2004-09-02 10:20) [8]> [3] Fktrc (01.09.04 19:10)
А нафиг вообще инхеритеть свои сообщения-то?
Впрочем, [4] GuAV © (01.09.04 23:45) уже писал об этом.
← →
Fktrc (2004-09-02 12:38) [9]Всем спасибо. Все принято к сведению, особенно сообщение GuAV
← →
delphi32 (2004-09-07 06:48) [10]PS Если сообщение не является стандартным, то его надо регистрить самому, поэтому его номер становится известным только во время выполнения программы, при компиляции он недоступен, и конструкция вида
procedure WMMyMessage(var Message: TMessage); message WM_MyMessage;
не может быть откомпилирована.
Взято из примера Григорьева Антона DksView.
← →
Sergey Kaminski © (2004-09-07 07:02) [11]
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.
← →
KSergey © (2004-09-07 07:58) [12]> [10] delphi32 (07.09.04 06:48)
> PS Если сообщение не является стандартным, то его надо регистрить
> самому, поэтому его номер становится известным только во
> время выполнения программы, при компиляции он недоступен,
> и конструкция вида procedure WMMyMessage(var Message: TMessage);
> message WM_MyMessage; не может быть откомпилирована.
Да ну???
Ой, спасибо подсказал, а то я именно такую конструкцию и использую. Хоть буду знать, что она не компилируется (компилятор, видимо, нагло молчит об этом)
Другое дело, что этой констранте WM_MyMessage я сам назначаю некое значение из допустимого диапазона... см. [11]
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.033 c