![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Список методов в published [D7, XP]
Damon © (2009-09-28 07:57:00)Подскажите как получить список всех методов в published ? Функцией MethodAdress я могу определить существование определенного метода в классе, но как получить весь список? Спасибо.
MBo (2009-09-28 15:19:00) [1]>откомпилированых с опцией {$M+}
Да, действительно, забыл про эти грабли...
Юрий Зотов (2009-09-28 10:38:00) [2]> секция по умолчанию в начале объявления класса - published
Для тех классов, которые либо сами откомпилированы с опцией {$M+}, либо отнаследованы от классов, откомпилированых с опцией {$M+} (в VCL это класс TPersistent и все его потомки).
Для остальных классов дефолтная секция - public.
Юрий Зотов (2009-09-28 10:38:00) [3]> секция по умолчанию в начале объявления класса - published
Для тех классов, которые либо сами откомпилированы с опцией {$M+}, либо отнаследованы от классов, откомпилированых с опцией {$M+} (в VCL это класс TPersistent и все его потомки).
Для остальных классов дефолтная секция - public.
Дмитрий С (2009-09-28 09:03:00) [4]
> asm
> mov EAX, [aClass]
> mov EAX,[EAX].vmtMethodTable { fetch pointer to
> method table }
> mov [aTable], EAX
> end;
А тут без асма никак чтоли?
Damon (2009-09-28 08:46:00) [5]да, извиняюсь за неграмотность. Спасибо большое.
MBo (2009-09-28 08:39:00) [6]>Результат: "Button1Click" который не находится в секции Published...
Как раз таки в этой секции он и находится (секция по умолчанию в начале объявления класса - published)
Damon (2009-09-28 08:37:00) [7]Либо я что-то не так делаю, либо процедура эта работает не правильно. Например:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure GetMethodNames(aClass: TClass; List: TStrings);
type
TMethodTable = packed record
Count: SmallInt;
//[...methods...]
end;
var
aTable : ^TMethodTable;
aName : ^ShortString;
K : Integer;
begin
List.BeginUpdate;
try
while aClass <> nil do
begin
asm
mov EAX, [aClass]
mov EAX,[EAX].vmtMethodTable { fetch pointer to method table }
mov [aTable], EAX
end;
if aTable <> nil then
begin
aName := Pointer(PChar(aTable) + 8);
for K := 1 to aTable.Count do
begin
if List.IndexOf (aName^) < 0 then
List.Add (aName^);
aName := Pointer(PChar(aName) + length(aName^) + 7)
end;
end;
aClass := aClass.ClassParent;
end;
finally
List.EndUpdate;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
Var
SL:TStringList;
begin
SL:=TStringList.Create;
try
GetMethodNames(TForm1, SL);
ShowMessage(SL.Text);
finally
SL.Free;
end;
end;
end.
Результат: "Button1Click" который не находится в секции Published...
Leonid Troyanovsky (2009-09-28 08:18:00) [8]
> Damon (28.09.09 07:57)
> Подскажите как получить список всех методов в published
http://rsdn.ru/?forum/delphi/1162818.1.aspx
--
Regards, LVT.