Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Массив компонентов 2

Delphi , Синтаксис , Массивы

Массив компонентов 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 создает динамический двумерный массив компонентов TMyImage. Массив создается и инициализируется в процедуре MakeField, а уничтожается в процедуре FreeField.

Сначала код определяет класс TMyImage, который наследуется от TImage. Класс добавляет два свойства: XTag и YTag, которые используются для хранения индексов строки и столбца каждого изображения в массиве.

Основная форма (TForm1) имеет массив компонентов TMyImage, объявленный как Images. Процедура MakeField инициализирует этот массив с указанным количеством строк и столбцов, создает новые компоненты TMyImage для каждой позиции в массиве и устанавливает соответствующие свойства. Процедура FreeField уничтожает все изображения в массиве.

Процедура ImageMouseUp вызывается при получении события mouse up отображаемого изображения в массиве. Она проверяет, является ли отправителем (изображением, которое получило событие) компонентом TMyImage, и если да, то использует свойства XTag и YTag для доступа к соответствующему элементу в массиве Images.

Вот некоторые предложения по улучшению кода:

  1. Используйте более описательные имена переменных: имена переменных, такие как Row, Col, MaxRows и MaxCols, не очень описательны. Рекомендуется использовать более значимые имена, которые описывают их цель.
  2. Добавьте обработку ошибок: код предполагает, что массив будет всегда инициализироваться правильно, но на самом деле может возникнуть ошибка (например, если память не может быть выделена). Рекомендуется добавить код для обработки таких ситуаций.
  3. Используйте const-correctness: процедуры MakeField и FreeField принимают параметры MaxRows и MaxCols в виде byte-значений. Рекомендуется объявить эти параметры как const, чтобы предотвратить случайные изменения этих значений.
  4. Удалите ненужный код: код имеет некоторые комментированные строки, которые не используются в программе. Рекомендуется удалить их, чтобы сделать код чище и более читаемым.

Вот альтернативное решение с использованием другой подхода:

Вместо создания динамического массива компонентов TMyImage можно использовать компонент TStringGrid для создания сетки изображений. Каждое изображение можно добавить в сетку, установив свойство Parent в значение сетки, а затем установить его позицию в сетке, установив свойства Left и Top.

Вот пример кода, который демонстрирует этот подход:

procedure TForm1.MakeField(const MaxRows, MaxCols: byte);
var
  i, j: integer;
begin
  Grid := TStringGrid.Create(Self);
  Grid.RowCount := MaxRows + 1;
  Grid.ColCount := MaxCols + 1;

  for i := 0 to MaxRows do
    for j := 0 to MaxCols do
    begin
      Image := TImage.Create(Self);
      Image.Parent := Grid;
      Image.Left := j * (Grid.ClientWidth - 1) div MaxCols;
      Image.Top := i * (Grid.ClientHeight - 1) div MaxRows;
      // Установите другие свойства изображения, если необходимо
    end;

  Invalidate;
end;

procedure TForm1.FreeField;
begin
  Grid.Free;
end;

В этом коде создается компонент TStringGrid и заполняется ими TImage-компоненты. Каждое изображение добавляется в сетку, установив свойство Parent в значение сетки, а затем устанавливается его позиция в сетке, установив свойства Left и Top. Процедура FreeField просто уничтожает компонент Grid.

В статье рассматривается создание двухмерного динамического массива компонентов TImage с удобным использованием их в этом массиве. Автор предлагает пример кода, который позволяет создать такой массив и использовать его в


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Массивы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:10:36/0.0064418315887451/1