好的,我试图在运行时在TScrollBox曲面上创建一些TPanel的自定义编号,就像您在下面的图像上看到的那样。

为了获得这个结果,我使用了下面的代码,这很好。
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;现在,我在每个索引相同的TPanel中(img -> pan、img1 -> pan1等)都有问题。请看下面的图片:

使用同样的逻辑,我尝试创建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)中的同一个位置。这让我很困惑,因为它写的是Parent := pan[i-1];,但出于某种原因,它总是将TImage放在pan中。我尝试过使用断点来查看每个for循环循环之后发生了什么(在结束时添加了Application.ProcessMessages ),它确实创建了10个不同的图像,但将它们放到了pan上。当然,在最后,它显示了最后的图像加载到潘。
我的问题是如何使每个动态TImage (具有相同的数组索引)一个动态TPanel?
解决了!
发布于 2012-04-21 22:20:39
啊我找到了..。我真是瞎了..。
为了在delphi中自动完成,我在Picture.LoadFromFile()前面使用了Picture.LoadFromFile()。然后,显然我忘了从代码中删除它,而且从一小时前开始,“前缀”就一直存在,使得所有的图像都加载到相同的img中。我确信父母或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部分,并且在我的Delphi代码中没有把它看作是一个问题。显然,当我格式化这段代码时,我删除了一些部分,这使得在这里回答我的问题变得不可能:
很抱歉打扰了你们,那是我的错。
发布于 2012-04-22 04:38:30
还有建议--摆脱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;发布于 2012-04-21 22:17:25
您设置了两次Height,没有设置Left,所以似乎是这样的。
with pan[i-1] do begin
Width := 100;
Height := 150;
Top := x * 151;
Height := y * 101;
Parent := ScrollBox1;
end;https://stackoverflow.com/questions/10263225
复制相似问题