奇怪,设计期加入的控件在运行期消失了??????(200分)

  • 主题发起人 主题发起人 kasly
  • 开始时间 开始时间
K

kasly

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾:
我做了个复合控件,是从TWINCONTROL继承来的,空间中包含了一个TPANEL
控件简单的不得了是吧,不过问题在测试控件时出现了,在设计期想此控件加入
其他控件,运行期时,加入的控件消失了!
如果能把这个问题解决,现上200分,决不失言!:(,靠,真贵,心疼!
 
你初始化尺寸了么? width, height, 还有, left, top
 
对了,控件代码如下:
class PACKAGE TPanelSelector : public TWinControl
{
private
TPanel *mypanel;
.......
}
...............
__fastcall TPanelSelector::TPanelSelector(TComponent* Owner)
: TWinControl(Owner)
{
Width = 183;
Height = 100;

mypanel = new TPanel(this);
mypanel->Align = alClient;
mypanel->Parent = this;
}
 
你是指在组合控件上加入其他控件,还是指组合控件的构造?
 
当然是在组合控件上加了!

如,把做好的控件先加到FORM上,然后在向其上加如其他控件!!!!
结果呢,后加入的控件消失!
 
如果你的 TPanelSelector 从 TPanel 继承怎么样
 
To Pipi:
我已经试过了,和现在的效果是一样的,我一直在想是不是因为在设计期新加入的
控件无法无法获得其PARENT指针句柄,因而造成其在运行期无法显示,但我无法解决???
 
估计加入的控件是跑到 TPanelSelector->mypanel 下面去了
 
To Pipi:
你说的没错,可是怎么解决这个问题,怎么才能让它在运行期显示呢????
 
从 TPanel 继承应该不会有这个问题吧
 
怎么你加入的控件没有加入到TPanelSelector->mypanel ,而是加入到了TPanelSelector 里面?
 
mypanel->SendToBack() 试试
 
我的理解是这样的,你在设计期加入的控件确实是加入到了TPanelSelector->mypanel上
面,但由于你加入的控件的信息没有被保存到dfm文件里(你加入后查看窗体的DFM文件,看
看能不能找到你刚才加入的控件?),至于为什么会这样,VCL的帮助没有说明,这个能是
Delphi(or CB)的IDE的处理问题,解决的方法是覆载
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;方法
告诉VCL你需要保存的控件。delphi的代码大致如下:
var
I: Integer;
Control: TControl;
begin
with mypanel do
begin
for I := 0 to ControlCount - 1 do
begin
Control := Controls;
if Control.Parent = mypanel then
Proc(Control);//表示此控件需要保存到DFM文件里
end;
end;
end;

这是Delphi的帮助内容
GetChildren is called by the VCL streaming system that loads and saves components. Applications seldom need to call this routine.
GetChildren executes the callback specified by the Proc parameter for every child control listed by the Controls property that lists the Root parameter as its Owner.
Override GetChildren to limit or augment which child controls are saved with the windowed control. When overriding GetChildren, call the procedure passed as the Proc
parameter for every child control that should be saved. The Root parameter indicates the component (usually a form) that owns the windowed control.
 
覆载GetChildren后在设计期加入的控件的Parent属性全部变为TPanelSelector,但由于
是在MyPanel上面所以能够正确的显示,如果你需要把设计期的控件的Parent属性改为
MyPanel,还需要响应CM_ControlChange消息,动态更改控件的Parent属性,代码可查看VCL
的源代码。
 
你应该记住其他控件在放在你的控件里的PANEL上时一定要让它们的PARENT就是控件实例当前所在PARENT!
否则加入的控件里PANEL里设计态加的其他控件在运行态PARENT就不是当前窗口,自然不见了
所以改你的控件代码,重载SetParent方法;代码如下
procedure YOUR1.SetParent(AParent: TWinControl);
BEGIN
inherited SetParent(AParent);
//下面将自己的子控件的PARENT也设置为自己的
for i:=0 to self.ControlCount do
controls.parent:=AParent;
END
 
后退
顶部