怎么在动态创建的控件中执行其事件(100分)

S

shbjkl

Unregistered / Unconfirmed
GUEST, unregistred user!
比如动态创建了一个button1
想在click事件中执行代码如何解决
 
编写一个和Onclick使用参数一样的过程,再将这个过程赋值给OnClick就行了,最简单的办法。
 
button1.onclick = myclick;
myclik必须是和button1.onclick同一类型的。
 
private
procedure btnClick(Sender: TObject);//参数要一样

procedure TForm1.btnClick(Sender: TObject);//参数要一样
begin
showmessage('click')
end;

procedure TForm1.Button1Click(Sender: TObject);
var
btn: TButton;
begin
btn := TButton.Create(self);
btn.Parent := self;
btn.Left := 10;
btn.Top := 10;
btn.Caption := 'byn';
btn.OnClick := btnClick;
btn.Show;
end;
 
先放一个Button,双墼他编写代码
他的响应事件是Button1click;
将动态生成的Button的Onclick:=Button1click即可
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure clickprocedure(Sender: TObject);//自定义过程
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var button2:Tbutton;
begin
button2:=Tbutton.Create(self);
button2.parent:=self;
button2.OnClick:=clickprocedure;
end;

procedure TForm1.clickprocedure(Sender: TObject);
begin
showmessage('df');
end;

end.
 
to:chenzheng770101
您的方法與樓上的兄弟都差不多,有何必重寫一邊呢?
大家不如想一想有沒有其他的方法,開闊一下思路。比如:用override試一試。
 
重载它的click方法~
 
private
procedure btnClick(Sender: TObject);//参数要一样

procedure TForm1.btnClick(Sender: TObject);//参数要一样
begin
showmessage('click')
end;

procedure TForm1.Button1Click(Sender: TObject);
var
btn: TButton;
begin
btn := TButton.Create(self);
btn.Parent := self;
btn.Left := 10;
btn.Top := 10;
btn.Caption := 'byn';
btn.OnClick := btnClick;
btn.Show;
btn.free//这就不行可有方法解决
end;
 
btn.free//这就不行可有方法解决
btn已经free了,当然不行。定义btn为全局变量,在FormDestroy事件中释放
procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(btn) then
btn.Free;
end;
 
我现在是在作一个flat datetimer,其它问题全解决了。
美中不足的是只有在onenter 时才能弹出calendar.
在click 时不行,因为 flatcombobox 的onclick 只在其itmes 上
才执行。
有没有什么方法使其在flatcombobx 上单击就可以呢?
unit FlatComboBox1;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls,
TFlatComboBoxUnit,ComCtrls,Dialogs;

type

TFlatComboBox1 = class(TFlatComboBox)
private
fdate:tdatetime;{ Private declarations }
cale:tmonthcalendar;
protected
{ Protected declarations }
public
constructor Create (AOwner: TComponent); override; { Public declarations }
procedure doenter();override;
procedure doexit();override;
procedure myclick(sender:tobject);
published
property date:tdatetime read fdate write fdate;
{ Published declarations }
end;

procedure Register;

implementation

constructor TFlatComboBox1.Create (AOwner: TComponent);
begin
inherited Create(AOwner);
text:=datetostr(date);
style:=csSimple;
date:=date;

end;

procedure tflatcombobox1.doenter();--------------------->需改成click
begin
inherited ;
try
cale:=tmonthcalendar.Create(self);
cale.Parent:=self.Parent;
cale.Left :=self.Left;
cale.Top:=self.Top+self.Height+1 ;
cale.OnClick :=myclick;
finally
// cale.Free;
end;
end;
procedure tflatcombobox1.myclick(sender:tObject);
begin
text:=datetostr(cale.Date);
date:=cale.Date;
cale.hide;
end;
procedure tflatcombobox1.doexit();
begin
text:=datetostr(cale.Date);
date:=cale.Date;
cale.Free;
end;



procedure Register;
begin
RegisterComponents('Standard', [TFlatComboBox1]);
end;

end.
 
我没用过flat的控件组。但对于combobox来说(flatcombobox可能会不一样),
onClick事件是在选定下拉菜单选项后触发,而不是直接点击的时候触发。
 
可以修改成直接点击的时候触发[?][?]?
 
多人接受答案了。
 
顶部