Kolory wybranych wierszy w KDBGrid

0

Lazarus.
Problem polega na tym, że potrzebuję pokolorować wybrane wiersze w gridzie w zależności od treści.
Z uwagi na kiepskie przewijanie standardowego DBGrid postanowiłem zastąpić go KDBGrid, a w nim we właściwościach nie ma zdarzenia onDrawColumnCell, zamiast tego jest onDrawCell.

W standardowym DBGrid miałem to zrobione tak i wszystko działa jak należy:

procedure TForm1.KDBGrid1DrawColumnCell(Sender: TObject; const R: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if ZQuery1.FieldByName('test').AsString='YES' then 
  DBGrid1.Canvas.Font.Color:=clred;
  DBGrid1.Canvas.FillRect(Rect);

  DBGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);
end;

jednak w przypadku grida KDBGrid zrobiłem tak i niestety to nie działa.

procedure TForm1.KDBGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; R: TRect; State: TKGridDrawState);
 begin 
     with TKCustomGrid(Sender) do
          begin 
             if ZQuery1.FieldByName('test').AsString='YES' then 
                 KDBGrid1.Canvas.Font.Color:=clred;
                 Cell[ACol, ARow].ApplyDrawProperties;
                CellPainter.GraphicHPadding := 3;
               CellPainter.DefaultDraw;
           end; 
end;

Efekt jest taki, że w sytuacji gdy wiersz z wartością pola "test" = "YES" będzie na 1 pozycji to wszystko jest czerwone zamiast tylko wybranych wierszy.
Gdy jest inaczej to nic nie zmienia koloru.

Przeczytałem cały internet, i nie znalazłem żadnej podpowiedzi.
Pewnie jestem za cienki w uszach, dlatego muszę prosić o ratunek.
Pomoże ktoś?

0

spróbuj oprogramować ustawianie koloru w sytuacji kiedy w wierszu pole 'test' jest różne od 'YES'
nie znam KDBGrid ale w tym kierunku szukał bym rozwiązania

procedure TForm1.KDBGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; R: TRect; State: TKGridDrawState);
begin
  with TKCustomGrid(Sender) do
  begin
    if ZQuery1.FieldByName('test').AsString = 'YES' then
      KDBGrid1.Canvas.Font.Color := clred
    else
      KDBGrid1.Canvas.Font.Color := clwhite;
    Cell[ACol, ARow].ApplyDrawProperties;
    CellPainter.GraphicHPadding := 3;
    CellPainter.DefaultDraw;
  end;
end;
0

Niestety to też nie pomaga.
Ale co ciekawe, takie cuś działa:

procedure TForm1.KDBGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; R: TRect; State: TKGridDrawState);
 begin 
     with TKCustomGrid(Sender) do
          begin 
              if ARow = 5 then   // wiersz piąty na czerwono 
                 KDBGrid1.Canvas.Font.Color:=clred;
                 Cell[ACol, ARow].ApplyDrawProperties;
                CellPainter.GraphicHPadding := 3;
               CellPainter.DefaultDraw;
           end; 
end;

... może to coś pomoże w rozwiązaniu tego tematu.

0

Może spróbujesz:

 if TKDBGrid(Sender).Cell[ACol, ARow].Text = 'coś' then
0

Nie bardzo wiem jak to wypróbować. Wywala taki błąd:

unit1.pas(1058,45) Error: identifier idents no member "Text"

Musi być jakaś metoda na pokolorowanie wybranych wierszy.
Może niepotrzebnie się meczę z tym komponentem KDBGrid ?
Wygląda na to, że jest dość mało popularny.

Zna ktoś może lepszy komponent zamiast DBGrid?
Muszę mieć możliwość sortowania i kolorowania wierszy no i perzwijanie powinno działać lepiej jak w standardowym DBGridzie.
Komponent może być płatny, byle działał pod Lazarusem.

Chyba, że jednak najdzie się ktoś kto używa i pomoże z tym KDBGridem ?

2

Przepraszam - krzywo mi się spojrzało. Ja do tej pory nie używałem tego grida i to tak z pośpiechu. Poprawiam się :-)

with TKDBGrid(Sender) do begin
  if trim(Cells[ACol, ARow]) = 'coś' then Canvas.Font.Color := clRed
                                     else Canvas.Font.Color := clWhite;
  Cell[ACol, ARow].ApplyDrawProperties;
  CellPainter.GraphicHPadding := 3;
  CellPainter.DefaultDraw;
end; 

Choć pewnie sam to już znalazłeś.

0

wielkie dzięki, o to chodziło :-)

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