Оператор 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
.