在方法体中获得方法自己的名字 ( 积分: 100 )

  • 主题发起人 张鸿林
  • 开始时间

张鸿林

Unregistered / Unconfirmed
GUEST, unregistred user!
function TAObject.Method;
begin
//在这里能够获得"TAObject.Method"的名字吗?
//self参数可以获得对象本身的引用,但,能否获得对象方法自己?
end;
 
function TAObject.Method;
begin
//在这里能够获得"TAObject.Method"的名字吗?
//self参数可以获得对象本身的引用,但,能否获得对象方法自己?
end;
 
试试className
 
self.classname可以得到类名
但我要的是方法名
Another_eYes等功底深厚者也许可以说出道道来?好像这位老兄不来了
 
为什么要这样做呢
 
TObject.MethodName,不过只能是published method
 
Tobjedt好象没有name属性
 
为什么要这样做呢
======================
我一般在方法的第一句验证用户是否有执行这个方法的权限
TAObject.Method1(Guid:string);
begin
if hasExecuteRight(Guid,'TAObject.Method1') then
do some thing;
end;
如果能够获得方法名,上述调用可以更灵活点.而且不会造成拼法错误
 
可以参考一下这个帖子:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1289838
 
谢谢thx1180,要的就是这个
我看一下,就回来结贴
 
还是不行:
procedure ExecuteRoutine(Obj: TObject
Name, Param: string);
var
PMethod: TMethod;
AProcedure: TProcedure;
begin
PMethod.Data := Pointer(Obj);
PMethod.Code := Obj.MethodAddress(Name);
if Assigned(PMethod.Code) then
begin
AProcedure := TProcedure(PMethod);
AProcedure(Param);
end;
end;

上面的关键代码在于 PMethod.Code := Obj.MethodAddress(Name);
我的问题是,不知道这个Name
 
你要的是像delphi代码自动完成的那样,方法名称,呵呵!去问Borland吧!
Delphi的代码自动完成机制是....
 
还有怎样知道自己的声明的变量名呢?
 
这跟代码自动完成还是不太一样
还有怎样知道自己的声明的变量名呢? ------这种需求就跟代码自动完成机制有关
 
我怎么觉得绕得慌,用户有没有执行过程的权限在调用这个过程前就可以很方便的决定,有什么必要在过程里判断。

即使在过程里判断
begin
if 用户权限<>可以操作 then Exit;
..........
..........
..........
end;
 
没看到楼主上面的说明

即使用 PMethod: TMethod;
也必须是Published方法才行。
 
我怎么觉得绕得慌,用户有没有执行过程的权限在调用这个过程前就可以很方便的决定,有什么必要在过程里判断。
===============
在外面判断是假的权限验证,在内部判断才是真验证
如果你写了个com组件,要求强访问安全,就必须在方法内部验证,否则,权限对其他程序员
形同虚设
 
type TOK = procedure (Sender: TObject) of object;
procedure TForm1.btn1Click(Sender: TObject);
var tt: TOK;
begin
tt := btn1Click;
ShowMessage(Form1.MethodName(@tt));
end;
 
// to: piao40993470 确实不错
//呵呵!不过还是有点麻烦,同样是取指针,用Pointer不更好呢?
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure TestIt(str: string);
procedure FuncIt(str: string
TE: Integer)
// 这里过程
procedure Button3Click(Sender: TObject);
private
{ Private declarations }

public
{ Public declarations }

end;

var
Form1: TForm1;

implementation

{$R *.dfm}
//uses QuickEmpolder;

//var
// Test: TQuickEmpolder;
procedure TForm1.FormCreate(Sender: TObject);
begin
//
end;

procedure TForm1.TestIt(str: string);
begin
showmessage(str)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
// Test := TQuickEmpolder.Create(self);
// Test.SysFunc.ExecuteRoutine(Form1, 'Button2Click', [button2]);
// Test.SysFunc.ExecuteRoutine(Form1, 'TestIt', ['test']);

end;



procedure TForm1.FuncIt(str: string
TE: Integer);
begin
ShowMessage(Str + IntToStr(TE));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
showmessage(sender.ClassName)
end;

procedure TForm1.Button3Click(Sender: TObject);
var
Func: Pointer;
begin
Func := @TForm1.Button3Click;
ShowMessage(Form1.MethodName(Func));
Func := @TForm1.TestIt;
ShowMessage(Form1.MethodName(Func));
Func := @TForm1.FuncIt;
ShowMessage(Form1.MethodName(Func));
end;

end.


 
顶部