Control ArraysLazarus does not have the inbuilt facility to create control arrays so a work around must be used. This is not as difficult as it might seem. Try the following.
Create and save a new project called Experiment.
Place an Image onto the form you have created. Name it
shapeImage_0. Set its Visible property to false.
Now, in the Public declarations section create an array so...
images : array[1..20,1..20] of TImage;Underneath create a procedure called
Shapes(i : integer; f : integer);In the
var section put this..
MAP : array[1..20,1..20] of integer;
Now create the Shapes procedure..
procedure TForm1.Shapes(i : integer; f : integer);
begin with images[i,f] do
begin Canvas.Rectangle(20,20,0,0);
Case MAP[i,f] of
0 :
begin Canvas.Brush.Color := clYellow;
Canvas.Pen.Color := clYellow;
Canvas.Ellipse(5,5,15,15);
end; 1 :
begin Canvas.Brush.Color := clWhite;
Canvas.Pen.Color := clWhite;
Canvas.Ellipse(5,5,15,15);
end; 2 :
begin Canvas.Brush.Color := clRed;
Canvas.Pen.Color := clRed;
Canvas.Ellipse(1,1,18,18);
end; 3 :
begin Canvas.Brush.Color := clBlue;
Canvas.Pen.Color := clBlue;
Canvas.Ellipse(1,1,18,18);
end; end;
end;end;Now, fill in the FormCreate like this..
procedure TForm1.FormCreate(Sender: TObject);
var i, f, g, nCtrl : integer;
begin { create images for shapes }
nCtrl := 0;
for f := 1 to 20 do
begin for i := 1 to 20 do
begin Inc(nCtrl);
images[f,i] := TImage.Create(self);
with images[f,i] do
begin
parent := self;
tag := nCtrl;
name := 'shapeImage_' + IntToStr(tag);
visible := True;
autosize := False;
stretch := false;
Height := 20;
Width := 20;
Left := 10 + (i*20) - 19;
Top := 5 + (f*20) -20;
Canvas.Pen.Color := clBlack;
Canvas.Brush.Color := clBlack;
OnClick := @shapeImage_0Click;
end;
end;
end; Randomize;
for i := 1 to 20 do
begin for f := 1 to 20 do
begin g := Random(100);
if(g >= 1) then MAP[i,f] := 0;
if(g >= 30) then MAP[i,f] := 1;
if(g >= 60) then MAP[i,f] := 2;
if(g >= 80) then MAP[i,f] := 3;
Shapes(i, f);
end; end;
end;
Now, to end create an OnClick event with the TImage you placed on the form and fill it with this..
procedure TForm1.shapeImage_0Click(Sender: TObject);
var j, k, l, m: integer;
i : Longint;
begin i := TImage(sender).Tag;
for j := 1 to 20 do
begin for k := 1 to 20 do
begin if images[j,k].Tag = i then
begin l := j;
m := k;
end;
end;
end; MessageDlg( 'You have clicked on ' + IntToStr(l) + ',' + IntToStr(m), mtInformation, [mbOk],0);
end;Save and execute the application and you should see this..
Click on one of the shapes and a message dialog will pop up and tell you which element of the control array you accessed.
That's it, from this starting point you can do a great deal. I'm sure you can think of more!