如何save动态生成的组件的事件(100分)

S

swh

Unregistered / Unconfirmed
GUEST, unregistred user!
我动态生成的组件后,用TfileStream的writecomponent来save窗体上的租件,它可以save
动态生成的组件的属性,但没法save这些组件的事件,后来再打开,象Click之类的事件
没法用,这等于就没用了,不知各位高手有何高招。Help me.
对了,动态生成的组件的例子有些书上有,但只讲了生成,没讲如何用。
 
??? 什么叫save动态生成的组件的事件,不懂!!
我只知道这样做:
Tbutton *tmp=new Tbutton(this);
tmp->Caption="ok";
tmp->OnClick=abcd; //abcd为事先定义好的函数
tmp->Parent=this;
 
有这种需要吗?
事件只能事先在程序中写好。
 
procedure TForm1.New1Click(Sender: TObject);
var
I:Integer;
begin
for I:=ControlCount-1 downto 0 do
if Controls.Classname<>'TPanel' then
Controls.Free;
Counter:=0;

end;
procedure TForm1.Open1Click(Sender: TObject);
var
S:TFileStream;
New:TComponent;
begin
if OpenDialog1.Execute then
begin
New1Click(self);
S:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
try
while S.Position<S.Size do
begin
New:=S.ReadComponent(nil);
InsertControl(New as TControl);
Inc(Counter);
end;
finally
S.Free;
end;
end;
end;

procedure TForm1.SaveAs1Click(Sender: TObject);
var
S:TFileStream;
I:Integer;
begin
if SaveDialog1.Execute then
begin
S:=TFileStream.Create(SaveDialog1.FileName,fmOpenWrite or fmCreate);
try
for I:=0 to ControlCount-1 do
if Controls.ClassName<> 'TPanel' then
S.WriteComponent(Controls);
finally
S.Free;
end;
end;

end;
所谓动态生成组件是指在可执行文件中,用鼠标点激窗口时他能在那个位置生成你须要的
可视的组件,上面是中的的事件,他们用来打开或存储动态生成组件,我说过,此法只
能存储动态生成组件的属性,但没法存储动态生成组件的事件,象Click之类的事件,存储
后,在打开就没法用。
望各位能再想想,如何才能存储动态生成组件的事件,谢谢。
 

如果动态的组件很多,最好设置一下他们的Tag属性,以免混乱。
假如B1是该方法。
procedure B1OnClick(sENDER : );

然后在 窗体创建时。
Controls.OnClick := B1OnClick;
这样赋值行了吧。

//我还是不够明白,说说整个程序的目的吧。
 
我的程序想要在执行文件的窗口中自动绘图,我想把每个器件都做成组件,点击一下某
按扭,在在下面窗口中点鼠标,能自动会出你需要的器件,这些器件我已经都做成了组件,
但要方便用户使用,就要动太生成这些组件,我不可能让用户在delphi的环境用这些组件。
不知您明白没有?
 
swh:
我觉得你的想法怪怪的,因为我还是第一次看到像这样做图形编辑和保存数据的。
ReadComponent 和 WriteComponent 一般是 Delphi 内部用于在 .DFM 和 内存之间读写
控件的方法,绝大部分时候都是用在设计期或自定义控件的编写中。
你应该手工编写读写图形对象的代码,定义包含 Write 和 Read 以及 Click 等虚方法
的基类,而不应该用 ReadComponent 和 WriteComponent 方法。
还有,应该用 TList 或自己定义的链表数据结构保存图形对象的指针,而不是在 Form
的 Controls 数组里去判断,把不是 TPanel 的对象删掉,这个习惯很不好。
不知道我说明白了没有。
 
动态生的组件是指在运行期创发的组件,这种组的事件显然不能在设计期响应,
下谈谈怎样响应动态生成的组件的事件:如动态生成一按钮,然后响应onClick事件
先定义:
private
MyBtn:TButton;
public
procedure MyBtnClick(Sender: TObject);
implementation
//事先写好动态按钮响应onClick事件时的代码
procedure TForm1.MyBtnClick(Sender: TObject);
begin
showmessage('我是动态创建的');
//...你的代码
end;
//在适当的时候生成按钮,并将预先写好的事件句柄赋予onClick属性
MyBtn:=TButton.Create(Form1);
MyBtn.OnClick:=MyBtnClick;
//要显示按钮必需要指定parent属性
MyBtn.Parent:=form1;
MyBtn.left:=10;
MyBtn.top:=10;
//别忘记适当的时候free掉
 
多人接受答案了。
 
我也想知道这个问题的答案。楼上的没有一个回答到点子上的,结果一人25分,这算是什么
回事?????!!!!
 
顶部