我有一个程序,我需要使用输入编辑框的信息更新数据库表,最后用一个按钮进行更新。但是,表单是在运行时创建的,包括按钮在内的所有元素也以相同的方式创建。我想办法允许数据库参数定义更新数据库的过程,如:
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;
任何和所有帮助表示赞赏!
答案 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中创建编辑取决于您。我作为一个例子尽可能地简化了它。