【问题标题】:Creating custom controls. Do I have to give them a name?创建自定义控件。我必须给他们一个名字吗?
【发布时间】:2018-11-13 10:13:48
【问题描述】:

假设我创建(从 TPanel)并安装我自己的控件。它只包含一个按钮:

constructor TMyPanel.Create(aOwner: TComponent);
begin
 inherited Create(aOwner);

 btn:= TButton.Create(Self);
 btn.Parent:= Self;   
 btn.Name:= 'xxx';      <-------- mandatory?
end;

是否必须为该面板命名?


这个问题是从 dummzeuch 在这里发表的评论开始的:

当您的标签没有名称时会发生这种情况。 IDE 添加 仅当控件有名称时才向类声明(否则如何 它应该声明它吗?)。

What does a EClassNotFound raised at runtime really mean when the class in question is there at compile and link time, and there explicitly in code?

(我特意只指那条评论)

【问题讨论】:

  • 你在混合苹果和橙子。链接的问题是关于从 dfm 流式传输的,在这里您正在代码中创建控件。不,您不需要名称,但您可能希望将其设置为子组件。
  • IDE 需要组件有一个名称,否则没有。因此,如果 IDE 不直接访问子组件的任何属性,则它不需要名称。这不会停止由父级设置组件的属性,例如通过 IDE 可见的父级属性。
  • @DalijaPrasnikar - 不。我不是在谈论那个问题。我在谈论一个非常具体的评论(也没有回答那个问题)。
  • @Dsm - 谢谢。我没有命名我的子控件。正如你所说,它工作正常。但是那个评论让我担心:“如果我一直做错了怎么办”?如果您将此作为答案发布,我会接受。
  • 根据要求发表评论作为答案

标签: delphi


【解决方案1】:

不,您不需要命名子组件。

但是,如果您打算将对子组件的访问公开为在 DFM 中流式传输的属性,则至少需要标记子组件:

constructor TMyPanel.Create(aOwner: TComponent);
begin
  inherited Create(aOwner);
  btn := TButton.Create(Self);
  btn.Parent := Self;
  btn.SetSubComponent(True); // <-- ADD THIS
end;

【讨论】:

  • "SetSubComponent" - 哦...是的!
【解决方案2】:

IDE 需要组件有一个名称,否则没有。因此,如果 IDE 不直接访问子组件的任何属性,则它不需要名称。这不会停止由父级设置组件的属性,例如通过 IDE 可见的父级属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多