Динамическое изображение в динамическом 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;