September 24th, 2012, 07:56 AM

Selection [1,2,46] 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,610, 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
September 24th, 2012, 06:04 PM

1,3,610, 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,610
to
[0,0],[0,2],[0,5], [1,0], [1,1].
Clive
September 25th, 2012, 12:48 AM

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;
So your code could be:
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;
September 25th, 2012, 05:08 AM

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!
September 25th, 2012, 05:34 AM

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;