#1
  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. #2
  3. No Profile Picture
    Contributing User
    Devshed Regular (2000 - 2499 posts)

    Join Date
    Jan 2006
    Location
    Carlsbad, CA
    Posts
    2,057
    Rep Power
    383
    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
  4. #3
  5. No Profile Picture
    Contributing User
    Devshed Newbie (0 - 499 posts)

    Join Date
    May 2012
    Posts
    156
    Rep Power
    3
    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;
  6. #4
  7. 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!
  8. #5
  9. 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;

IMN logo majestic logo threadwatch logo seochat tools logo