如何获取窗体中Button1按钮当前的onClick事件的名称 
默认当前是:'Button1Click',
可以把'Button1Click'做为一个字符串赋值给变量abc。
当我showmessage(abc);
可以显示'Button1Click'
怎么实现?

解决方案 »

  1.   

    呵呵,需求还挺奇怪,能实现,不过麻烦点。去处理控件的消息响应过程吧WndProc(var Message: TMessage);。控件名称+消息类型就是你要的东西。
      

  2.   

    不知道楼主具体要干什么,为什么要这种东西,好像没有实际意义。
    不过研究VCL框架,就应该知道有这种代码在dfm中。
      object Button1: TButton
        Left = 256
        Top = 272
        Width = 75
        Height = 25
        Caption = #21457#36865#20449#24687
        TabOrder = 0
        OnClick = Button1Click
      end
      

  3.   

    OnClick指定了事件处理函数Button1Click,不过这个不是字符串'Button1Click',不满足你的要求的,只是说下。
      

  4.   

    好像不能满足楼主要求,记住Button1Click不是一个字符串这么简单,实际上是一个函数名,编译器负责的,这个名称只是一个函数的地址(在程序运行时),所以会有OnClick = Button1Click。
    估计2楼的方法也不行。
    对于编译器才要Button1Click这个字符串,对于生成的exe只是要这个函数的地址,和名称基本无关。
      

  5.   

    你说的可以这样实现
    先写一个通用过程procedure BtnClick(Sender: TObject);。
    在动态创建按钮的时候附值button1.OnClick := BtnClick;
      

  6.   

    因为我通把字符串
    var
      Proc: TNotifyEvent;
    begin
      @Proc := MethodAddress('Button1Click');
      if Assigned(Proc) then
        Proc(nil);
    end;
    转成事件地址执行,我想反过来理论上来说是可以实现的!可能实现的过程要复杂很多!
      

  7.   

    //这样算吗?
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Caption := MethodName(@TButton(Sender).OnClick);
    end;
      

  8.   

    楼上的可以吗?试验过的说下,另外有MethodName函数吗?学习中。
      

  9.   

    谢谢zswang, 你的代码我试过是可以实现,但是不知道怎么样可以通过一个循环获得所有按钮的onclick事件名称!
      

  10.   

    var
        i: integer;
    begin
        for i:=0 to ComponentCount - 1 do
        begin
            if Components[i].ClassNameIs('TButton') then
                ShowMessage(MethodName(@TButton(Components[i]).OnClick));
        end;
    end;
      

  11.   

    var
      S: string;
      I: Integer;
    begin
      S := '';
      for I := 0 to ComponentCount - 1 do
        if Components[I] is TButton then
          S := S + ',' +  MethodName(@TButton(Components[I]).OnClick);
      Delete(S, 1, 1);
      ShowMessage(S);
    end;
      

  12.   

    //再给你一招,得到更多OnClick的名字,不单是TButton
    uses TypInfo; // use GetMethodPropprocedure TForm1.FormCreate(Sender: TObject);
    var
      S: string;
      I: Integer;
      vMethod: TMethod;
    begin
      S := '';
      for I := 0 to ComponentCount - 1 do
      begin
        vMethod := GetMethodProp(Components[I], 'OnClick');
        if Assigned(vMethod.Code) then
          S := S + ',' +  MethodName(vMethod.Code);
      end;
      Delete(S, 1, 1);
      ShowMessage(S);
    end;
      

  13.   

    楼上 用CTRL+D 后 才贴出代码的吧 哈哈
      

  14.   

    Ctrl+D是啥?自动排版吗?我只按Ctrl+C后才贴出代码。
      

  15.   

    Ctrl+D是显示桌面
      
    靠 Ctrl旁边那个键才+D才是显示桌面啊  zswang(伴水清清)的方法不错
      

  16.   

    var
      p:pointer;
      S:string;
    begin
      p := pointer(@button1.onclick);
      s := MothedName(p);
    end;s就是button1的onclick事件名称