![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оконная процедура и класс
RagE © (2004-08-20 09:27:00)Добрый день всем. Я вот вчера пробовал написать класс который будет на WinAPI окошко создавать и обрабатывать сообщения. Так вот столькнулся со следующей проблемой. Помещаю функцию WndProc внутрь класса, при заполнении структуры WNDCLASS компилятор кричит что ему нужна переменная. Кто нибудь сталкивался с таким? И вообще возможно ли это реализовать. Пробовал искать в исходниках делфийских форм но нифига не понял. Вернее не нашел где есть подобный момент.
RagE (2004-08-20 18:53:00) [1]jack128 © (20.08.04 17:40) [13]
Да вобщем такая затея наверное никчему. Обойдусь расположением WinProc как обычной функции вне класса.
jack128 (2004-08-20 17:40:00) [2]на вскидку такая идея:
Для каждого виндового оконного класса можно аллокировать дополнительную память (при регистрации класса - WNDCLASS.cbClsExtra) - запиши в эту память адрес твоего метода. А для каждого окна можно создать атом и записать в него твой объект, ассоциированный с этим окном (как в VCL ControlAtom). Соответственно в оконной процедуре ты видираешь адрес метода и объект и вызываешь этот метод..
Digitman (2004-08-20 16:15:00) [3]
> RagE © (20.08.04 16:03) [10]
ну если ты его "один в один" содрал, со всеми зависимостями, то - конечно)
тады и вся затея твоя выеденного яйца не стоит, если тянешь за собой те же самые стандартные модули
Darthman (2004-08-20 16:09:00) [4]Так а в чем была проблема, может быть я без мейкобджектинстансе помочь смогу?
RagE (2004-08-20 16:03:00) [5]Darthman © (20.08.04 15:47) [9]
Все проблемы больше нет. помог makeobjectinstance. Хотя он же породил проблему увеличения бинарника.
Darthman (2004-08-20 15:47:00) [6]Прочитал ветку, но проблему так и не понял.
RagE (2004-08-20 12:53:00) [7]Digitman © (20.08.04 11:29) [7]
Cпасибо за наводку. Буду смотреть
Digitman (2004-08-20 11:29:00) [8]
> KSergey © (20.08.04 11:13) [6]
> Разве???
а мне вот не очевидно, под этой фразой можно понимать все что угодно, к тому же в эту кашу попадает упоминание WNDCLASS и посему непонятно, о каком классе идет речь - то ли о классе окна то ли о собственном создаваемом классе
> RagE © (20.08.04 10:59) [5]
ты бы посмотрел для начала внимательно, как это реализовано в ф-ции AllocateHWND() у самого Борланда и сделал бы собственную реализацию по образу и подобию, почерпнув из борландовской реализации только самые необходимые ключевые моменты во всей этой петрушке
KSergey (2004-08-20 11:13:00) [9]> [4] Digitman © (20.08.04 09:51)
> > имелось ввиду, что WinProc - метод
> из авторского описания это вовсе не очевидно
Разве???
> RagE © (20.08.04 09:27)
> Помещаю функцию
> WndProc внутрь класса
RagE (2004-08-20 10:59:00) [10]KSergey © (20.08.04 09:40) [2]
По такому пути и пришлось идти
jack128 © (20.08.04 09:44) [3]
в исходники смотрел но так нифига и не понял, не нашел я там места где это реализовано, может конечно плохо искал.
Digitman © (20.08.04 09:51) [4]
в том то и дело что до конца не понимаю.
Digitman (2004-08-20 09:51:00) [11]
> jack128 © (20.08.04 09:44) [3]
> имелось ввиду, что WinProc - метод
из авторского описания это вовсе не очевидно
но, думаю, автор действительно не видит и/или не понимает разницы между просто функциейи функциональным методом класса
jack128 (2004-08-20 09:44:00) [12]
> Помещаю функцию WndProc внутрь класса
>
>
> это как ? поясни кодом ...
ИМХО, имелось ввиду, что WinProc - метод..
> при заполнении структуры WNDCLASS компилятор кричит что
>
> > ему нужна переменная
Там суть в том, что у тя WinProc - метод, то есть процедура, в которую первым неявным параметром передается Self. У тя список параметров в WinProc будт отличаться от необходимого.. Если WinProc обязательно должна быть методом, то см в сторону MakeObjectInstance.. И вообще в сторону TWinControl/TCustomForm , там все это уже делалось..
KSergey (2004-08-20 09:40:00) [13]Да, для запихавния в класс оконной процедуры надо попотеть. Штука в том, что при вызове любого метода из любого класса ему неявно передается указатель на экземпляр объекта. Понятно, что ни о каких экземплярах никаких объектов никакая виндовс не знает.
Насколько я понимаю, фактически всегда получается, что делается некая универсальная единая процедура (все класса), которая собственно и привязывается всем окнам. Связь окон и экземпляров объектов обеспечивается либо внешними структурами, либо через приписывание доп. параметров виндовому окну при создании экземпляра. А уже из этой общей процедуры вызывается метод соотв. экземпляра объекта, связанного с данным окном.
Digitman (2004-08-20 09:33:00) [14]
> Помещаю функцию WndProc внутрь класса
это как ? поясни кодом ...
> при заполнении структуры WNDCLASS компилятор кричит что
> ему нужна переменная
если кричит, дай ему переменную)... все равно не отстанет
а еще лучше приведи сюда свой проблемный код ..