如题,我的一个很简单的控件其实就是一个TPanel中包含了几个TButton按钮,(控件功能就是可以实现按钮的用户自定义排列啥的),但我想如果点击了其中的一个按钮,怎么能触发例如TPanel.OnButtonClick这样的事件?当OnButtonClick被触发的时候,我需要获得Button的名字,坐标啥的信息,我应该怎么作呀?谢谢了!

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      tmypanel = class(TPanel) //自定义的panel,包含两个按钮,当按钮点击的时候,显示按钮的名称和位置
        public
          bt : array[0..1] of TButton;
          procedure MybtnClick(sender : TObject);
          constructor Create(AOwner: TComponent); override;  end;
      TForm1 = class(TForm)
        Panel1: TPanel;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        procedure MyClick(sender : TObject);
      end;var
      Form1: TForm1;
      a : tmypanel;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    beginend;{ tmypanel }constructor tmypanel.Create(AOwner: TComponent);
    var
     i : integer;
    begin
      inherited;
      Self.Width := 500;
      for i := 0 to 1 do
      begin
        bt[i] := TButton.Create(nil);
        bt[i].Parent := Self;
        bt[i].Top := 10;
        bt[i].Left := (i+1)*100;
        bt[i].Caption := '按钮'+IntToStr(i+1);
        bt[i].OnClick := MybtnClick;
      end;end;procedure tmypanel.MybtnClick(sender: TObject);
    begin  ShowMessage(Format('名称:%s;left :%d;top:%d',[(sender as TButton).Caption,(sender as TButton).Left,(sender as TButton).Top]) );
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
       a := tmypanel.Create(nil);
       a.Parent := Form1;
       a.Left := 20;
       a.Top := 20;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
    a.Free;
    end;procedure TForm1.Button3Click(Sender: TObject);  //在程序中使用按钮的onclick事件
    begin
      a.bt[0].OnClick := MyClick;
    end;procedure TForm1.MyClick(sender: TObject);
    begin
       ShowMessage('hello');
    end;end.大致就是这样,建议LZ研究一下事件究竟是什么,在DELPHI中,我们通常使用的onclick这些事件,准确的说,应该叫事件属性,一个指向特定类型的访问接口。例如onclick,参看DELPHI帮助或者VCL源码,你可以发现,onclick是一个tnotifyevent类型
    property OnClick: TNotifyEvent read FOnClick write FOnClick stored IsOnClickStored;
    再看这个类型的定义
    Delphi syntax:type TNotifyEvent = procedure (Sender: TObject) of object;
    想必可以加深你的理解
      

  2.   

    多谢二位,尤其是 wudi_1982 兄,给我这么详尽的解释,我仔细研究研究。多谢了!