delphi – 如何使用在设计时接受其他控件的子面板创建自定义控件?

前端之家收集整理的这篇文章主要介绍了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;

使用该代码,您现在可以将控件拖放到子面板上,但这意味着您还可以选择子面板,更改其属性,甚至删除您肯定不想要的属性.对不起,我无法想出答案,我仍然很想知道你是否解决了问题. 原文链接:https://www.f2er.com/delphi/103220.html

猜你在找的Delphi相关文章