给出一个很简单的组件示例:Ttest = class(TPanel)
  private  public
    Fbtn: TButton;
    constructor create(aowner: TComponent);override;
    destructor destroy;override;
  published
    property Btn : TButton read Fbtn write Fbtn;  end;procedure Register;
begin
    RegisterComponents('TEST', [Ttest]);
end;constructor Ttest.create(aowner: TComponent);
begin
  inherited create(aowner);
  btn := TButton.Create(Self);
  btn.Parent := self;
end;destructor Ttest.destroy;
begin
  btn.Free;
  inherited destroy;
end;一个很简单的组件,一个Panel中包含一个按钮。注册后,在设计阶段。对按钮属性的改变可是即时显示出来。但运行后,却不能得到体现。例如:设计时设置按钮的caption为‘test’,但运行后,caption却什么也没有。何解?

解决方案 »

  1.   

    你在保存到dfm,才有效的!很簡單的事情,要說清楚卻不易!看看<<delphi 精要>>,裹面有類似的東西
      

  2.   

    设计期和运行期是两回事。运行的时候,BTN被再次重新在 构造函数里 创建。
    constructor Ttest.create(aowner: TComponent);
    begin
      inherited create(aowner);
      btn := TButton.Create(Self);
      btn.Parent := self;
    end;
    BTN 现在CAPTION=‘’;你可以提供一个 诸如 
    private
      FText:String;
      procedure SetText(val:string);
    ....
    property
     property Text:String read FText write FText;的可读写属性来改变btn的CAPTION;
    procedure TTest.SetText(val:string);
    begin
      if FText<>val then
     beign
      FText:=val;
      Btn.caption:=FText;
      end;
    end;
      

  3.   

    to : aiirii(ari-爱的眼睛) 
    在设计时设置的属性没有自动保存到dfm中吗?其实我一直怀疑就是这个问题。具体一点可以吗?
      

  4.   

    to : SydPink(勿扰,闭关修炼中!) 
      

  5.   

    to : SydPink(勿扰,闭关修炼中!) 
    我知道这样子可以,但是我现在要的是设计时的属性会在运行时得以体现。
      

  6.   

    constructor Ttest.create(aowner: TComponent);
    begin
      inherited create(aowner);
      btn := TButton.Create(aowner);//不要用Self,用AOwner
      btn.Parent := self;
    end;
      

  7.   

    to :  cybercake(数字蛋糕) 
    首先还是很感谢你的回答。但是,你先试过再说。你这样做连在设计模式下创建控件都会出错!
      

  8.   

    问:为什么控件编辑器不会将控件属性的变动储存起来?
    我发现有时自制的控件编辑器不会将控件属性储存起来。设计时刻一切正常,但是储存起来再重新读入后就有问题了。
    答:原因是你很可能忘了在控件编辑器中调用此方法:
    Designer.Modified;
    如此一来Delphi才会知道你的控件编辑器更改过属性值了。
    (节选自控件开发FAQ)
      

  9.   

    to zjl317(西门春雪):会吗???我自己以前做的一个PageControl控件就是这么做的。
    我当时是这么写的:tab := TSSGeTabSheet.Create(GetParentForm(Source));
    其中Source是我自己写的PageControl。上面的代码一直工作的很好,你能不能把你的控件代码寄给我看一看?
      

  10.   

    继续说一下。看到你的报错我又试了一下。设计时创建控件没有问题,但是运行时会报错“Class TButton not found!”。忽然想起这个问题我原来也遇到过,最后还是通过手动注册类来实现的。建议你在随便某个单元的末尾加上initialization
      RegisterClass(TButton);更好的解决方法正在探索中……
      

  11.   

    我按你上面的方面试了一下,设计和运行时都没有问题了。但是又有一个新的问题:
    当处于设计模式下时,我对面板内的按钮的进行了拖动,调整了一下位置。但是运行时,我却看到有两个按钮出现。一个是我设置过的被我调整过位置的按钮,而另一个按钮出现在默认的位置,没有相关属性。我想应该会有其它的解决的方法,就比如那个DataSource控件里面有一个DataSet一样。
      

  12.   

    跟DataSource的DataSet不一样的。DataSource中的DataSet只是一个连接而已。
    问题的解决方法在于在创建Button的时候检查是否在设计状态下。如果不是则不创建按钮。对于控件的连接其实还有一些要注意的事情。比如使用FreeNotification系列方法来响应被连接的控件被删除的事件等。
      

  13.   

    问题已经解决。谢谢以上各位。
    至于解决的方法,大家可以参考一下控件的Font属性。我的解决方法也是如此。结贴了。