Results 1 to 6 of 6

Thread: StringGrid cellen één voor één van kleur veranderen

  1. #1

    StringGrid cellen één voor één van kleur veranderen

    Hallo,

    Ik wil in een StringGrid één voor één de cel een andere kleur geven op het moment dat er op die cel wordt geklikt.
    Maar dat gaat in onderstaande procedure niet goed. Er worden meerdere cellen tegelijk op rood gezet.
    Wat gaat er fout of is het niet mogelijk?

    H.G. Frans

    Code:
    PROCEDURE TForm1.FormCreate(Sender: TObject);
    
    BEGIN
      StringGrid1.Width := 5 * StringGrid1.DefaultColWidth;
      StringGrid1.Height := 5 * StringGrid1.DefaultRowHeight;
    END;
    
    procedure TForm1.StringGrid1Click(Sender: TObject);
    begin
      C[StringGrid1.Col] := StringGrid1.Col;
      R[StringGrid1.Row] := StringGrid1.Row;
    
    end;
    
    PROCEDURE TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: integer;
      aRect: TRect; aState: TGridDrawState);
    
    BEGIN
      StringGrid1.Canvas.Brush.Color := clRed;
      StringGrid1.Canvas.Brush.Style := bsSolid;
    
      IF (aCol = C[aCol]) and (aRow = R[aRow]) THEN
      BEGIN
        StringGrid1.Canvas.FillRect(aRect);
      END;
    END;

  2. #2
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Jouw probleem zit in de twee array's. Er wordt een vergelijking gemaakt dat col gelijk is aan C[col] en row gelijk is aan R[Row] en dat komt meerdere keren voor.
    Maak er een 2 dimensionale array aan en je probleem is opgelost. Vul je array niet met de waarde van de col/row, maar met waarde 1 (boolean mag ook).
    Delphi Code:
    1. procedure TForm1.FormCreate(Sender: TObject);
    2. var index, index2 : integer;
    3. begin
    4.   StringGrid1.Width := 5 * StringGrid1.DefaultColWidth;
    5.   StringGrid1.Height := 5 * StringGrid1.DefaultRowHeight;
    6.   for index := 0 to 5 - 1 do
    7.   begin
    8.     for index2 := 0 to 5 - 1 do
    9.       c[index,index2] := -1;
    10.   end;
    11.   teller := 0;
    12. end;
    13.  
    14. procedure TForm1.StringGrid1DblClick(Sender: TObject);
    15. begin
    16.    C[StringGrid1.Col,StringGrid1.Row] := 1;
    17. end;
    18.  
    19. procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
    20.   aRect: TRect; aState: TGridDrawState);
    21. begin
    22.   StringGrid1.Canvas.Brush.Color := clWhite;
    23.   StringGrid1.Canvas.Brush.Style := bsSolid;
    24.  
    25.   IF (C[aCol,aRow] = 1 ) THEN
    26.   BEGIN
    27.     StringGrid1.Canvas.Brush.Color := clRed;
    28.     StringGrid1.Canvas.Brush.Style := bsSolid;
    29.     StringGrid1.Canvas.FillRect(aRect);
    30.   END;
    31. end;
    Delphi is great. Lazarus is more powerfull

  3. #3
    Uit nieuwsgierigheid, ik zie een grid 5x5, kleuren wanneer je op een cell klikt.
    Bezig met nonogrammen?

    Ik heb nog even zitten kijken maar het vervelende is dat in de grids de cellen geen objecten zijn.
    Je zou het makkelijker kunnen maken door je eigen afstammeling van een grid te maken waar de cellen wel als object zijn opgenomen.

  4. #4
    Waarom niet gewoon de waarde 1 als string in die cell van de stringgrid zetten? Dat is toch veel makkelijker? Je hoeft uiteindelijk in de eigen ondrawcell die 1 ook helemaal niet naar het scherm te zetten (als ownerdraw op true staat geloof ik). En anders maak je de fontkleur dezelfde als de gewenste cellkleur. Maar volgens mij kan het gewoon in de drawcell. Geen aparte arrays nodig.

  5. #5
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    En wat als er wat anders dan waarde 1 in de cell moet staan. Laat Frans maar uitleggen wat hij wil. In ieder geval heb ik zijn voorbeeld aangepast, zodat het werkt.
    Ik heb nog even zitten kijken maar het vervelende is dat in de grids de cellen geen objecten zijn.
    Je zou het makkelijker kunnen maken door je eigen afstammeling van een grid te maken waar de cellen wel als object zijn opgenomen.
    Alles kan, maar waarom moeilijk doen als het ook simpel kan
    Delphi is great. Lazarus is more powerfull

  6. #6
    De oplossing van Rik werkt ook. Deze procedure heb ik nodig om een oefening voor de muis door een linkshandige persoon te laten maken.
    Het gaat er om de fijne motoriek voor linkshandige te verbeteren.
    Onderstaande code is met de opmerking van Rik uitgewerkt.

    Allemaal bedankt voor het meedenken en een hartelijke groet, Frans

    [CODE]procedure TForm1.FormCreate(Sender: TObject);
    var index, index2 : integer;
    begin
    StringGrid1.Width := 5 * StringGrid1.DefaultColWidth+10;
    StringGrid1.Height := 5 * StringGrid1.DefaultRowHeight+10;
    end;

    procedure TForm1.StringGrid1Click(Sender: TObject);
    begin
    StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row] := '1';
    end;

    procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
    aRect: TRect; aState: TGridDrawState);
    begin
    IF StringGrid1.Cells[aCol,aRow] = '1' THEN
    BEGIN
    StringGrid1.Canvas.Brush.Color := clRed;
    StringGrid1.Canvas.Brush.Style := bsSolid;
    StringGrid1.Canvas.FillRect(aRect);
    END;
    end;
    [\CODE]

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •