Массив компонентов 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;
varForm1: 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;
|