Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.137.192.3] |
|
Сообщ.
#1
,
|
|
|
Всех приветствую!
type TObjectProc = procedure of object; TMyObject = class procedure SimpleMethod; class procedure ClassMethod; end; procedure Test(Proc: TObjectProc); var Obj: TObject; begin if Proc is ОбычныйМетод then // как это сделать?! begin Obj := TObject(TMethod(Proc).Data); // ... end; else //... end; procedure TMyObject.SimpleMethod; begin // ... end; class procedure TMyObject.ClassMethod; begin // ... end; begin with TMyObject.Create do begin Test(SimpleMethod); // и так можно Free; end; Test(TMyObject.ClassMethod); // и так тоже end. Процедуре Test можно передать как обычный метод (procedure TMyClass.SimpleMethod), так и метод класса (class procedure TMyClass.ClassMethod). В первом случае в качестве доп. параметра передаётся указатель на объект (условно, PObject), а во втором – указатель на класс (условно, PClass). Для обычного метода TMethod(Proc).Data будет указывать на указатель на класс (т.е. по нулевому смещению будет адрес класса), а для метода класса TMethod(Proc).Data – это и есть указатель на класс, который содержит по нулевому смещению адрес таблицы виртуальных методов. Таким образом, непонятно, как определить – обычный метод переда функции Test в параметр Proc или метод класса. Может, кто-нибудь знает, как это сделать? Хорошо бы ещё найти инфу о внутренней структуре объекта и класса. Но если я не ошибаюсь, объект содержит лишь указатель на класс и поля (и больше никакой инфы). |
Сообщ.
#2
,
|
|
|
Нужно проверить, что TMethod(Proc).Data ссылается на образ exe. Если это так, значит Data - это TClass, в противном случае - это TObject
|
Сообщ.
#3
,
|
|
|
Цитата jack128 @ Нужно проверить, что TMethod(Proc).Data ссылается на образ exe. Если это так, значит Data - это TClass, в противном случае - это TObject Хитро ))) |