为什么我运行时创建的组件没有出现在表单上?

4
我正在测试来自这个问题和答案(Component Creation - Joining Components Together?)的示例,以学习如何创建自定义/复合组件。
虽然示例中安装的组件可以通过拖动到表单上进行操作,但我似乎无法在运行时创建它。
procedure TForm1.Button1Click(Sender: TObject);
var
MyPanel2 : TMyPanel;
begin
MyPanel2 := TMyPanel.Create(Form1);
With MyPanel2 do
  begin
    Left := 10;
    Top := 10;
    Width := 400;
    Height := 400;
    Visible := True;
    Image.Picture.LoadFromFile('C:\test.png');
  end;
end;

我尝试了 self 和 Form1 作为所有者。调整了面板和图像的属性。

只是不确定我做错了什么。除了忘记将 pngimage 添加到我的 uses 中导致错误外,没有其他错误。代码的步骤非常顺利,但运行时创建没有任何视觉效果。


1
我在我的最后一条评论中提到了Parent,这是针对你之前的问题的回答。 :-) - Ken White
1个回答

8
您需要在运行时代码中设置Parent
MyPanel2 := TMyPanel.Create(Self);
with MyPanel2 do
begin
  Parent := Self;//oops, you forgot to set this
  SetBounds(10, 10, 400, 400);
  Image.Picture.LoadFromFile('C:\test.png');
end;

你提供的代码无法使一个纯粹的 TPanel 或其他任何控件显示。

文档 中可以看到,我强调的是:

指定控件的父级。

使用 Parent 属性获取或设置控件的父级。控件的父级是包含它的控件。例如,如果应用程序在组合框中包含三个单选按钮,则组合框是三个单选按钮的父控件,单选按钮是组合框的子控件。

要作为父级,控件必须是 TWinControl 派生类的实例。

在运行时创建新控件时,请为新控件分配 Parent 属性值。通常,这是一个窗体、面板、组合框或设计用于包含另一个控件的控件。更改控件的父级移动将控件移到屏幕上,以在新父级内显示。当父控件移动时,子控件会随之移动。


糟糕!哈哈。好吧,它还不让我设置答案,但是当它允许时,你就有了答案。很高兴有人能回答最愚蠢的问题。现在学习可以开始了。 - Brian Holloway
1
+1. 我在回答者之前的问题中特别提到了这一点。我想我没有强调得足够多。 :-) - Ken White

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接