Использование набора TImage для поиска определенного изображения - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть форма VCL с левой панелью с 24 изображениями (imA1 .. imA24) TImage и правой панелью с 30 изображениями (image25 .. image53) TImage.Все изображения имеют размер 100 x 150. Эти изображения могут загружать изображения шириной 100, но разной высоты.План состоит в том, чтобы адаптировать Image.Height и Image.Top таким образом, чтобы все показанные изображения были выровнены по нижней части рамки Timage.Поскольку каждое изображение будет загружать разные картинки во время выполнения, мне нужно сохранить позиции Image.Top (у меня есть 5 рядов картинок слева и справа).Идея состояла в том, чтобы сделать это отдельной процедурой.Смотрите пример кода.Проблема, с которой я сталкиваюсь, заключается в том, что, по-видимому, мое использование функции 'set of' некорректно или использование оператора '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 голосов
/ 30 апреля 2019

Используйте свойство .align всех объектов TImage и установите его на alBottom! Таким образом, они выравнивают друг друга, и вам не нужно самостоятельно вычислять значение свойства .Top для каждого из них.

Если вам нужен интервал между отдельными изображениями, вы можете установить .Margins.Bottom / .Top для своих нужд и .AlignWithMargins := true;.

Возможно, вам нужны дополнительные TPanels, размещенные внутри ваших "LeftPanel" и "RightPanel", чтобы это выглядело правильно, но ваше описание дизайна формы немного размыто, так что это скорее мое предположение ...

0 голосов
/ 30 апреля 2019

Ваше понятие «набор» действительно неверно. Вы думаете больше о математических определениях наборов, где набор может быть составлен из чего угодно для элементов. В Delphi набор определенно относится к определениям типов enum, примерно так:

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>;

(Есть много альтернативных способов достижения этого.)

...