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

时间:2019-05-14 20:16:59

标签: delphi vcl

好吧,我正在运行时创建一个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

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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时不会获得该选项。