StringGrid - Kolor obramowania

0

Witam.

Mam taką tabelkę:
tabelka.jpg

W OnDrawCell mam:

  with TStringGrid(Sender).Canvas do
   begin
     { COLORS }
     IF (aCol = 0) OR (aRow = 0)
     THEN
         begin
               Pen.Color := $00DCE8ED;
               Brush.Color := $00DCE8ED;
               Font.Style := [fsBold];
          end
     ELSE
         begin
               Pen.Color := $00E1E1E1;
               Brush.Color := StringToColor(StringGrid1.Cells[5, aRow]);
         end;

     { BACKGROUND }
     Rectangle(aRect);

     { TEXT }
     Font.Color:=clBlack;
     TextOut(aRect.Left + 4, aRect.Top + 2, TStringGrid(Sender).Cells[aCol, aRow]);
     Font.Style := [];
   end;                 

Jedyne co chciałbym zmienić, a z czym nie mogę sobie poradzić to kolor zaznaczenia wybranego wiersza (w ustawieniach StringGrid mam goRowSelect=True).

Próbowałem dodać:

       if gdSelected in aState then
           begin
                 Pen.Color := clGreen;
                 Pen.Style := psSolid;
                 pen.Width:=3;
           end;          

jednak nie zdaje to egzaminu ponieważ:

  • nadal widać "oryginalne" czerwone obramowanie
  • każda z komórek w wierszu obramowana jest osobno.

W jaki sposób podmienić to "oryginalne" obramowanie?

0

StringGrid1.Color ?

0

@hipekk - a jak wygląda zbiór Options w Twoim komponencie?

0

Coś takiego (nie wiem jak w bardziej "elegancki" sposób to przedstawić .... ):
opitons.jpg

0

Dodałem:

          if gdFocused in aState then
          begin
            Pen.Color := clRed;
            Pen.Style := psSolid;
           Rectangle(1, aRect.Top + 1,StringGrid1.Width-1, aRect.Bottom - 1);
          end;    

I zmieniłem DefaultDrawing Na False, no i "prawie" się udało:
prawie.jpg

1

W ten sposób tego nie zrobisz, bo w zdarzeniu malowania jednej komórki nie masz dostępu do kanwy innych w tym samym wierszu; Poza tym focusa trzyma tylko jedna komórka, nawet jeśli masz ustawione podświetlanie całego wiersza;

Jeżeli koniecznie chcesz mieć taki focus frame dla całego wiersza, to nie sprawdzaj istnienia gdFocused w zbiorze AState, tylko skorzystaj z gdSelected; Sprawdź którą komórkę malujesz, bo dla każdej podświetlonej rysujesz górę i dół ramki, a dla pierwszej w wierszu dodatkowo lewą stronę ramki i dla ostatniej w wierszu prawą stronę ramki;

Poniżej przykład takiego rysowania - zaznaczany jest zawsze cały wiersz, przy czym każdy posiada górną i dolną część ramki, a pierwszy i ostatni dodatkowo pionowe jej części; Kod będzie działał poprawnie bez względu na wartość właściwości FixedCols; Kod zdarzenia malującego jedynie tła komórek poniżej:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState);
const
  BACK_COLORS: array [Boolean] of TColor = (clWindow, clMenuHighlight);
var
  Grid: TStringGrid;
begin
  Grid := Sender as TStringGrid;

  with Grid.Canvas do
  begin
    { background }
    Brush.Color := BACK_COLORS[gdSelected in AState];
    FillRect(ARect);

    { frame }
    if gdSelected in AState then
    begin
      { frame props }
      Pen.Color := clYellow;
      Pen.Style := psDot;

      { top and bottom frame borders }
      Line(Point(ARect.Left, ARect.Top), Point(ARect.Right - 2, ARect.Top));
      Line(Point(ARect.Left, ARect.Bottom - 2), Point(ARect.Right - 1, ARect.Bottom - 2));

      { left frame border }
      if ACol = Grid.FixedCols then
        Line(Point(ARect.Left, ARect.Top), Point(ARect.Left, ARect.Bottom - 2));

      { right frame border }
      if ACol = Grid.ColCount - 1 then
        Line(Point(ARect.Right - 2, ARect.Top), Point(ARect.Right - 2, ARect.Bottom - 2));
    end;
  end;
end;

Efekt jego wykorzystania:

grid.png

A jeżeli będziesz chciał dodatkowo rysować focusa, to dorób sobie jeszcze inne malowanie, gdy gdFocused znajduje się w zbiorze AState - przynajmniej będzie wiadomo, która komórka jest aktualnie aktywna (choć u Ciebie edytowanie komórek jest obecnie wyłaczone).

0

Po delikatnej modyfikacji kodu uzyskałem dokładnie to co chciałem:
OK.jpg

A przy okazji dowiedziałem się jak "stworzyć" np komórkę przekreśloną na krzyż :).
Dziękuję serdecznie @furious programming.

1 użytkowników online, w tym zalogowanych: 0, gości: 1