Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.11.15;
Скачать: CL | DM;

Вниз

Список методов в 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
2-1254209623
yantux
2009-09-29 11:33
2009.11.15
Повтороный выбор файла компонентом TOpenDialog


15-1252166005
TIF
2009-09-05 19:53
2009.11.15
Упаковка (сжатие) исполняемых файлов - за и против


15-1253048409
Германн
2009-09-16 01:00
2009.11.15
Ещё о Windows CE


1-1224572864
Gurd
2008-10-21 11:07
2009.11.15
TXMLDocument


2-1254405490
Blondin
2009-10-01 17:58
2009.11.15
Антикейлоггер