Форум: "Основная";
Текущий архив: 2003.04.10;
Скачать: [xml.tar.bz2];
ВнизКак найти названия и адреса методов Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.006 c