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

Bri*_*way 4 delphi

我正在测试这个Q&A 组件创建的例子 - 将组件连接在一起?了解如何创建自定义/复合组件.

虽然示例中安装的组件可以拖动到表单,但我似乎无法在运行时创建它.

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;
Run Code Online (Sandbox Code Playgroud)

我尝试了自己和Form1作为所有者.使用面板和图像的属性.

只是不确定我做错了什么.没有错误,除非我忘记添加pngimage到我的用途.完成代码的步骤很好,运行时创建没有任何可视化.

Dav*_*nan 7

您需要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;
Run Code Online (Sandbox Code Playgroud)

您问题中的代码不会导致控件显示普通香草TPanel,或实际上任何控件.

文档中,我强调:

指定控件的父级.

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

要充当父级,控件必须是TWinControl后代的实例.

在运行时创建新控件时,为新控件指定Parent属性值.通常,这是一个表单,面板,组框或旨在包含另一个的控件.更改控件的父级会在屏幕上移动控件,以便在新父级中显示它.当父控件移动时,子控件随父控件一起移动.