Как установить динамическую панель в качестве родителя компонента? - PullRequest
0 голосов
/ 14 мая 2019

Хорошо, я создаю во время выполнения 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 Ответ

2 голосов
/ 14 мая 2019

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

...