Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Результат обработки сообщения [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо