请教控件编写中的包容性问题,内详,谢谢!!!(100分)

  • 主题发起人 主题发起人 form2
  • 开始时间 开始时间
F

form2

Unregistered / Unconfirmed
GUEST, unregistred user!
比如我想做一个继承于TPanel的控件A,同时在它上面还有一个Align:=alClient的TPanel控件B,
注册完控件A后,我在刚才的“B[其实是控件A]”上面放一个Label1,可是运行程序看不到Label1控件?

1。控件A已经在Create中设置了ControlStyle:=ControlStyle+[csAcceptsControls, csOpaque];
2。执行Label1.parent:=A.parent是没用的
3。干脆在Save之后的.DFM中,根本就没有Label1的影子

[B in A]=A ===> VCLs in B ===> VCLs不被保存

我的问题是:如何在A中的B里面包容我放进去的其他控件
 
在A上放一个设为ALCLIENT的B有必要么?把A全盖住了。
 
你丫这部废话嘛! B把A覆盖了。所以A上面的label看不见了
 
我总不至于这么弱智吧?要不我明确写出“Align:=alClient的TPanel控件B”干吗?

我要的就是这种效果!

也就是说我要在Designing阶段,把放在Form上A控件内的VCLs,在运行阶段过继到A中的B控件内,
昨晚我想了一个变通的方法,在Designing阶段在A上面画个假B,运行状态下再设置
控件B的Align:=alClient,同时设置VCLs.parent:=B.parent,我想应该可以变相成功的

不过我总觉得有更好的方法可以解决这个问题

 
“Align:=alClient的TPanel控件B”只是一个比喻,请各位不要钻牛角尖!
它等同于在组合控件Tpanel上面有一个“Align:=alLeft的TGroupBox控件”
现在这个有TGroupBox的Tpanel控件生成、注册、并且放在Form上了,同时也可以在
TGroupBox内添加所谓的TLabel控件,并且在设计状态TLabel是完全包容于TGroupBox中的!
问题是:当Delphi在Save .DFM时TLabel不会被保存!!!!
 
因为这个Lable没有被流化(TPersistent)
 
这不是一个简单的问题呀。
1. 如果你的panelB create时的owner是form, 则放到panelb上的label会被保存进dfm中, 但你每加载一次dfm就会生成一套新的panelB和Label
2. 如果你的panelB create时指定的owner是PanelA, 则panelB和PanelB上的所有控件都不会被保存到dfm中。
 
>>>>比如我想做一个继承于TPanel的控件A,同时在它上面还有一个Align:=alClient的TPanel控件B,
>>>>注册完控件A后,我在刚才的“B[其实是控件A]”上面放一个Label1,可是运行程序看不到Label1控件?

>>>>1。控件A已经在Create中设置了ControlStyle:=ControlStyle+[csAcceptsControls, csOpaque];

如果控件A是继承自TPanel,则不需要加入这行了,因为TCustomPanel已经有这句了。

>>>>2。执行Label1.parent:=A.parent是没用的

原因主要是因为你创建的Label是在A中而不是在B中,所以会被B盖住而看不见。

>>>>3。干脆在Save之后的.DFM中,根本就没有Label1的影子

>>>>[B in A]=A ===> VCLs in B ===> VCLs不被保存

>>>>我的问题是:如何在A中的B里面包容我放进去的其他控件

这个问题可能需要你重载A的父类的SetParent方法。这是Parent属性的写接口,
一般是属性的写接口都是静态的因而不能重载,但SetParent方法是virtual的所以可重载,
你可以在这个过程中把所有Parent属性设为A的控件的Parent都转设为B,但是B除外。
 
后退
顶部