Delphi World - Массив компонентов 2
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Массив компонентов 2

Автор: Юрий Лапицкий

Продолжая начатую тему в "Советах по Дельфи 1.0.9" о динамическом массиве компонентов (на этот раз двухмерном, так как одномерный очень хорошо был описан в этой версии журнала) я предлагаю следующей код который позволяет создать такой массив компонентов TImage с удобным (скажем так - почти) использованием их в этом массиве (например, при осуществлении связи с каким-то другим массивом). Я использовал этот код в одной из моих программ и после многих его тестов пришёл к выводу что он нормально работает при размерах массива 17х17 (думаю что можно довести и до 20х20 и более, но это увеличило бы код... Тем более что для моей программы такого массива вполне достаточно!).


{
Листинг 1: Создание двухмерного динамического массива компонентов
© 1999, Юрий Лапицкий
}

{
Шаг ?1: Вначале, сделаем потомок стандартного TImage как дополнение
для их различия в будующем массиве компонентов.
}
type

  TMyImage = class(TImage)
  private
    FXTag, FYTag: Longint;
  published
    property XTag: Longint read FXTag write FXTag default 0;
    property YTag: Longint read FYTag write FYTag default 0;
  end;
  {===================}
  {
  Шаг ?2: В описание класса главной формы вставим двухмерный динамический
  массив компонентов TMyImage, а в секцию private - необходимый код для
  инициализации массива!
  }
type
  TForm1 = class(TForm)

    //Процедура реализации события OnMouseUp при наведении на картинку
    procedure ImageMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  public
    Images: array of array of TMyImage;
  private
    {Процедура "создания" поля}
    procedure MakeField(const MaxRows: byte = 4; MaxCols: byte = 4);
    {Процедура "убора" поля (вообще-то не обязательно,
    но я предпочитаю перестараться, чем недостараться...)}
    procedure FreeField(const MaxRows: byte = 4; MaxCols: byte = 4);
  end;
var

  Form1: TForm1;
  Bitmap1: TBitmap;
  {
  В Bitmap1 можно загрузить картинку. Например из файла Bitmap1.bmp:

  Bitmap1:=TBitmap1.Create;
  Bitmap1.LoadFromFile('Bitmap1.bmp');
  }
  {===================}
  {
  Шаг ?3: Реализация процедур в секции implementation.
  }

procedure TForm1.MakeField(const MaxRows, MaxCols: byte);
var
  Col, Row: byte;
begin

  {Иницализация самого массива}
  Initialize(Images);
  System.SetLength(Images, MaxRows);
  for Row := 0 to MaxRows - 1 do
    System.SetLength(Images[Row], MaxCols);

  {Создание и заполнение элементов массива}
  for Row := 0 to MaxRows - 1 do
    for Col := 0 to MaxCols - 1 do
    begin
      Images[Row, Col] := TMyImage.Create(Self);
      with Images[Row, Col] do
      begin
        XTag := Row;
        YTag := Col;

        Picture.Bitmap := Bitmap1;
        Left := Col * Bitmap1.Width;
        Top := Row * Bitmap1.Height;
        Width := Bitmap1.Width + Left;
        Height := Bitmap1.Height + Top;
        Center := True;
        Transparent := True;
        AutoSize := True;
        Visible := True;
        onMouseUp := ImageMouseUp;

        Parent := Self;
      end
    end;

  Invalidate
end;

procedure TMainForm.FreeField(const MaxRows, MaxCols: byte);
var
  Col, Row: byte;
begin

  {Уничтожение элементов массива}
  for Row := 0 to MaxRows - 1 do
    for Col := 0 to MaxCols - 1 do
      Images[Row, Col].Destroy;
  {Уничтожение самого массива}
  Finalize(Images)
end;

procedure TMainForm.ImageMouseUp(Sender: TObject; Button:
  TMouseButton; Shift: TShiftState; X, Y: Integer);
begin

  { Проверка необязательна, но ведь можно (случайно)
  присвоить это событие также и форме!}
  if (Sender is TMyImage) then
  begin
    {
    обратиться к элементу массива можно используя введ?нные
    мною дополнения: Sender.XTag и Sender.YTag
    Images[Sender.XTag, Sender.YTag]
    }

  end
end;

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования