Delphi 将方法获取为文本

Delphi 将方法获取为文本,delphi,method-names,Delphi,Method Names,我需要保存一些属性并将其加载到数据库中,而我一直在处理这个问题。 我有一个表单,有几个方法和一个按钮。button.onclick事件被分配给表单的一个方法。 我需要像objectinspector form1.proc1一样,将指定方法的名称作为字符串获取,并将其保存到数据库中。稍后,我需要从数据库中获取方法名,并将button.onclick分配给相应表单的方法。 这可能吗 Form1 = class(TForm) ... procedure proc1(Sender: TObject);

我需要保存一些属性并将其加载到数据库中,而我一直在处理这个问题。 我有一个表单,有几个方法和一个按钮。button.onclick事件被分配给表单的一个方法。 我需要像objectinspector form1.proc1一样,将指定方法的名称作为字符串获取,并将其保存到数据库中。稍后,我需要从数据库中获取方法名,并将button.onclick分配给相应表单的方法。 这可能吗

Form1 = class(TForm)
...
procedure proc1(Sender: TObject);
procedure proc2(Sender: TObject);
procedure proc3(Sender: TObject);

Button1.OnClick = readMethodNameFromDatabase; 
...
saveMethodToDatabase(Button1.OnClick);

您可以获得一个名为的方法,如下所示:

function TForm1.MethodFromName(const Name: string): TNotifyEvent;
begin
  TMethod(Result).Data := Self;
  TMethod(Result).Code := MethodAddress(Name);
  if TMethod(Result).Code=nil then
    raise Exception.CreateFmt('Count not find method named %s', [Name]);
end;
Button1.OnClick := TNotifyEvent(MethodFromName('Button1Click'));
这是RTL在读取.dfm文件时使用的机制。它依赖于正在发布的方法

你可以这样称呼它:

function TForm1.MethodFromName(const Name: string): TNotifyEvent;
begin
  TMethod(Result).Data := Self;
  TMethod(Result).Code := MethodAddress(Name);
  if TMethod(Result).Code=nil then
    raise Exception.CreateFmt('Count not find method named %s', [Name]);
end;
Button1.OnClick := TNotifyEvent(MethodFromName('Button1Click'));
当然,您应该在最终代码中替换读取的数据库

至于问题的第二部分,您可以使用以下代码获取事件处理程序的名称:

MethodName(@Button1.OnClick);

您可以获得一个名为的方法,如下所示:

function TForm1.MethodFromName(const Name: string): TNotifyEvent;
begin
  TMethod(Result).Data := Self;
  TMethod(Result).Code := MethodAddress(Name);
  if TMethod(Result).Code=nil then
    raise Exception.CreateFmt('Count not find method named %s', [Name]);
end;
Button1.OnClick := TNotifyEvent(MethodFromName('Button1Click'));
这是RTL在读取.dfm文件时使用的机制。它依赖于正在发布的方法

你可以这样称呼它:

function TForm1.MethodFromName(const Name: string): TNotifyEvent;
begin
  TMethod(Result).Data := Self;
  TMethod(Result).Code := MethodAddress(Name);
  if TMethod(Result).Code=nil then
    raise Exception.CreateFmt('Count not find method named %s', [Name]);
end;
Button1.OnClick := TNotifyEvent(MethodFromName('Button1Click'));
当然,您应该在最终代码中替换读取的数据库

至于问题的第二部分,您可以使用以下代码获取事件处理程序的名称:

MethodName(@Button1.OnClick);

您试图解决的问题是什么,需要将方法的名称保存到数据库中?您可能可以使用RTTI来实现这一点,但我正在试图理解其背后的原因。您试图解决的问题是什么,需要将方法的名称保存到数据库中?您可能可以使用RTTI来实现这一点,但我正在试图理解其背后的原因;TMethodResult.Code:=MethodAddress'OnClick';始终返回nilOnClick是事件的名称。那不是你需要的。您需要传递表单中定义的方法的名称。例如,快速回复可能是Button1Click.thanxs,@david。现在我有点糊涂了。使用Form1.methodNameButton1.onclick仅当分配的函数Form1.button1Click的形式相同时有效。如果OnClick被分配给Form2.DoStuff,我必须调用Form2.methodname…,但是我怎么知道呢??不管怎么说,这对我很有用。好吧,你可以这样做。使用TObjectTMethod@Button1.OnClick.Data获取实现该方法的对象。然后对该对象调用MethodName.TMethodResult.Data:=Button1;TMethodResult.Code:=MethodAddress'OnClick';始终返回nilOnClick是事件的名称。那不是你需要的。您需要传递表单中定义的方法的名称。例如,快速回复可能是Button1Click.thanxs,@david。现在我有点糊涂了。使用Form1.methodNameButton1.onclick仅当分配的函数Form1.button1Click的形式相同时有效。如果OnClick被分配给Form2.DoStuff,我必须调用Form2.methodname…,但是我怎么知道呢??不管怎么说,这对我很有用。好吧,你可以这样做。使用TObjectTMethod@Button1.OnClick.Data获取实现该方法的对象。然后对该对象调用MethodName。