DBGrid i niektóre rekordy w innych kolorach

0

Cześć, mam taki problem. Chcę w DBGridzie wyświetlić niektóre rekordy w innym kolorze niż inne. W zdarzeniu OnDrawColumnCell wpisałem kod:

if baseQuery.FieldByName('STAN_MAG').AsInteger<StrToInt(ReadSettings(LOW_CARGO)) then
     BaseGrid.Font.Color:=clRed else BaseGrid.Font.Color:=clBlack;

Chodzi o to, że jeśli wartość pola STAN_MAG danego rekordu jest mniejsza niż ta zaczytana z opcji to wtedy rekord ma się wyświetlić na czerwono.

I niby idzie, ale...

  1. Pierwsza kolumna danego rekordu jest na czarno(natomiast pierwsza kolumna następnego na czerwono)
  2. Program sprawia wrażenie zapętlenia.
    Jak to rozwiązać?
0

DefaultDrawing = False

i w onDrawDataCell

  if (not (gdFocused in State)) and (not (gdSelected in State)) and (Field.FieldName = 'nazwa_pola_które_chcesz_kolorować') then
  begin
    if (Field.AsInteger > MIN) and (Field.AsInteger < MAX)then
    begin
      dbgrd1.Canvas.Brush.Color := clRed;
    end;
  end;
  dbgrd1.DefaultDrawDataCell(Rect, Field, State);
0

OK, z tym, że teraz jest tak, że najpierw muszę kliknąć na Grida i dopiero wtedy pojawiają się kolory. Wcześniej wszystko jest czarne

0

kod

0
Misiekd napisał(a)

kod

(w onDrawColumnCell. W helpie piszą, żeby nie pisać event handlerów dla onDrawDataCell)

if (not (gdFocused in State)) and (not (gdSelected in State)) then
  begin
    if baseQuery.FieldByName('STAN_MAG').AsInteger<StrToInt(ReadSettings(LOW_CARGO)) then
    begin
      BaseGrid.Canvas.Font.Color:=clRed;
    end;
  end;
  BaseGrid.DefaultDrawDataCell(Rect, Column.Field, State);
0

cały, od procedure aż po end;

0
Misiekd napisał(a)

cały, od procedure aż po end;

No to jest cały :)
Zauważyłem, że jeśli w innym kolorze ma być ostatni wiersz, to wtedy jest ok. Jeśli jednak pierwszy, to trzeba najpierw kliknąć...

[dopisane]
Dobra już wiem. Ten cały warunek

if (not (gdFocused in State)) and (not (gdSelected in State)) then

jest niepotrzebny.

0
Juhas napisał(a)

Dobra już wiem. Ten cały warunek

if (not (gdFocused in State)) and (not (gdSelected in State)) then

jest niepotrzebny.

to zobacz jak wygląda wiersz jak go zaznaczysz

a ten kod masz w onDrawColumnCell czy onDrawDataCell?

0

A ja to robię tak:

if Field.AsString='1' then  BaseGrid.Canvas.Font.Color:=clRed;

BaseGrid.DefaultDrawDataCell(Rect, Field, State);

tylko że wtedy koloruje mi się tylko komórka w której jest '1', a ja chciałbym żeby kolorował mi się cały wiersz w którym jest komórka z '1' w środku. Jak to zrobić?

0
df napisał(a)

A ja to robię tak:

if Field.AsString='1' then  BaseGrid.Canvas.Font.Color:=clRed;

BaseGrid.DefaultDrawDataCell(Rect, Field, State);

tylko że wtedy koloruje mi się tylko komórka w której jest '1', a ja chciałbym żeby kolorował mi się cały wiersz w którym jest komórka z '1' w środku. Jak to zrobić?

Nie porównuj fielda, tylko jakieś Query(ADOQuery, IBQuery, czy coś co używasz)
(QUery.FieldByName()...)

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