Главная страница
    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
3-30306
yurikon03
2003-03-23 16:57
2003.04.10
Надо рубли отделить от копеек по-русски!


3-30212
MaggoT
2003-03-20 17:57
2003.04.10
Сортировка в обратном порядке


7-30628
Borys
2003-02-17 11:36
2003.04.10
Как послат message


1-30380
dusty2
2003-03-29 18:57
2003.04.10
Как поменять цвет шрифта в консольном приложении


3-30305
Sergant
2003-03-23 15:02
2003.04.10
Получение списка объектов MS SQL 6.5





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