加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 10:13:09 所属栏目:大数据 来源:网络整理
导读:参见英文答案 Let components dropped on my control in the IDE become children of my control1个 我编写了一个自定义控件,它有几个子面板.我希望这些子面板能够接受在设计时丢弃的任何其他控件. 不幸的是,任何在设计时掉落的控件都会在我的自定义控件上出
参见英文答案 > 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;

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读