Форум: "Начинающим";
Текущий архив: 2009.11.15;
Скачать: [xml.tar.bz2];
ВнизСписок методов в published Найти похожие ветки
← →
Damon (2009-09-28 07:57) [0]Подскажите как получить список всех методов в published ? Функцией MethodAdress я могу определить существование определенного метода в классе, но как получить весь список? Спасибо.
← →
Leonid Troyanovsky © (2009-09-28 08:18) [1]
> Damon (28.09.09 07:57)
> Подскажите как получить список всех методов в published
http://rsdn.ru/?forum/delphi/1162818.1.aspx
--
Regards, LVT.
← →
Damon (2009-09-28 08:37) [2]Либо я что-то не так делаю, либо процедура эта работает не правильно. Например:
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...
← →
MBo © (2009-09-28 08:39) [3]>Результат: "Button1Click" который не находится в секции Published...
Как раз таки в этой секции он и находится (секция по умолчанию в начале объявления класса - published)
← →
Damon (2009-09-28 08:46) [4]да, извиняюсь за неграмотность. Спасибо большое.
← →
Дмитрий С © (2009-09-28 09:03) [5]
> asm
> mov EAX, [aClass]
> mov EAX,[EAX].vmtMethodTable { fetch pointer to
> method table }
> mov [aTable], EAX
> end;
А тут без асма никак чтоли?
← →
Юрий Зотов © (2009-09-28 10:38) [6]> секция по умолчанию в начале объявления класса - published
Для тех классов, которые либо сами откомпилированы с опцией {$M+}, либо отнаследованы от классов, откомпилированых с опцией {$M+} (в VCL это класс TPersistent и все его потомки).
Для остальных классов дефолтная секция - public.
← →
Юрий Зотов © (2009-09-28 10:38) [7]> секция по умолчанию в начале объявления класса - published
Для тех классов, которые либо сами откомпилированы с опцией {$M+}, либо отнаследованы от классов, откомпилированых с опцией {$M+} (в VCL это класс TPersistent и все его потомки).
Для остальных классов дефолтная секция - public.
← →
MBo © (2009-09-28 15:19) [8]>откомпилированых с опцией {$M+}
Да, действительно, забыл про эти грабли...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.11.15;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c