Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.11.23;
Скачать: [xml.tar.bz2];

Вниз

SendMessage наследнику TObject   Найти похожие ветки 

 
DFT   (2008-10-11 16:22) [0]

Здравствуйте!

У меня следующий вопрос.
Как послать пользовательское сообщение экземпляру класса TObject, ведь у него нет дескриптора?

В тоже время сообщение я посылаю не именно TObject, а его наследнику, у которого есть метод обработки необходимого сообщения.
Но как мне тогда зарезервировать для моего переопределенного наследника TObject, дескриптор?


 
oxffff ©   (2008-10-11 16:28) [1]

procedure TObject.Dispatch(var Message);


 
oxffff ©   (2008-10-11 16:35) [2]


> oxffff ©   (11.10.08 16:28) [1]


Ну это если наследник использует динамические методы в качестве обработчика конкретных сообщений, если нет (он может сделать это централизовано в оконной процедуре через case, либо .. др. без опоры на динамические методы), тогда отладчик в руки.
Но в твоем случае я практически уверен хватит [1].


 
DFT   (2008-10-11 16:35) [3]

> procedure TObject.Dispatch(var Message);

А как быть с посылкой сообщения, ведь все функции требуют в качестве параметра дескриптор:

SendMessage(

   HWND hWnd, // handle of destination window
   UINT Msg, // message to send
   WPARAM wParam, // first message parameter
   LPARAM lParam  // second message parameter
  );

PostMessage(

   HWND hWnd, // handle of destination window
   UINT Msg, // message to post
   WPARAM wParam, // first message parameter
   LPARAM lParam  // second message parameter
  );


 
DFT   (2008-10-11 16:41) [4]

Извиняюсь, понял.
Надо вызывать именно метод Dispatch(var Message), для отправки
(сначала подумал что этот метод нужно перекрыть)


 
DFT   (2008-10-11 16:41) [5]

Да. И перекрыть его тоже нужно


 
oxffff ©   (2008-10-11 16:44) [6]

const WM_USER10=WM_USER+10;

type
TmyMessage=record
Msg: Word;
Txt:string;
end;

TMServer=class
public
procedure Message10(var Message: TmyMessage); message WM_USER10;
end;

procedure Useit;
var a:TmyMessage;
   b:TObject;
begin
a.Msg:=WM_USER10;
a.Txt:="This text is the inner parameter";
b:=TMServer.Create;
 try
 b.Dispatch(a);
 finally
 b.Free;
 end;
end;

procedure TMServer.Message10(var Message: TmyMessage);
begin
showmessage(Message.Txt);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Useit;
end;


 
oxffff ©   (2008-10-11 16:48) [7]


> DFT   (11.10.08 16:41) [5]
> Да. И перекрыть его тоже нужно


Перекрывать его не нужно, он сам лезет в интроспекцию класса и перенаправляет вызов.


 
DFT   (2008-10-11 16:50) [8]

Спасибо, теперь все понятно


 
Palladin ©   (2008-10-11 16:52) [9]

и в чем преимущество такого подхода перед простым вызовом метода?


 
oxffff ©   (2008-10-11 16:58) [10]


> Palladin ©   (11.10.08 16:52) [9]


Если это вопрос мне.  :)

То я бы ответил так, нет необходимости соблюдать

обеспечение полиморфизма без обязанности реализации базового двоичного контракта(читай!!! абстракный базовый класс aka интерфейс).
Это гибче. Но за гибкость придется заплатить скоростью вызова. ;)


 
Palladin ©   (2008-10-11 17:02) [11]


> Но за гибкость придется заплатить скоростью вызова. ;)

и безконтрольностью...


 
oxffff ©   (2008-10-11 17:05) [12]


> Palladin ©   (11.10.08 17:02) [11]


Это как?


 
Palladin ©   (2008-10-11 17:08) [13]

исполнение/неисполнение без контроля. слежение за определением непересекающихся значений констант WM для разных классов. короче, на кой это надо... больше проблем на мягкое место нежели полезностей для желудка...


 
oxffff ©   (2008-10-11 17:15) [14]


> Palladin ©   (11.10.08 17:08) [13]


Ну исполнение/не исполнение  решается просто

TmyMessage=record
Msg: Word;
ResultStatus:TNeededType;
Txt:string;
end;


> слежение за определением непересекающихся значений констант
> WM для разных классов.


А как тогда Windows вообще работает?
:)


> больше проблем на мягкое место нежели полезностей для желудка.
> ..


Вот это правда.
Здесь нужно четко понимать, что необходимо сейчас, что будет нужно завтра, и что было бы хорошо сделать послезавтра.
И выбрать вариант в зависимости от выразительности реализации выбранным вариантом нужной потребности.


 
oxffff ©   (2008-10-11 17:17) [15]


> выразительности реализации


Я бы еще добавил
Краткости и элегантности.


 
Palladin ©   (2008-10-11 17:24) [16]


> А как тогда Windows вообще работает?

У виндовса это реализовано совсем по другой причине. По причине архитектуры взаимодействия ОС и приложений, каковая есть именно событийная. Основным источником событий - является пользователь. Это логично. Самый простой выход для кучи приложений, даже просто элементов интерфейса, написанных на разных языках программирования. Но внутри самого приложения данная архитектура, на мой взгляд, абсолютно неоправданна. Всё что работает с пользователем и так работает через события. Все остальные задачи решаются более эффективно.


 
Palladin ©   (2008-10-11 17:24) [17]


> > выразительности реализации Я бы еще добавилКраткости и
> элегантности.

+ сто тыщ миллионов :) для себя же пишем...



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.11.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.032 c
4-1200314598
toboom
2008-01-14 15:43
2008.11.23
Расшаривание папок в Win XP


9-1175056682
Mr.Vlad
2007-03-28 08:38
2008.11.23
Media


2-1223818412
Yura
2008-10-12 17:33
2008.11.23
Где найти описание - DBGridEh? (или статью с примерами)


2-1223625754
asders
2008-10-10 12:02
2008.11.23
HotKey


2-1223623025
stas
2008-10-10 11:17
2008.11.23
dbf и кодировка





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский