我想写一个过程
type 
  A=class
    protected
        ControlClick(sender:TObject);
    public
      procedure setControlClick(control:TControl);
  end;implementation
 
procedure A.setControlClick(control:TControl);
begin
  ????????????
  ???????????????
  ????????
end;
procedure A.ControlClick(sender:TObject)
begin
 showMessage('Hello');
end;我的目的是可以这样使用类A,即:
假如有一个TControl的子类TButton的实例Button1
通过调用    A.setControlClick(Button1);
以后Button1的click事件就为procedure A.ControlClick(sender:TObject)函数做的事,即显示一个'Hello',
假如还有一个TControl的子类TSpeedButton实例SPBtn1
我再调用A.setControlClick(SPBtn1);
同样,函数执行后,以后SPBtn1的click事件就为procedure A.ControlClick(sender:TObject)函数做的事,即显示一个'Hello',主要是TControl的Property ONClick是保护型的,所以我不能直接在函数里写
control.onclick:=ControlClick;否则就简单了,
子类化我也想到了,可惜TControl没有Handle,(从TWinContol才开始有handle,但TSpeedButton不是从TWinControl继承下来的,TSpeedButton也没有handle,我晕!!!)我不想改TControl的源码!
哪位老大能帮帮我想想,怎样完成这个函数  

解决方案 »

  1.   

    procedure TForm1.setControlClick(control: TControl);
    begin
      if control is TButton then
        (control as TButton).OnClick := ControlClick
      else
        (control as TSpeedButton).OnClick := ControlClick;
    end;
      

  2.   

    呵呵,老大,我就是不想在函数里出现if... if....我的函数目的是只有是TControl的子类就能能完成给他赋click事件的功能,毕竟TControl里面已经实现了OnClick,只是保护的而以,如果这样if...if...我要写多少if阿不过还是很感谢你!
      

  3.   

    还有种适用范围更广的办法:
    TMyControl = class(TControl)
      public
        property OnClick;
      end;procedure A.setControlClick(control:TControl);
    begin
      TMyControl(control).OnClick := ControlClick;
    end;
      

  4.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        SpeedButton1: TSpeedButton;
        procedure Button1Click(Sender: TObject);
      private
        procedure ControlClick(Sender: TObject);
        procedure SetControlClick(Control: TControl);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses TypInfo;{$R *.dfm}procedure TForm1.ControlClick(sender:TObject);
    begin
     ShowMessage('Hello');
    end;procedure TForm1.SetControlClick(Control: TControl);
    const
      ProName = 'OnClick';
    var
      E: TNotifyEvent;
    begin
      if GetPropInfo(Control, ProName) <> nil then
      begin
        E := ControlClick;
        SetMethodProp(Control, ProName, TMethod(E));
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      SetControlClick(Button2);
      SetControlClick(SpeedButton1);
    end;end.————————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    ————————————————————————————————————
      

  5.   

    试试: lxpbuaa(桂枝香在故国晚秋) 的办法