如何将动态面板设置为组件的父级?
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
.
时您不会获得该选项
好吧,我正在运行时创建一个 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
.