Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-30386
Provodnick
2003-03-30 00:52
2003.04.10
Пара вопросов о таймере и о дереве каталогов...


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


8-30468
jeka
2003-01-08 09:44
2003.04.10
Перенаправление звукового потока


14-30515
Supreme 2
2003-03-23 19:11
2003.04.10
Активность форума


14-30517
Igo
2003-03-20 08:01
2003.04.10
Компоненты из набора Indy - TIdCoderMD5





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский