Главная страница
    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.007 c
14-30536
Ильдар
2003-03-24 11:15
2003.04.10
Пернос приложения на др комп


14-30546
Oleg_Gashev
2003-03-23 23:08
2003.04.10
Frequently Unanswered Questions


3-30262
OneOfTheFew
2003-03-20 13:29
2003.04.10
DELPHI, Paradox и древовидные структуры данных


3-30294
romychk
2003-03-22 20:50
2003.04.10
Сбросить кеш на диск


1-30332
lory
2003-03-31 14:42
2003.04.10
многострочный текст в ячейке StringGrida





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский