动态按钮的OnClick事件?

时间:2015-10-20 17:30:18

标签: delphi events

在开始之前,我必须声明此主题上没有其他堆栈溢出帖子对我有帮助

我有一个由btnApply

调用的动态按钮

它是在动态表单frmSort上动态创建的静态按钮上的静态按钮btnSort的单击事件frmTable

在frmTable的全局范围var下声明

btnApply: TButton;
Procedure btnApplyClick(Sender:TObject);
//other vars

点击

下的btnSort
//other code
btnApply:= TButton.create(frmSort);
//all its properties
BtnApply.onclick:= btnApplyClick;
//other code

之后

Procedure btnApplyClick(Sender:TObject);
Begin
  //it's code it has to execute
End;

我在“BtnApply.onclick:= btnApplyClick;”中收到错误消息 方法指针和常规过程之间的不兼容类型行

我如何使这项工作?

提前致谢

2 个答案:

答案 0 :(得分:13)

您的btnApplyClick需要是对象的方法。由于按钮必须在表单上才有用,所以将它作为表单本身的一种方法:

type
  TfrmSort = class(TForm)
    // UI controls listed here
  public
    procedure btnApplyClick(Sender: TObject);
  end;

implementation

procedure TfrmSort.btnApplyClick(Sender: TObject);
begin
  (Sender as TButton).Caption := 'You clicked me';
end;

procedure TfrmSort.FormCreate(Sender: TObject);
var
  Btn: TButton;
begin
  Btn := TButton.Create(Self);
  Btn.Parent := Self;
  Btn.Top := 100;
  Btn.Left := 100;
  Btn.OnClick := btnApplyClick;
end;

如果由于某种原因你无法使它成为一种形式方法(虽然我看不出它是如何用于视觉控制),你可以使它成为任何对象的方法,如下所示:

implementation

// You must use StdCtrls in order to have the types available if
// it's not already in your uses clause
type
  TDummyButtonClickObj = class
    class procedure ButtonClickHandler(Sender: TObject);
  end;

{ TDummyButtonClickObj }

class procedure TDummyButtonClickObj.ButtonClickHandler(Sender: TObject);
begin
  (Sender as TButton).Caption := 'You clicked me.';
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  with TButton.Create(Self) do
  begin
    Parent := Self;
    Top := 100;
    Left := 100;
    Caption := 'Click here';
    OnClick := TDummyButtonClickObj.ButtonClickHandler;
  end;
end;

答案 1 :(得分:8)

正如其他人所说,事件处理程序应该是一个类的成员。这就是事件所期待的。但是,也可以使用非成员过程作为事件处理程序。只需要几个额外的步骤即可完成设置。

  1. 添加额外的显式参数以考虑Self指针:

    procedure btnApplyClick(Self: Pointer; Sender: TObject);
    
  2. 使用TMethod记录将过程分配给按钮:

    var
      btnApply: TButton;
      M: TMethod;
      //other vars
    
    Procedure btnApplyClick(Self: Pointer; Sender: TObject);
    
    ...
    
    btnApply := TButton.create(frmSort);
    //all its properties
    M.Code := @btnApplyClick;
    M.Data := nil; // can be anything you want passed to the Self parameter
    BtnApply.onclick := TNotifyEvent(M);
    //other code
    
    ...
    
    procedure btnApplyClick(Self: Pointer; Sender: TObject);
    Begin
      // code to execute
    End;