具有多个单元的Delphi OnClick问题

时间:2009-12-13 13:43:27

标签: delphi event-handling onclick

当我从单元制作动态组件时,我没有创建OnClick事件的问题。 当我从第2单元制作动态组件时,我无法访问OnClick事件。

unit Unit1  
type  
    TForm1 = class(TForm)  
      procedure FormCreate(Sender: TObject);  
    private  
      { Private declarations }  
    public  
      Procedure ClickBtn1(Sender: TObject);  
    end;  

var  
    Form1: TForm1;  
    MyBtn1: TButton;  
implementation  

{$R *.dfm}

{ TForm1 }
uses Unit2;

procedure TForm1.ClickBtn1;  
begin  
    MyBtn1.Caption := 'OK';  
    MakeBtn2;  
end;


procedure TForm1.FormCreate(Sender: TObject);  
begin  
    MyBtn1 := TButton.Create(Self);  
    MyBtn1.Parent := Form1;  
    MyBtn1.Name := 'Btn1';  
    MyBtn1.Left := 50;  
    MyBtn1.Top := 100;  
    MyBtn1.Caption := 'Click Me';  
    MyBtn1.OnClick := ClickBtn1;  
end;  


end.



unit Unit2;

interface

uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;

procedure MakeBtn2;  
procedure ClickBtn2;      
var  
    MyBtn2: TButton;  

implementation

Uses Unit1;

procedure MakeBtn2;  
begin  
    MyBtn2 := TButton.Create(Form1);  
    MyBtn2.Parent := Form1;  
    MyBtn2.Name := 'Btn2';  
    MyBtn2.Left := 250;  
    MyBtn2.Top := 100;  
    MyBtn2.Caption := 'Click Me';  
    MyBtn2.OnClick := ClickBtn2;    //Compiler ERROR
end;  

procedure ClickBtn2;  
begin  
    MyBtn1.Caption := 'OK';  
end;  
end.  

2 个答案:

答案 0 :(得分:2)

看看这篇文章“Creating A Component at Runtime

引用:

  

我想在代码中创建一个按钮   它在一个表格上并附上一个程序   它的点击事件。我怎么能得到   单击链接到预定义的事件   程序名称来自代码?我假设了   在对象浏览器中链接IDE   答案的关键,但我想做   这在运行时,而不是在开发中。

     

首先,你可以分配任何   对象的方法另一种方法为   只要它具有相同的形式。看着   以下代码:

{This method is from another button that when pressed will create
 the new button.}
procedure TForm1.Button1Click(Sender: TObject);
var
  btnRunTime : TButton;
begin
  btnRunTime := TButton.Create(form1);
  with btnRunTime do begin
    Visible := true;
    Top := 64;
    Left := 200;
    Width := 75;
    Caption := 'Press Me';
    Name := 'MyNewButton';
    Parent := Form1;
    OnClick := ClickMe;
  end;
end;

{This is the method that gets assigned to the new button's OnClick method}
procedure TForm1.ClickMe(Sender : TObject);
begin
  with (Sender as TButton) do
    ShowMessage('You clicked me');
end;
  

如您所见,我创建了一种新方法   名为ClickMe,已在声明中声明   Form1的私有部分:

type
  TForm1 = class(TForm
  ...
  ...
  private
    procedure ClickMe(Sender : TObject);
  published
  end;

有关其他示例和解释,请参阅以下内容:

答案 1 :(得分:1)

你确定第一个例子有效吗?这些都不应该编译。

OnClick处理程序是TNotifyEvent,定义为

procedure(Sender: TObject) of object;

这意味着它必须是对象(例如表单)的方法,并且方法签名必须是采用单个TObject参数的过程。你的程序MakeBtn2不是一个对象方法,它们都没有使用Sender:TObject。