控件開發中的問題,(100分)

  • 主题发起人 主题发起人 HeXiang Lee
  • 开始时间 开始时间
H

HeXiang Lee

Unregistered / Unconfirmed
GUEST, unregistred user!
各位師哥:
小弟做了一個控件,從TComponent派生,加了一個自已的新的派生自TCollection對像
的屬性。在設計狀態修改了TCollection的Items屬性,運行程序,發現該性屬性值沒有改變,移動窗口再保存才可以看到Tcollection的屬性改了,不知為何原因。
各位請指教!
 
原来的属性名称
property Items: TCollection read FItems write FItems stored ItemsStored;
原来的你别动,主要是这个-------------------->~~~~~~~~~~~~~~~~~~
你自己定义的类型
function TMyselfComponent.ItemsStored:boolean;
~~~~~~~~~~~~~~~~
begin
Result := Items and (Items.Count > 0);
end;

试试看!
 
unit MYComponent;

interface

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

type
TMYComponent = class(TComponent)
private
FItems: TCollection;
procedure SetItems(const Value: TCollection);
published
property Items: TCollection read FItems write SetItems;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Astar', [TMYComponent1]);
end;

{ TMYComponent }

procedure TMYComponent.SetItems(const Value: TCollection);
begin
FItems.Assign(Value);
end;

end.
 
在create函数中自己写代码改过来
 
To;tank007
你的方法我还是没有看明白,可不可以再说明白一点。
 
建议把TCollection改成TStrings.
 
thx1180说的是TCollection对象赋值语句应该注意调用Assign就可以立即更新了。
tank007说的是你的Collection属性是否自动(默认)保存在资源文件中,
如果你把Collection声明为公开的Published,默认就是自动保存的。

除非你的Delphi出了问题,偶尔保存不了,我看到过类似的问题,
怀疑是Delphi打开的单元太多。一般关闭再打开就可以了。
 
另外你的Collection应该重载下面的方法
function GetOwner: TPersistent; override;
begin
Result := 拥有此列集的元件或创建此列集的元件,可以通过Create方法传递创建者自身
//Delphi保存所有元件的属性信息是依据元件的Owner属性保存的
//Owner为nil的元件一般是动态创建,动态释放的。Delphi不会主动(自动)保存它。
//象设计态Form上的所有元件的Owner都是Form自身,除了你在Create方法中
//明确创建了的TCollection,TAction等。
end;
 
To:sleijun
你说的有些道理,但是我还是不明白,Tcollection的Create方法的参数是TCollectionItem,Owner没有办法传递呀。
我是将Tcollection作为我的控件的一个属性,GetOwner如何返回Owner呀。
 
你去看看Classes单元中的TOwnedCollection的代码,很简单的。
 
To:thx1180
还是不行呀!
我现在还发现,当我更改了改属性后,只要移动一下窗口上的其它任一控件就可以看到更改后的结果了。
 
前面sleijun已经说了,你参考TOwnedCollection的代码覆盖GetOwner方法,并重新定义一下Create方法传入Owner就可以的。
 
标准的做法如tank007.你所需要的是弄明白tank007这种做法的实质原理,这样应该是可以实现的,不过实际上有时候DelphiIDE是会这样的。
还有你的所谓更改的效果是什么?如果需要互动产生什么可视效果,是需要你在适当的地方发出命令Invalidate等等(针对Control, Component应该不会有什么视觉变化,移动其他控件就可以看到更改后的效果? 除非两者之间有直接联系,否则应该设计期唯一带来的变化就是重绘)
 
多人接受答案了。
 
后退
顶部