如何将动态面板设置为组件的父级?

How to set dynamic panel as component's parent?

好吧,我正在运行时创建一个 TImage 和一个 Tlabel,我希望这两个成为我也在运行时创建的 Tpanel 的子项。 这是一些代码:

with TPanel.Create(FlowPanelPlantillas) do
begin
  Name := 'Panel'+Query.FieldByName('ID').AsString;
  //Etc Etc
end;

和图片

with TImage.Create(TWinControl(FindComponent('Panel'+Query.FieldByName('ID').AsString))) do
  begin
    Name:= 'P'+Query.FieldByName('ID').AsString;
    Parent := TWinControl(FindComponent('Panel'+Query.FieldByName('ID').AsString));        
  end;

这就是我正在做的,但我没有工作,面板已正确创建和查看,但图像没有出现在面板中,它是空的。

我正在使用 Delphi Rio VCL

感谢任何帮助。

with 语句不向您提供对被引用对象的访问权限。您需要该引用才能将其分配给某些东西,例如 Parent 属性。您应该先保存对变量的引用。

此外,别忘了设置 Visible 属性。

试试这个:

var
  Panel: TPanel;

Panel := TPanel.Create(FlowPanelPlantillas);
with Panel do
begin
  Name := 'Panel'+Query.FieldByName('ID').AsString;
  //Etc Etcl
  Visible := True;
end;

...

Panel := TWinControl(FindComponent('Panel'+Query.FieldByName('ID').AsString));
// or, just use the same variable already assigned
// previously, if it is still in scope...

with TImage.Create(Panel) do
begin
  Name:= 'P'+Query.FieldByName('ID').AsString;
  Parent := Panel;
  Visible := True;
end;

在正确设计的动态代码中,FindComponent() 和命名对象的用处确实很少。命名系统主要仅用于 DFM 流。

就此而言,一旦您拥有一个包含对象引用的变量,with 就几乎没有用处,或者:

var
  Panel: TPanel;
  Image: TImage;

Panel := TPanel.Create(FlowPanelPlantillas);
Panel.Name := 'Panel'+Query.FieldByName('ID').AsString;
//Etc Etcl
Panel.Visible := True;

...

Panel := TWinControl(FindComponent('Panel'+Query.FieldByName('ID').AsString));
// or, just use the same variable already assigned
// previously, if it is still in scope...

Image := TImage.Create(Panel);
Image.Name := 'P'+Query.FieldByName('ID').AsString;
Image.Parent := Panel;
Image.Visible := True;

使用变量保存对象引用也有助于调试,因此您可以确保您的变量实际接收到您期望的值。使用 with.

时您不会获得该选项