gpt4 book ai didi

delphi - 如何创建带有在设计时接受其他控件的子面板的自定义控件?

转载 作者:行者123 更新时间:2023-12-03 15:02:05 25 4
gpt4 key购买 nike

我编写了一个自定义控件,它有几个子面板。我希望这些子面板接受设计时放置在其上的任何附加控件。

不幸的是,在设计时删除的任何控件最终都会出现在我的自定义控件上,而不是面板上。如果我尝试删除标签,这会特别显示:显示标签的蓝点,但不显示其标题,如果我取消选择标签,它根本不再可见。

简化代码(只有一个子面板):

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 是不够的。我得到的最接近的是一个让子面板相信它的设计如下的黑客:

type
TGiveMeProtected_Component = class(TComponent);

procedure TMyContainer.Create(AOwner: TComponent);
begin
FSubPanel := TPanel.Create(Self);
TGiveMeProtected_Component(FSubPanel).SetDesigning(True, True);
end;

使用该代码,您现在可以将控件拖放到子面板上,但这意味着您还可以选择子面板,更改其属性,甚至删除您绝对不想要的子面板。抱歉我无法给出答案,我仍然很想知道你是否能找到答案。 :)

关于delphi - 如何创建带有在设计时接受其他控件的子面板的自定义控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/374451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com