Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1094034749
Wolfram
2004-09-01 14:32
2004.09.19
Проблема с dxDBGrid


3-1092903418
Вера
2004-08-19 12:16
2004.09.19
TreeView


14-1092885095
КаПиБаРа
2004-08-19 07:11
2004.09.19
Тестирование ПО под разными OS


3-1092908803
Zhekson
2004-08-19 13:46
2004.09.19
Навигация по таблице


1-1094188938
Death
2004-09-03 09:22
2004.09.19
Настройка внутренней сети





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский