我自己做了一个组件, 定义如下:Type
TMyCmpnt = class(TPanel)
private
FBTest : boolean ;
FSTest : string ; procedure SetBTest(Value : boolean) ;
procedure SetSTest(Value : string) ;
protected public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;published
property BTest : boolean read FBTest write SetBTest;
property STest : string read STest write SetSTest ;end;implementconstructor Create(AOwner:TComponent);
begin
inherited Create(AOwner) ;
end;destructor Destroy ;
begin
inherited Destroy ;
end;procedure SetBTest(Value : boolean) ;
begin
if FSTest = '' then
begin
ShowMessage('请先设置 STest 属性') ;
end
else begin
FBTest := Value ;
end ;
end; procedure SetSTest(Value : string) ;
begin
FSTest := Value ;
end;end.组件安装好以后, 在使用组件时在属性编辑器中先设置
属性 STest 的值为‘测试’,然后再设置属性 BTest 为 True ;
但每当我按下 F9 运行程序时它总会弹出 '请先设置 STest 属性'
的对话框,也就是说在程序运行时它总是先设置 BTest 属性的值
然后再设置 STest 的值,请教各前辈,怎么做才能使程序启动时
按我自己想要的设值顺序设值(我指的不是在 constructor 中
的设值顺序,而是用属性编辑器获得的值怎么按自己指定的顺序
赋值给对应的属性)
TMyCmpnt = class(TPanel)
private
FBTest : boolean ;
FSTest : string ; procedure SetBTest(Value : boolean) ;
procedure SetSTest(Value : string) ;
protected public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;published
property BTest : boolean read FBTest write SetBTest;
property STest : string read STest write SetSTest ;end;implementconstructor Create(AOwner:TComponent);
begin
inherited Create(AOwner) ;
end;destructor Destroy ;
begin
inherited Destroy ;
end;procedure SetBTest(Value : boolean) ;
begin
if FSTest = '' then
begin
ShowMessage('请先设置 STest 属性') ;
end
else begin
FBTest := Value ;
end ;
end; procedure SetSTest(Value : string) ;
begin
FSTest := Value ;
end;end.组件安装好以后, 在使用组件时在属性编辑器中先设置
属性 STest 的值为‘测试’,然后再设置属性 BTest 为 True ;
但每当我按下 F9 运行程序时它总会弹出 '请先设置 STest 属性'
的对话框,也就是说在程序运行时它总是先设置 BTest 属性的值
然后再设置 STest 的值,请教各前辈,怎么做才能使程序启动时
按我自己想要的设值顺序设值(我指的不是在 constructor 中
的设值顺序,而是用属性编辑器获得的值怎么按自己指定的顺序
赋值给对应的属性)
property zBTest : boolean read FBTest write SetBTest;
property aSTest : string read FSTest write SetSTest ;
方法二:在ShowMessage之前加一条检查语句(同一个begin end内)
if ComponentState = [csDesigning] then
ShowMessage(...
好像改下属性名并不能使它改变赋值的顺序, 我都试了好多次了, 另外改变属性声明的顺序也不行cnsuyong(小可) :
FSTest要缺省值值就是 '',
编辑属性时的顺序要求是先设 FSTest, 才可以设 FBTest
运行时我也想让程序按这个顺序设 PSTest 与 FBTest 的值我要做的是一个数据库感知组件, 要先设置字段名, 再打开连接
BTest 是只读属性
否则
BTest 是可读写属性是这样的吗?
如果是这样,那么建议你只好重新考虑属性之间的联系和约束关系了。
关注。
像 TTable , 只有设置有数据表的名称才能设置 Active 属性为 True
到运行时刻我怎么按自己设定的顺序依次给各属性赋值
比如我一定要先给 STest 赋值然后再 BTest 赋值, 这非常重要
设置DatabaseName -> 设置TableName -> 设置Active=True。
如果此时改变DatabaseName或TableName属性,那么Active立刻变为False。
因此:
建议不仅要考虑FSTest作为FBTest的必要条件,而且要考虑FBTest改变时对FSTest的“反作用”。
因为我还不完全清楚你设计的逻辑关系,所以也无法提供对症的代码。
只好继续关注。
我设计的组件也非常像 TTable 这个类
这个类通过一个 Active 属性去打开数据库连接, 但连接数据库的前提是数据表的名称必须先给出, 否则无法打开数据库连接, 可是每次用属性编辑器设置好后-->存盘-->运行, 程序总是先设置 Active 属性而不是先设置表的名称, 我真不知该如何才能使程序按自己的想象中的顺序设置各属性的值
说实话,我都不知道如何自己做一个组件,不过看了大家的意见之后想问几句。
procedure SetBTest(Value : boolean) ;
procedure SetSTest(Value : string) ;
这两个函数是你自己调用的还是构造函数自己调用的?我看不出来。
如果是你自己调用的,那你就改变调用的顺序。
如果是系统自己调用的,你不需要这样弹出个对话框来,
你可以直接调用另一个set函数设置一下就完了
begin
if FSTest = '' then //改成if STest = '' then 一试
begin
ShowMessage('请先设置 STest 属性') ;
end
else begin
FBTest := Value ;
end ;
end;