首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态TPanel中的动态TImage?

动态TPanel中的动态TImage?
EN

Stack Overflow用户
提问于 2012-04-21 21:37:39
回答 3查看 4.2K关注 0票数 0

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

为了获得这个结果,我使用了下面的代码,这很好。

代码语言:javascript
复制
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,但是没有成功。

我正在使用这段代码,却找不出出了什么问题。在我看来,这很简单,但不知怎么的,它并没有提供预期的效果。

代码语言:javascript
复制
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?

解决了!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-21 22:20:39

啊我找到了..。我真是瞎了..。

为了在delphi中自动完成,我在Picture.LoadFromFile()前面使用了Picture.LoadFromFile()。然后,显然我忘了从代码中删除它,而且从一小时前开始,“前缀”就一直存在,使得所有的图像都加载到相同的img中。我确信父母或Pos/Size属性有问题,并且一直关注这件事,而不是那么关心这件事。

实际上我有

代码语言:javascript
复制
  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代码中没有把它看作是一个问题。显然,当我格式化这段代码时,我删除了一些部分,这使得在这里回答我的问题变得不可能:

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

票数 1
EN

Stack Overflow用户

发布于 2012-04-22 04:38:30

还有建议--摆脱with块。乍一看,它们看起来既天真又简单,但从长远来看,它们只用于编写很难排除故障的草率代码。如果您使用显式变量引用,这个问题一开始就不会发生。

代码语言:javascript
复制
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;
票数 5
EN

Stack Overflow用户

发布于 2012-04-21 22:17:25

您设置了两次Height,没有设置Left,所以似乎是这样的。

代码语言:javascript
复制
with pan[i-1] do begin
  Width := 100;
  Height := 150;
  Top := x * 151;
  Height := y * 101;
  Parent := ScrollBox1;
end;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10263225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档