Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.10;
Скачать: CL | DM;

Вниз

Как найти названия и адреса методов   Найти похожие ветки 

 
Sergey   (2003-03-31 18:47) [0]

Заранее спасибо за возможные предложения.
Как найти названия и адреса всех методов которые объявлены в published?


 
Mike_Goblin ©   (2003-03-31 20:29) [1]

Использовать RTTI
http://shop.biblio-globus.ru/cpr/RTTI.htm

Только в стандартных VCL классах методы в published не объявляют


 
vuk ©   (2003-03-31 20:38) [2]

to Mike_Goblin:
>Только в стандартных VCL классах методы в published не объявляют
А как же обработчики событий в формах? Или они к классам VCL не относятся? :o)


 
Юрий Зотов ©   (2003-04-01 01:26) [3]

> Mike_Goblin © (31.03.03 20:29)

Таким образом можно получить список свойств и событий. С методами будет посложнее - надо ручками пройти по MDT (method definition table - смещение vmtMethodTable от VMT).



> Как найти названия и адреса всех методов которые объявлены в
> published?

Этот код использует недокументированную структуру MDT, однако работает начиная с Delphi 1 по сей день (естественно, с учетом различий адресации в Win16 и Win32). Это значит, что за все время существования Delphi структура MDT не менялась и, вроде бы, нет оснований полагать, что такая необходимость возникнет в дальнейшем (хотя исключить этого полностью все же нельзя). Во всяком случае, в D5 код работает, а в остальных можете проверить сами.

Написано на основе кода Сергея Орлика из его книги, а также исходников System, TObject.MethodName и TObject.MethodAddress.


procedure GetMethodList(AClass: TClass; List: TStrings; IncludeParents: boolean);
var
P: pointer;
N: word;
i: integer;
S: ShortString;

procedure IncAddr(Offset: integer);
begin
P := Pointer(Integer(P) + Offset)
end;

begin
if AClass <> nil then
begin
P := AClass;
IncAddr(vmtMethodTable);
P := Pointer(P^);
if P <> nil then
begin
N := Word(P^);
IncAddr(2);
for i := 0 to N - 1 do
begin
IncAddr(6);
S := ShortString(P^);
List.AddObject(S, TObject(AClass.MethodAddress(S)));
IncAddr(Byte(P^) + 1)
end
end;
if IncludeParents then GetMethodList(AClass.ClassParent, List, True)
end
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Clear;
GetMethodList(ClassType, ListBox1.Items, True)
end;



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

Текущий архив: 2003.04.10;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.016 c
1-30455
Pokemon
2003-03-31 12:23
2003.04.10
Файлы проекта


14-30511
Archon Kazansky
2003-03-20 09:33
2003.04.10
---|Ветка была без названия|---


3-30270
_dron_
2003-03-21 15:10
2003.04.10
Как подключить к базе в ReadOnly


14-30555
Marser
2003-03-24 16:33
2003.04.10
Графитовая бомба


3-30283
KPY
2003-03-22 10:23
2003.04.10
Помогите с конвертацией типа