我先继承了一个ToolBar,然后覆盖了ToolBar的Create方法,在Create方法中构造了几个Button,设置了ToolBar和Button的Parent,覆盖了Loaded方法,在Loaded方法中设置几个Button的属性。但是必须在程序中有下面一句:
if not (csDesigning in ComponentState) then
否则程序在运行时总出错,而且打开一次多几个Button,我想这是组件每一次在csDesigning状态下都在构造Button。
但是我希望能在设计时看见Button并设置几个Button的Action,我看了一些Delphi的源码,但Delphi的控件大部分没有通过组合生成的(可能有,但我没找到)。
请问大家这个问题如何解决的?
刚学Delphi,请多指教.

解决方案 »

  1.   

    看看TMediaplay控件,这个就是经典的组合控件
      

  2.   

    谢谢大家的关注,看看TMediaplay先。
      

  3.   

    初步看了看TMediaplay和TDBNavigator,但问题还是没有解决。
    在TMediaplay和TDBNavigator中,从TCustomPanel继承,而我的例子从TToolBar继承。
    TCustomPanel是容器控件,而TToolBar不是。在TCustomPanel的子类的Create方法中使用如下代码:(来自TDBNavigator)
    ...
    Btn := TNavButton.Create (Self);
    ...
    Btn.Parent := Self;而在我的代码中使用:(TToolBar子类的Create方法)
    self.Parent := TWincontrol(AOwner);
    Btn := TSpeedButton.Create(AOwner);
    Btn.Parent := self;主要区别好像在Create(Self)和Create(AOwner)。
    我的理解是:在组件的Create(AOwner: TComponent)方法中指定的是组件的所有者(我取的名),
    所有者和Parent是不同的两个概念。容器类控件能够成为所有者,但一般的控件不行,所以在
    ToolBar的子类中不能使用Create(Self),而只能使用Create(AOwner),AOwner其实是ToolBar的
    所有者。所以TCustomPanel的子类中的控件在设计时是没有焦点的,而ToolBar的子类中的控件在
    设计时有焦点。不知道我的理解对不对?现在的问题应该是:在非容器类控件中组合其他控件,如何让控件在设计时和运行时保持一致?就是说可见、最好有焦点。欢迎大家讨论。
      

  4.   

    1、搂住为什么不在Create方法里面把button的参数都设置好那?
    2、AOwner和Parent是不同的,Parent决定控件现实的地方,控件在设计过程中都是不可见的,所以不知道搂住说的焦点是怎么回事。
      

  5.   

    To heluqing(鉴之小河〖挣大钱娶美女〗) :
    谢谢关注。
    1、不在ToolBar的Create方法中设置Button的参数,我的理解是此时ToolBar还没有构造完成,ToolBar中的某些子控件的属性设置无效,例如:Button的Left和Width,在ToolBar的Create中,设置Button的Width能改变Button的宽度,但设置Left却不能改变Button的位置,因为Button的Width属性和ToolBar没有关系,而Left属性却是相对ToolBar而言的,所以在ToolBar没有构造完成时,设置Button的Left没有效果。
    2、我说的设计时和运行时是这样的:例如:一个控件拖放到一个Form上,此时是控件的设计时;应用程序在运行过程中是控件的运行时。我不是指在编写控件的过程中。所谓焦点,是指控件在设计时能被选择,并能在Object Inspector中设置属性,例如:一个TDBNavigator,整个TDBNavigator具有焦点,但TDBNavigator中的每个按钮就没有焦点。