Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.007 c
8-1199890749
AlexanderMS
2008-01-09 17:59
2009.11.15
Воспроизвести WAV из части файла.


15-1252140185
Пит
2009-09-05 12:43
2009.11.15
Перехват функций игры Battlefield 2


2-1254374205
Darvin
2009-10-01 09:16
2009.11.15
Программно назначить задание


4-1221216201
Riply
2008-09-12 14:43
2009.11.15
Работа с памятью в Kernel-mode.


2-1254066422
K_Lock
2009-09-27 19:47
2009.11.15
1 копия формы в MDI приложении




   Наверх