![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
деректива message
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 [РОН + оффсет]