我自己做了一个组件, 定义如下: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 中
的设值顺序,而是用属性编辑器获得的值怎么按自己指定的顺序
赋值给对应的属性)

解决方案 »

  1.   

    published
      property zBTest : boolean read FBTest write SetBTest;
      property aSTest : string read FSTest write SetSTest ;
      

  2.   

    方法一:在构造器中给FSTest赋缺省值。
    方法二:在ShowMessage之前加一条检查语句(同一个begin end内)
       if ComponentState = [csDesigning] then
         ShowMessage(...
      

  3.   

    oldcamel33(驼子) :
    好像改下属性名并不能使它改变赋值的顺序, 我都试了好多次了, 另外改变属性声明的顺序也不行cnsuyong(小可) :
    FSTest要缺省值值就是 '',
    编辑属性时的顺序要求是先设 FSTest, 才可以设 FBTest
    运行时我也想让程序按这个顺序设 PSTest 与 FBTest 的值我要做的是一个数据库感知组件, 要先设置字段名, 再打开连接
      

  4.   

    属性编辑器修改了属性的值后是不是保存到一个 DFM 文件中去, 这是不是一个序列化的过程, 能不能像 VC 的序列化一样写一个自己的序列化的方法以控制属性读回来的顺序?
      

  5.   

    你的意思是:如果 FSTest = '' 那么
      BTest 是只读属性
    否则
      BTest 是可读写属性是这样的吗?
    如果是这样,那么建议你只好重新考虑属性之间的联系和约束关系了。
    关注。
      

  6.   

    我的意思是:如果 STest 属性的值被设置过, 才能设置 BTest 属性的值
    像 TTable , 只有设置有数据表的名称才能设置 Active 属性为 True
      

  7.   

    谢谢小可, 我的愿望是这样的:在设计阶段我用属性编辑器设置了属性的值
    到运行时刻我怎么按自己设定的顺序依次给各属性赋值
    比如我一定要先给 STest 赋值然后再 BTest 赋值, 这非常重要
      

  8.   

    如果是这样,你可以观察TTable的属性设置:
    设置DatabaseName -> 设置TableName -> 设置Active=True。
    如果此时改变DatabaseName或TableName属性,那么Active立刻变为False。
    因此:
    建议不仅要考虑FSTest作为FBTest的必要条件,而且要考虑FBTest改变时对FSTest的“反作用”。
    因为我还不完全清楚你设计的逻辑关系,所以也无法提供对症的代码。
    只好继续关注。
      

  9.   

    对的, 我想的就是这样
    我设计的组件也非常像 TTable 这个类
    这个类通过一个 Active 属性去打开数据库连接, 但连接数据库的前提是数据表的名称必须先给出, 否则无法打开数据库连接, 可是每次用属性编辑器设置好后-->存盘-->运行, 程序总是先设置 Active 属性而不是先设置表的名称, 我真不知该如何才能使程序按自己的想象中的顺序设置各属性的值
      

  10.   

    delphi这个东西真的不太会。
    说实话,我都不知道如何自己做一个组件,不过看了大家的意见之后想问几句。
    procedure SetBTest(Value : boolean) ;
    procedure SetSTest(Value : string) ;
    这两个函数是你自己调用的还是构造函数自己调用的?我看不出来。
    如果是你自己调用的,那你就改变调用的顺序。
    如果是系统自己调用的,你不需要这样弹出个对话框来,
    你可以直接调用另一个set函数设置一下就完了
      

  11.   

    procedure SetBTest(Value : boolean) ;
    begin
      if FSTest = '' then //改成if STest = '' then 一试
      begin
        ShowMessage('请先设置 STest 属性') ;
      end
      else begin
        FBTest := Value ;
      end ;
    end;