Delphi Programming
 
Forums: » Register « |  User CP |  Games |  Calendar |  Members |  FAQs |  Sitemap |  Support | 
User Name:
Password:
Remember me

The Shed is going Social! Join us on FaceBook and Twitter and chime in on the conversation.

Go Back   Dev Shed ForumsProgramming Languages - MoreDelphi Programming

Reply
Add This Thread To:
  Del.icio.us   Digg   Google   Spurl   Blink   Furl   Simpy   Y! MyWeb 
Thread Tools Search this Thread Rate Thread Display Modes
 
Unread Dev Shed Forums Sponsor:
  #1  
Old September 24th, 2012, 06:56 AM
dasya dasya is offline
Registered User
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Sep 2012
Posts: 3 dasya User rank is Just a Lowly Private (1 - 20 Reputation Level) 
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

Reply With Quote
  #2  
Old September 24th, 2012, 05:04 PM
clivew clivew is offline
Contributing User
Dev Shed Regular (2000 - 2499 posts)
 
Join Date: Jan 2006
Location: Carlsbad, CA
Posts: 2,045 clivew User rank is Major (30000 - 40000 Reputation Level)clivew User rank is Major (30000 - 40000 Reputation Level)clivew User rank is Major (30000 - 40000 Reputation Level)clivew User rank is Major (30000 - 40000 Reputation Level)clivew User rank is Major (30000 - 40000 Reputation Level)clivew User rank is Major (30000 - 40000 Reputation Level)clivew User rank is Major (30000 - 40000 Reputation Level)clivew User rank is Major (30000 - 40000 Reputation Level)clivew User rank is Major (30000 - 40000 Reputation Level)clivew User rank is Major (30000 - 40000 Reputation Level) 
Time spent in forums: 1 Week 6 Days 2 h 37 m
Reputation Power: 382
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

Reply With Quote
  #3  
Old September 24th, 2012, 11:48 PM
Luthfi Luthfi is offline
Contributing User
Dev Shed Newbie (0 - 499 posts)
 
Join Date: May 2012
Posts: 140 Luthfi User rank is Just a Lowly Private (1 - 20 Reputation Level) 
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; 

Reply With Quote
  #4  
Old September 25th, 2012, 04:08 AM
dasya dasya is offline
Registered User
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Sep 2012
Posts: 3 dasya User rank is Just a Lowly Private (1 - 20 Reputation Level) 
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!

Reply With Quote
  #5  
Old September 25th, 2012, 04:34 AM
dasya dasya is offline
Registered User
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Sep 2012
Posts: 3 dasya User rank is Just a Lowly Private (1 - 20 Reputation Level) 
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;

Reply With Quote
Reply

Viewing: Dev Shed ForumsProgramming Languages - MoreDelphi Programming > Selection [1,2,4-6] to 2dim boolean array

Developer Shed Advertisers and Affiliates



Thread Tools  Search this Thread 
Search this Thread:

Advanced Search
Display Modes  Rate This Thread 
Rate This Thread:


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
View Your Warnings | New Posts | Latest News | Latest Threads | Shoutbox
Forum Jump

Forums: » Register « |  User CP |  Games |  Calendar |  Members |  FAQs |  Sitemap |  Support | 
  
 


Powered by: vBulletin Version 3.0.5
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.

© 2003-2013 by Developer Shed. All rights reserved. DS Cluster - Follow our Sitemap