delphi – 如何使用在设计时接受其他控件的子面板创建自定义控件
参见英文答案 >
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; 使用该代码,您现在可以将控件拖放到子面板上,但这意味着您还可以选择子面板,更改其属性,甚至删除您肯定不想要的属性.对不起,我无法想出答案,我仍然很想知道你是否解决了问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |