好吧,我正在运行时创建一个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
感谢您的帮助。
答案 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
时不会获得该选项。