我把菜单项的click方法名都存在数据库表中,但是我把方法名从数据库中取出来是String类型,无法与菜单项的Click事件(方法类型)匹配,我想问的就是有什么办法可以把字符串类型转换为方法类型嘛?请给代码~谢谢

解决方案 »

  1.   

    查阅 RTTI的相关资料,
    查阅 TypInfo单元的函数的使用方法
      

  2.   

     TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      published
         procedure test(str: string);
        { Public declarations }
      end;procedure TForm1.test(str: string);
    begin
      ShowMessage(str);
    end;procedure TForm1.Button1Click(Sender: TObject);
    type
      Test = procedure(AObj : TObject; str: string);
    var
      TAddress: Pointer;
      T1: Test;
    begin
      TAddress := Form1.MethodAddress('test');
      T1 := Test(TAddress);
      T1(nil, '123');
    end;
      

  3.   

    //在窗体中建下面这个方法就解决了,TMyForm代表你的菜单所在的窗体
    function TMyForm.GetMenuClickedMethod(const ClickMethodName: string): TNotifyEvent;
    begin 
      //TNotifyEvent是一个TMethod结构
      TMethod(Result).Data := Self;
      //TObject.MethodAddress可以获取published方法
      TMethod(Result).Code := MethodAddress(ClickMethodName);
    end;
      

  4.   

    谢谢caowm!但是现在我们经理又要我把MDI窗口的名称存入数据库,然后再取出打开,我想一样会遇到这个问题,这个有没有办法改成这样了?
    这是我打开MDI子窗口的代码:procedure tform17.OpenA(sender:TObject);
    begin
        if not Assigned(Form1)   then //判断子窗体是否已打开
       begin
       Form1:=TForm1.Create(Self);
       Form1.Show;
       end
       else Form1.BringToFront;
    end;我就是想把Form1改成字符串类型哈,麻烦了~