Главная страница
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.015 c
14-30551
Supreme 2
2003-03-23 17:14
2003.04.10
Первые плоды творчества


3-30282
Джоник
2003-03-21 12:03
2003.04.10
Ккак считать видимые на экране данные из БД InterBase в DBGrid


1-30389
KykQx
2003-03-30 07:22
2003.04.10
список всех открытых в системе файлов


4-30653
Inquirer
2003-02-10 14:17
2003.04.10
Edit Control Messages


1-30432
Songoku
2003-03-30 16:01
2003.04.10
Помогите!!! Если я создал несколько RadioButton как мне создать..