使用一组TImage查找特定的图像

时间:2019-04-30 13:23:28

标签: image delphi set delphi-10.1-berlin

我有一个VCL表单,其左面板具有TImage的24个图像(imA1 ..imA24),而右面板具有TImage的30个图像(image25..image53)。所有图像均为100 x 150。 这些图像可能会加载宽度为100但高度不同的照片。计划以使Image.Height和Image.Top匹配的方式使所有显示的图片与Timage框架的底部对齐。 由于每个图像在运行时将加载不同的图片,因此我需要存储Image.Top位置(左右有5行图片)。 想法是通过一个单独的过程来完成此操作。请参见代码示例。 我面临的问题是,显然我对“一组”功能的使用不正确,或者对“ in”运算符的使用。 有人建议吗?谢谢-弗雷德 (我发现的另一种选择是将所有图像的原始最高位置存储在单独的记录字段中。也许更容易。但是为什么这种“套用”的用法不起作用?)

Type
TForm1 = class(Tform)
  imA1    : TImage;  // and all the others to imA24
  image25 : TImage; // etc

Type
  TShow = record
    image : TImage;
    ...   : ..  // other records
  end;

var
  ShowLeft   : array[1..24] of TShow;
  ShowRight  : array[1..30] of Tshow;
  ...

{ main code }

procedure PositionPicture(Im : TImage);
var
 FirstRow = set of (imA1, imA2, imA3, imA4, imA5, image25, image26, image27, 
            image28, image29, image30);
 SecondRow = set of ( .. different ones ..);
 ..
 FifthRow = set of ( ... );
 T0 : integer; // should contain the image.top value for all first row images
 K,L : integer;
begin
  if Im in FirstRow then T0 := 40;   // THIS GOES WRONG !!!!  
                                     // 40 is for the first row
  K := im.Picture.Height;  // actual height of the picture now in Im
  L := 150 -K;  // all images have a default height of 150 pixels.
  Im.Top := Im.Top + L; // move down Im by L 
  Im.Height := K;   // Im.top is now no longer 40, so for a new picture we     
end;                // need to get the original position back

Procedure MainProgram;
begin
  ...
  PositionPicture(ShowLeft[3].image);  // e.g. 3 here
  ...
end;

Procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowLeft[1].image := imA1;
  ..
  ShowLeft[24].image := imA24; 
  // ... etc
end;

2 个答案:

答案 0 :(得分:0)

您的“集合”概念确实是不正确的。您正在考虑集合的数学定义,其中可以在元素的任何内容上构成集合。在Delphi中,一组与枚举类型定义特别相关的东西,像这样

type
  TRow1Ref = (imA1, imA2, imA3, imA4, imA5, image25, image26, image27, 
        image28, image29, image30);

  FirstRow = set of TRow1Ref;

但这不是您要实现的目标。这些不是图像。 imA1的内部值为0,imA2的值为1,依此类推。您定义的任何集合最终都将在内部映射到字节或字等。

相反,您想使用某种数组或集合,例如

var
  FirstRow : TObjectList<TImage>;

(实现这一目标的方法有很多。)

答案 1 :(得分:0)

充分利用所有.align对象的TImage属性并将其设置为alBottom!这样,它们就可以彼此对齐,而您不必自己为每个属性计算.Top属性的值。

如果需要在单独的图像之间留出一定的间隔,则可以根据需要设置.Margins.Bottom / .Top.AlignWithMargins := true;

也许您需要在“ LeftPanel”和“ RightPanel”中放置其他TPanels才能使外观正确,但是您对表单设计的描述有点含糊,所以这更多是我的猜测…… >