0

好的,我正在尝试在运行时在 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;

现在,我无法将 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] 中。我尝试使用断点来查看每个 for 循环循环之后发生的情况(最后添加了 Application.ProcessMessages),它确实创建了 10 个不同的图像,但将它们放在 pan[0] 上。当然,最后它只显示加载到 pan[0] 中的最后一张图像。

我的问题是如何为每个动态 TPanel 制作一个动态 TImage(具有相同的数组索引)?

解决了!

4

3 回答 3

5

和忠告 - 摆脱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-22T04:38:30.157 回答
2

你设置Height了两次,没有Left,所以看起来。

with pan[i-1] do begin
  Width := 100;
  Height := 150;
  Top := x * 151;
  Height := y * 101;
  Parent := ScrollBox1;
end;
于 2012-04-21T22:17:25.920 回答
1

啊,我发现了……我真是瞎了眼……

为了在 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 代码中没有将其视为问题。显然,当我格式化这段代码时,我删除了一些部分,这使得在这里回答我的问题变得不可能:(

真的很抱歉打扰你们,那是我的错。

于 2012-04-21T22:20:39.553 回答