控件开发难题 ( 积分: 100 )

  • 主题发起人 主题发起人 whyme
  • 开始时间 开始时间
W

whyme

Unregistered / Unconfirmed
GUEST, unregistred user!
我从 TToolBar 继承一个控件下来,然后在这个继承的控件上创建了一些BUTTON
(在 Create事件中)
接着我把里面的一个 Button 引出,如:
Property ToolBNew : TToolButton Read GetToolBNew Write SetToolBNew;

然后编译之后,在设计时,可以修改这个 TooBNew 的 Caption 等的值,但一运行之后,改的值就不见了。就是无法改它的,保存工程之后重新打开,也再次恢复原先没改的样子。

怎么办???
 
我从 TToolBar 继承一个控件下来,然后在这个继承的控件上创建了一些BUTTON
(在 Create事件中)
接着我把里面的一个 Button 引出,如:
Property ToolBNew : TToolButton Read GetToolBNew Write SetToolBNew;

然后编译之后,在设计时,可以修改这个 TooBNew 的 Caption 等的值,但一运行之后,改的值就不见了。就是无法改它的,保存工程之后重新打开,也再次恢复原先没改的样子。

怎么办???
 
重载DefineProperties方法, 将该控件写入流中
 
能不能给个例子看看啊。
 
在 Create事件中创建ToolButton时,设置PARENT为TOOLBAR,然后
ToolBNew.SetSubComponent(True);
试试。如果不行,只好用DefineProperties

在控件中加入procedure DefineProperties(Filer: TFiler); override;
然后定义
procedure LoadFromStream(Stream:TStream);//读方法
procedure SaveToStream(Stream:TStream);//写方法
function IsChanged:Boolean; //条件判断方法

procedure DefineProperties(Filer: TFiler);
begin
inherited DefineProperties(Filer);
Filer.DefineBinaryProperty('btnData', LoadFromStream, SaveToStream,IsChanged);
//'btnData'为存入DFM文件中的名称。
end;

//写方法的一个例子,也可以用其他方法,有很多读写组件的方法可以调用,这里是用流的方式,在DFM里看到是二进制数据,不是很直观,只是说明一下而已。

procedure SaveToStream(Stream:TStream);
var
I: Integer;
Writer:TWriter;//对应读有个TREADER类,用法是一样的。
begin
Writer:=TWriter.Create(Stream,1024);
Writer.WriteInteger(Count);
for i:=0 to btnCount-1 do //按钮的总数
begin
writer.WriteString(Items.Name);
writer.WriteString(Items.Caption);
......................//等等需要存储的属性
end;
Writer.Free;
Writer:=nil;
end;

用DefineProperties方法你就不能在Create方法中动态产生按钮,要换个地方,比方使用一个方法。
function addBtn:TToolButton;

因为控件被创建时会自动调用存储的数据,如果还在Create方法中动态产生按钮,就会出问题。


 
可以在Create方法中动态产生按钮,我也糊涂了。只要在读方法中不动态创建,只是赋值就可以了
 
wk_knife, 我按你的方法搞了。
但一启动还是不行啊。

不在 Create 中创建的话,那要在哪里在创建呢?怎么创建?
 
能不能先说说你为何要创建这么个控件?

我仔细想想,这个控件要解决的问题太多.很麻烦的.
 
接受答案了.
 
后退
顶部