在运行时设置Delphi按钮的OnClick过程

时间:2015-02-01 17:23:05

标签: delphi button onclick runtime

我有一个程序,我需要使用输入编辑框的信息更新数据库表,最后用一个按钮进行更新。但是,表单是在运行时创建的,包括按钮在内的所有元素也以相同的方式创建。我想办法允许数据库参数定义更新数据库的过程,如:

procedure UpdateDatabase(Field1,Field2,Field3:string);
begin
//update database here...
end;

然后将我的按钮的OnClick事件分配给此过程,其参数预先填充如下:

Button1.OnClick := UpdateDatabase(Edit1.text,Edit2.Text,Edit3.Text);

但是类型不兼容,因为它需要不同的数据类型。我还注意到参数通常不能传递给OnClick函数。实际上有没有办法实现我的建议?

这是我当前的创建按钮代码:

function buttonCreate(onClickEvent: TProcedure; 
  left: integer; top: integer; width: integer; height: integer; 
  anchors: TAnchors; caption: string; parent: TWinControl; form: TForm;): TButton;
var
  theButton: TButton;
begin
  theButton := TButton.Create(form);
  theButton.width := width;
  theButton.height := height;
  theButton.left := left;
  theButton.top := top;
  theButton.parent := parent;
  theButton.anchors := anchors;
  //theButton.OnClick := onClickEvent;
  theButton.Caption := caption;
  result := theButton;
end;

任何和所有帮助表示赞赏!

2 个答案:

答案 0 :(得分:6)

必须准确声明事件处理程序如何定义事件类型。 OnClick事件被声明为TNotifyEvent,其中包含参数(Sender: TObject)。你不能违反这条规则。

在您的情况下,您可以将自己的过程包装在事件处理程序中,如此...

procedure TForm1.Button1Click(Sender: TObject);
begin
  UpdateDatabase(Edit1.text,Edit2.Text,Edit3.Text);
end;

请注意,TNotifyEvent是对象"的过程",这意味着您的事件处理程序必须在对象内声明。在您的情况下,应在表单内声明事件处理程序(而不是在全局位置)。

答案 1 :(得分:2)

您是否考虑过使用编辑控件作为字段成员从TButton下降控件?

这里有一个例子,希望你能从中收集一些想法。

  TButtonHack = class(TButton)
    fEdit1,
    fEdit2,
    fEdit3: TEdit;
  procedure Click; override;
  public
  constructor Create(AOwner: TComponent; AParent: TWinControl; Edit1, Edit2, Edit3: TEdit); Reintroduce;
end;

Constructor TButtonHack.Create(AOwner: TComponent; AParent: TWinControl;  Edit1, Edit2, Edit3: TEdit);
begin
  inherited Create(AOwner);
  Parent := AParent;
  Left := 100;
  Top := 100;
  Width := 100;
  Height := 20;
  Caption := 'ButtonHack';
  fEdit1 := Edit1;
  fEdit2 := Edit2;
  fEdit3 := Edit3;
end;

procedure TButtonHack.Click;
begin
  Inherited Click;
  Showmessage(fEdit1.text+','+ fEdit2.text+','+fEdit3.text);
end;

在表单上测试,删除一个按钮和三个TEdits。

procedure TForm1.Button1Click(Sender: TObject);
var
  ButtonHack: TButtonHack;
begin
  ButtonHack := TButtonHack.Create(Form1, Form1, Edit1, Edit2, Edit3);
end;

您是提前创建编辑还是从TButtonHack中创建编辑取决于您。我作为一个例子尽可能地简化了它。