Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.19;
Скачать: CL | DM;

Вниз

Результат обработки сообщения   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.066 c
3-1093279783
mouse_web
2004-08-23 20:49
2004.09.19
Запустить дополнительную форму параллельно процессу


14-1093867492
ydv
2004-08-30 16:04
2004.09.19
Метод Фолля


14-1094044391
Гость
2004-09-01 17:13
2004.09.19
Делаю в таймере ClientSocket.Open; через пол-часа выдает


1-1094191193
Asker
2004-09-03 09:59
2004.09.19
Расчет необходимой конфигурации оборудования


1-1094474696
pavelgr
2004-09-06 16:44
2004.09.19
переход курсора