【发布时间】:2011-09-18 04:40:15
【问题描述】:
当我们将组件创建为自定义控件并将控件拖放到面板上时,该控件始终显示在表单上而不是包含控件上。如何在 Create 中设置自定义控件的父级,以便当按钮拖放到面板上时,按钮父级就是面板?
TGlassButton = class(TCustomControl)
...
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
...
constructor TGlassButton.Create(AOwner: TComponent);
begin
inherited; ???????????
inherited Create(AOwner); ????????????
Parent := TWinControl( AComponent ); ??????????????
...
end;
问题是设计时创建而不是运行时。这非常有效:
procedure TForm10.FormCreate(Sender: TObject);
begin
GlassButton0 := TGlassButton.Create( Panel1 );
GlassButton0.Parent := Panel1;
GlassButton0.Left := 20;
GlassButton0.Top := 6;
GlassButton0.Width := 150;
GlassButton0.Height := 25;
GlassButton0.Caption := 'Created At RunTime';
end;
【问题讨论】:
-
您正在寻找的行为是免费发生的。您的代码中的其他内容必须阻止它。解决方案肯定不是在构造函数中设置
Parent! -
你不需要做任何特别的事情,通常一个 TCustomControl 后代就像开箱即用一样工作。您可能编写了一些干扰正常 VCL 控件创建的代码。显示您的代码。
-
是否有可能在将控件拖放到表单之前没有选择面板?
-
在删除控件之前是否选择了面板并不重要。表单在设计时始终是父级。
-
它可能是同一表单上的行为不端的自定义组件,或者是错误实现的设计时包。同样,通常 TCustomControl 后代会按预期放置在面板上。您的 TGlassButton 还包含哪些其他代码?您是否在设计时使用其他自定义组件在同一个表单上做一些可疑的事情?
标签: delphi