The Shed is going Social! Join us on FaceBook and Twitter and chime in on the conversation.
|
 |
|
Dev Shed Forums
> Programming Languages - More
> Delphi Programming
|
Selection [1,2,4-6] to 2dim boolean array
Discuss Selection [1,2,4-6] to 2dim boolean array in the Delphi Programming forum on Dev Shed. Selection [1,2,4-6] to 2dim boolean array Delphi Programming forum discussing Delphi related topics including Kylix, C++ Builder, and more. Delphi is a high-performance language, originally based on the PASCAL language.
|
|
 |
|
|
|
|

Dev Shed Forums Sponsor:
|
|
|

September 24th, 2012, 06:56 AM
|
|
Registered User
|
|
Join Date: Sep 2012
Posts: 3
Time spent in forums: 44 m 15 sec
Reputation 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
|

September 24th, 2012, 05:04 PM
|
|
Contributing User
|
|
Join Date: Jan 2006
Location: Carlsbad, CA
|
|
Quote: | 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
|

September 24th, 2012, 11:48 PM
|
|
Contributing User
|
|
Join Date: May 2012
Posts: 140
Time spent in forums: 1 Day 4 h 58 m 17 sec
Reputation Power: 2
|
|
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, 04:08 AM
|
|
Registered User
|
|
Join Date: Sep 2012
Posts: 3
Time spent in forums: 44 m 15 sec
Reputation 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!
|

September 25th, 2012, 04:34 AM
|
|
Registered User
|
|
Join Date: Sep 2012
Posts: 3
Time spent in forums: 44 m 15 sec
Reputation 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;
|
Developer Shed Advertisers and Affiliates
| Thread Tools |
Search this Thread |
|
|
|
| Display Modes |
Rate This Thread |
Linear Mode
|
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
|
|