Советы по Delphi

         

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


Пришло ко мне письмо...

Вот что пишет по этому поводу Юрий Лапицкий:

Продолжая начатую тему в "Советах по Дельфи 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) procedure ImageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X,Y: Integer); //Процедура реализации события OnMouseUp при наведении на картинку 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;
[000188]



Содержание раздела