Продолжая начатую тему в "Советах по Дельфи 1.0.9" о динамическом массиве
компонентов (на этот раз двухмерном, так как одномерный очень хорошо был описан
в этой версии журнала) я предлагаю следующей код который позволяет создать такой
массив компонентов TImage с удобным (скажем так - почти) использованием их в
этом массиве (например, при осуществлении связи с каким-то другим массивом). Я
использовал этот код в одной из моих программ и после многих его тестов пришёл к
выводу что он нормально работает при размерах массива 17х17 (думаю что можно
довести и до 20х20 и более, но это увеличило бы код... Тем более что для моей
программы такого массива вполне достаточно!).
Код Delphi создает динамический двумерный массив компонентов TMyImage. Массив создается и инициализируется в процедуре MakeField, а уничтожается в процедуре FreeField.
Сначала код определяет класс TMyImage, который наследуется от TImage. Класс добавляет два свойства: XTag и YTag, которые используются для хранения индексов строки и столбца каждого изображения в массиве.
Основная форма (TForm1) имеет массив компонентов TMyImage, объявленный как Images. Процедура MakeField инициализирует этот массив с указанным количеством строк и столбцов, создает новые компоненты TMyImage для каждой позиции в массиве и устанавливает соответствующие свойства. Процедура FreeField уничтожает все изображения в массиве.
Процедура ImageMouseUp вызывается при получении события mouse up отображаемого изображения в массиве. Она проверяет, является ли отправителем (изображением, которое получило событие) компонентом TMyImage, и если да, то использует свойства XTag и YTag для доступа к соответствующему элементу в массиве Images.
Вот некоторые предложения по улучшению кода:
Используйте более описательные имена переменных: имена переменных, такие как Row, Col, MaxRows и MaxCols, не очень описательны. Рекомендуется использовать более значимые имена, которые описывают их цель.
Добавьте обработку ошибок: код предполагает, что массив будет всегда инициализироваться правильно, но на самом деле может возникнуть ошибка (например, если память не может быть выделена). Рекомендуется добавить код для обработки таких ситуаций.
Используйте const-correctness: процедуры MakeField и FreeField принимают параметры MaxRows и MaxCols в виде byte-значений. Рекомендуется объявить эти параметры как const, чтобы предотвратить случайные изменения этих значений.
Удалите ненужный код: код имеет некоторые комментированные строки, которые не используются в программе. Рекомендуется удалить их, чтобы сделать код чище и более читаемым.
Вот альтернативное решение с использованием другой подхода:
Вместо создания динамического массива компонентов TMyImage можно использовать компонент TStringGrid для создания сетки изображений. Каждое изображение можно добавить в сетку, установив свойство Parent в значение сетки, а затем установить его позицию в сетке, установив свойства Left и Top.
Вот пример кода, который демонстрирует этот подход:
procedureTForm1.MakeField(constMaxRows,MaxCols:byte);vari,j:integer;beginGrid:=TStringGrid.Create(Self);Grid.RowCount:=MaxRows+1;Grid.ColCount:=MaxCols+1;fori:=0toMaxRowsdoforj:=0toMaxColsdobeginImage:=TImage.Create(Self);Image.Parent:=Grid;Image.Left:=j*(Grid.ClientWidth-1)divMaxCols;Image.Top:=i*(Grid.ClientHeight-1)divMaxRows;// Установите другие свойства изображения, если необходимоend;Invalidate;end;procedureTForm1.FreeField;beginGrid.Free;end;
В этом коде создается компонент TStringGrid и заполняется ими TImage-компоненты. Каждое изображение добавляется в сетку, установив свойство Parent в значение сетки, а затем устанавливается его позиция в сетке, установив свойства Left и Top. Процедура FreeField просто уничтожает компонент Grid.
В статье рассматривается создание двухмерного динамического массива компонентов TImage с удобным использованием их в этом массиве. Автор предлагает пример кода, который позволяет создать такой массив и использовать его в
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.