Динамическое изображение в динамическом TPanel?

Хорошо, я пытаюсь создать произвольное количество TPanel во время выполнения на поверхности TScrollBox, как вы можете видеть на следующем изображении.

Чтобы получить это, я использую следующий код, и это прекрасно работает.

var
  pan: array of TPanel;
  maxp, i, x, y: Integer;

...

maxp := 10;
SetLength(pan, maxp);

for i := 1 to maxp do begin
  // x is correct value; doesn't cause problem
  // y is correct value; doesn't cause problem
  pan[i-1] := TPanel.Create(form1);
  with pan[i-1] do begin
    Width := 100;
    Height := 150;
    Top := x * 151;
    Left := y * 101;
    Parent := ScrollBox1;
    end;
  end;

Теперь у меня проблемы с помещением объекта TImage в каждый TPanel с одинаковым индексом (img[0] -> pan[0], img[1] -> pan[1] и т. Д.). Посмотрите на следующее изображение:

Используя ту же логику, я пытался создать TImage, но безуспешно.

Я использую этот код и не могу понять, что не так. Это выглядит так просто для меня, но как-то не дает ожидаемого эффекта.

var
  pan: array of TPanel;
  img: array of TImage;
  maxp, i, x, y: Integer;

...

maxp := 10;
SetLength(pan, maxp);
SetLength(img, maxp);

for i := 1 to maxp do begin
  // x is correct value; doesn't cause problem
  // y is correct value; doesn't cause problem
  pan[i-1] := TPanel.Create(form1);
  with pan[i-1] do begin
    Width := 100;
    Height := 150;
    Top := x * 151;
    Left := y * 101;
    Parent := ScrollBox1;
    end;
  img[i-1] := TImage.Create(form1);
  with img[i-1] do begin
    Width := 98;
    Left := 1;
    Height := 148;
    Top := 1;
    // in original code next line had img[0]. which caused problem
    Picture.LoadFromFile('some_image_file');
    Parent := pan[i-1];
    end;
  end;

Каким-то образом он помещает все объекты TImage в одно и то же место в первом TPanel (pan[0]). Это сбивает с толку для меня, потому что это говорит Parent := pan[i-1]; но по какой-то причине он всегда помещает TImage в pan[0]. Я попытался использовать точки останова, чтобы увидеть, что происходит после каждого цикла цикла (добавлен Application.ProcessMessages в конце), и он действительно создает 10 различных изображений, но помещает их в панораму [0]. Конечно, в конце он показывает только последнее изображение, загруженное в pan[0].

Мой вопрос, как сделать один динамический TImage на динамический TPanel (с теми же индексами массива)?

РЕШИТЬ!

3 ответа

Решение

Ах, я нашел это... как я слепой на самом деле...

Чтобы получить автозаполнение в Delphi, я использовал img[0] перед Picture.LoadFromFile(), Затем, очевидно, я забыл удалить его из кода, и с тех пор час назад этот префикс остался там, заставляя все изображения загружаться в один и тот же img[0]. Я был уверен, что что-то не так со свойствами Parent или Pos/Size, и был сосредоточен на этом, не заботясь об этом.

Я на самом деле имел

  with img[i-1] do begin
    Width := 98;
    Left := 1;
    Height := 148;
    Top := 1;
    img[0].Picture.LoadFromFile('some_image_file');
    Parent := pan[i-1];
    end;

Но каким-то образом я удалил эту часть img [0] во время публикации этого вопроса и не видел ее в качестве проблемы в своем коде Delphi. Очевидно, что когда я форматировал этот код, я удалил некоторые части, и это сделало невозможным ответить на мой вопрос здесь:(

Очень жаль, что беспокою вас, ребята, это было плохо.

И совет - избавьтесь от with блоки. Сначала они могут показаться невинными и простыми, но в конечном итоге они служат только для написания неаккуратного кода, который трудно устранить. Если бы вы вместо этого использовали явные ссылки на переменные, эта проблема никогда бы не возникла.

var
  Panels: array of TPanel;
  Panel: TPanel;
  Images: array of TImage;
  Image: TImage;
  maxp, i, x, y: Integer;

...

maxp := 10;
SetLength(Panels, maxp);
SetLength(Images, maxp);

for i := 1 to maxp do begin
  Panel := TPanel.Create(form1);
  Panels[i-1] := Panel;
  Panel.Parent := ScrollBox1;
  Panel.SetBounds(...);
  Image := TImage.Create(form1);
  Images[i-1] := Image;
  Image.Parent := Panel;
  Image.SetBounds(...);
  Image.Picture.LoadFromFile('some_image_file');
end;

Ты устанавливаешь Height дважды и нет Left, Ну, это похоже.

with pan[i-1] do begin
  Width := 100;
  Height := 150;
  Top := x * 151;
  Height := y * 101;
  Parent := ScrollBox1;
end;
Другие вопросы по тегам