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

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

деректива message


Страницы:   1 2

JaDS ©   (2005-01-28 17:22:00) 

Опишу задачу:
Хочу создать свою библиотеку на подобии VCL (тортами не кидаться, знаю что идея попсовая, но мне надо не аналог VCL, а лишь несколько компонентов часто мною используемые).

Как я это делаю (пример):

TForm = object
public
 Create...
 Destroy...
end;


Ну вобщем форма создаётся и разрушается. А теперь я хочу чтобы форма обрабатывала допустим WM_PAINT. На текущий момент мне приходится для каждого типа писать отдельную оконную процедуру, причём независимую от класса, что очень не удобно и никак не вяжется с ООП. Но в то же время сама делфи очень легко это обходит используя дерективу message.

Теперь сам ворос:
если я допишу в своё определение типа строчку:

procedure WMPaint(var Message: TWMPaint); message WM_PAINT;

то как заставить её вызываться???

Наблюдения:
Если ту же самую строчку добавить в VCL'овский тип TForm, то вызов этой процедуры происходит из процедуры TControl.WndProc >>> TObject.Dispatch

PS:
вообще кто нибудь представляет механизм работы дерективы message???


PVOzerski   (2005-01-28 18:22:00) [21]

Уточняю: если вызвать Dispatch и передать ему tMessage, будет вызван соответствующий метод этого объекта. Когда я пытался написать сабж для FreePascal (где-то дома нечто недоделанное так и валяется), я вызывал Dispatch из WndProc своих винконтролов, а этот WndProc вызывал из оконного callback'а. Чтобы добраться до адреса объекта, загонял его в класс окошка через SetWindowLong по смещению GWL_USERDATA а при вызове CallBack'а извлекал обратно через GetWindowLong. Замечу, что в настоящей VCL это всё сделано не так. Но работал и такой способ. Правда, стОит подумать, как избежать возможных проблем с разными нитями в моменты "прикрепления" объекта к окну.


PVOzerski   (2005-01-28 18:08:00) [22]

>и они даже смогут привести рабочий пример?
Кидания тортом в репу? :^)

Если серьезно, посмотри описание tObject.Dispatch и tObject.DefaultHandler.


JaDS   (2005-01-28 17:36:00) [23]

2Digitman:
вообще то вопрос был "как заставить её вызываться???"а не про торты...

уточню проблему:

procedure TForm.Create;
var
 wc: TWndClassExW;
 ...
begin
 ...
 wc.lpfnWndProc:=???
 ...
end;

Так вот что именно тогда присваивать этому полю? Как уже писал на текущий момент приходится для каждого класса писать свою оконную процедуру и присваивать этому полю её адрес, но тогда про перекрытие метода в потомках можно забыть, а мне нужно чтобы именно была возможность переопределения.

>оч многие ув.коллеги оч даже четко себе сей механизм предствляют
и они даже смогут привести рабочий пример?


Digitman   (2005-01-28 17:28:00) [24]


> тортами не кидаться


чей-то сразу "тортами" ? а навозом в торцевую часть репы не желаете ли ?) .. гораздо ощутимей, скажу я Вам )..


> вообще кто нибудь представляет механизм работы дерективы
> message


а как же !
и, думаю, оч многие ув.коллеги оч даже четко себе сей механизм предствляют ..

и сводится он к call [РОН + оффсет]


Страницы:   1 2

Наверх

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