### Thread: Selection [1,2,4-6] to 2dim boolean array

1. No Profile Picture
Registered User
Devshed Newbie (0 - 499 posts)

Join Date
Sep 2012
Posts
3
Rep Power
0

#### Selection [1,2,4-6] to 2dim boolean array

Hey,

I want to do something like this, but i don't know how. For example I want to check in a crate on which places there is a beer inside. BEER[i,j] is a 2dim boolean array here. So I could say BEER[0,1] = TRUE and takebeer will execute on that location. But now i want to make a selection on my user interface, so that when i type 1,3,6-10, i want to convert this (suppose the crate is 6x4) to BEER[0,0], BEER[0,2], BEER[0,5], BEER [1,0], BEER[1,1]. How do I do that?

procedure takebeerbuttonclick(Sender: TObject);
begin
for I := 0 to Labware.nrofrows - 1 do
begin
for J := 0 to Labware.nrofcolumns - 1 do
begin
if BEER[I,J] = True then
begin
takebeer;
end;
end;
end;
end;

many thanks,

Dirk
2. No Profile Picture
Contributing User
Devshed Regular (2000 - 2499 posts)

Join Date
Jan 2006
Location
Posts
2,057
Rep Power
386
1,3,6-10, i want to convert this (suppose the crate is 6x4) to BEER[0,0], BEER[0,2], BEER[0,5], BEER [1,0], BEER[1,1]. How do I do that?
I think you need to do a bit more explaining (at least for me).

I don't see the logic (not the code) that converts
1,3,6-10
to
[0,0],[0,2],[0,5], [1,0], [1,1].

Clive
3. No Profile Picture
Contributing User
Devshed Newbie (0 - 499 posts)

Join Date
May 2012
Posts
158
Rep Power
6
You just need to convert "coordinates" into indexes. Usually you use mod or div here (or combination of both).

For example, in your case "coordinate" [0,0] is corresponding with index 1, [0,1] to index 2, [0, 2] to index 3. And the max "x" is 6 and max "y" is 4. You can use this routine to convert the "coordinates" into indexes. (Note: not tested, might need a little adjustment). Also note that I think some of your examples are invalid. Because you can not have "y" of 5 if the maximum is 4 (6x4 crate, right?).

Code:
```function CoordToIndex(const X, Y, AMaxX, AMaxY: Integer): Integer;
begin
Result := (X * AMaxX) + (Y mod AMaxY) + 1;
end;```

Code:
```procedure takebeerbuttonclick(Sender: TObject);
begin
for I := 0 to Labware.nrofrows - 1 do
begin
for J := 0 to Labware.nrofcolumns - 1 do
begin
if CoordToIndex(const I, J, 6, 4) in GivenIndexes then
takebeer;
end;
end;
end;```
4. No Profile Picture
Registered User
Devshed Newbie (0 - 499 posts)

Join Date
Sep 2012
Posts
3
Rep Power
0

#### can't compile

Hey Luthfi,

First of all thanks for your response. It helped a great deal, but there is still one problem.

My code is now:

Code:
```function CoordToIndex(const X, Y, AMaxX: Integer): Integer;
begin
Result := (Y * AMaxX) + (X mod AMaxX) + 1;
end;

procedure TForm4.takebeerClick(Sender: TObject);
var
rows: integer;
columns: integer;
I: integer;
J: integer;
GivenIndexes: array of integer;
begin
Setlength(GivenIndexes,2);
GivenIndexes[0] := 5;
GivenIndexes[1] := 21;
for I := 0 to rows - 1 do
begin
for J := 0 to columns - 1 do
begin
if CoordToIndex(J, I, 6) in GivenIndexes then
Showmessage('You took beer nr.' + InttoStr(CoordToIndex(J, I, 6)));
end;
end;
end;```
It only gives one error on this line:
if CoordToIndex(J, I, 6, 4) in GivenIndexes then
stating operator not applicable to operand type

ps. I think my example is correct, but I think you switched the 'I' and 'J' in your example code, also the formula was a little incorrect. But anyway thanks for your good idea, it helped me great!
5. No Profile Picture
Registered User
Devshed Newbie (0 - 499 posts)

Join Date
Sep 2012
Posts
3
Rep Power
0
Hey all, I already found the solution on another website source: check value is in set, this is my code now and it works great!

Code:
```function CoordToIndex(const X, Y, AMaxX: Integer): Integer;
begin
Result := (Y * AMaxX) + (X mod AMaxX) + 1;
end;

function ValueIn(Value: Integer; const Values: array of Integer): Boolean;
var
I: Integer;
begin
Result := False;
for I := Low(Values) to High(Values) do
if Value = Values[I] then
begin
Result := True;
Break;
end;
end;

procedure TForm4.takebeerClick(Sender: TObject);
var
rows: integer;
columns: integer;
I: integer;
J: integer;
GivenIndexes: array of integer;
begin
rows := 4;
columns := 6;
Setlength(GivenIndexes,2);
GivenIndexes[0] := 9;
GivenIndexes[1] := 23;
for I := 0 to rows - 1 do
begin
for J := 0 to columns - 1 do
begin
if ValueIn(CoordToIndex(J, I, columns),GivenIndexes) then
Showmessage('You took beer nr.' + InttoStr(CoordToIndex(J, I, columns)));
end;
end;
end;```