参见英文答案 >
Let components dropped on my control in the IDE become children of my control1个
我编写了一个自定义控件,它有几个子面板.我希望这些子面板能够接受在设计时丢弃的任何其他控件.
我编写了一个自定义控件,它有几个子面板.我希望这些子面板能够接受在设计时丢弃的任何其他控件.
不幸的是,任何在设计时掉落的控件都会在我的自定义控件上出现,而不是在面板上.这特别显示我是否尝试删除标签:标签的蓝点显示,但标题不是,如果我取消选择标签,则根本不再可见.
简化代码(只有一个子面板):
type TMyContainer = class(TPanel) p_SubPanel: TPanel; public constructor Create(_Owner: TComponent); override; end; constructor TMyContainer.Create(_Owner: TComponent); begin inherited; p_SubPanel := TPanel.Create(Self); p_SubPanel.Parent := Self; p_SubPanel.Align := alClient; end;
我在这做错了什么?
(以防万一重要:我使用的是Delphi 2007.)
[编辑]
我现在以不同的方式解决了它.该组件不再包含面板,但指的是外部面板.这使得它实际上更加灵活,但在不利方面,它不再直观易用.
解决方法
这是一个很好的问题.通过将csAcceptControls添加到控件ControlStyle属性,您可以允许自定义TWinControl在设计时删除其他控件.
constructor TMyContainer.Create(AOwner: TComponent); begin inherited; ControlStyle := ControlStyle + [csAcceptControls]; end;
但是在尝试解决这个问题时,我无法将控件放到自定义控件中的子面板上.将csAcceptControls添加到子面板的ControlStyle是不够的.我得到的cloest是一个黑客来说服子面板它的设计是这样的:
type TGiveMeProtected_Component = class(TComponent); procedure TMyContainer.Create(AOwner: TComponent); begin FSubPanel := TPanel.Create(Self); TGiveMeProtected_Component(FSubPanel).SetDesigning(True,True); end;
使用该代码,您现在可以将控件拖放到子面板上,但这意味着您还可以选择子面板,更改其属性,甚至删除您肯定不想要的属性.对不起,我无法想出答案,我仍然很想知道你是否解决了问题. 原文链接:https://www.f2er.com/delphi/103220.html