Kolorowanie wierszy w DBGrid

0

Witam, analizuję forum związane z moim problemem i nie znajduję działąjacego rozwiązania
Mój problem to:
chciałbym wyróżnik wiersze w wyświetlonym Dbgrid'zie (innym kolorem) przy założeniu, że w kolumnie typ_dbia mamy zapis "Nie' lub 'Sob'
dołączam zrzut ekranu z zawartością DBrida
za wszelką pomoc i wskazówki z góry dziękuje

ekran1.jpg

1

Dosyć prosto coś takiego można wykonać. O ile dobrze rozumiem coś takiego powinno zadziałać https://stackoverflow.com/questions/16800103/change-dbgrid-row-color-on-field-value-in-delphi

1
procedure TForm1.DBGrid1PrepareCanvas(sender: TObject; DataCol: Integer; Column: TColumn; AState: TGridDrawState);
begin
  if TDBGrid(Sender).DataSource.DataSet.FieldByName('typ_dnia').Text = 'Sob' then
    TDBGrid(Sender).Canvas.Brush.Color := clSilver;
  if TDBGrid(Sender).DataSource.DataSet.FieldByName('typ_dnia').Text = 'Nie' then
    TDBGrid(Sender).Canvas.Brush.Color := clRed;
end;  
0

Dobrze pomyśleć o mouse down mouse up, żeby ładnie to wyglądało.

0

@Paweł Dmitruk: niestety nie zadziałało

0

tu masz moje do kolorowanie komurek w zależności od ilości w jednej z nich. Co prawda, jest to bardzo stare i zamiast dbgrid używam smdbgrid od scalabium ale możesz to sobie przerobić dla swoich celów, lmX_do to jak można się domyśleć limity:

procedure Tmain.smdbgrd1GetCellParams(Sender: TObject; Field: TField; AFont: TFont; var Background: TColor; Highlight: Boolean);
begin
  if Assigned(Field) and (UpperCase(Field.FieldName) = 'ILOSC') then
  begin
    if Field.AsFloat < lm3_do then
    begin
      AFont.Style := [fsBold];
      Background := clRed;
    end
    else if Field.AsFloat < lm2_do then
    begin
      AFont.Style := [];
      Background := clYellow;
    end
    else if Field.AsFloat < lm1_do then
    begin
      AFont.Style := [];
      Background := clGreen;
    end
    else
    begin
      AFont.Style := [];
      Background := clWhite;
    end
  end
end;
2
januszp napisał(a):

@Paweł Dmitruk: niestety nie zadziałało

Zdefiniuj nie zadziałało. Jesteśmy na forum programistycznym i tutaj raczej opisujemy dokładnie problem i jego objawy. Na coś takiego można tylko odpisać SOA#1 ;)

Ale dobra żarty na bok. Wszedłeś w linka którego Ci podałem? Chyba nie, po z porównania kodów z linka oraz kolegi @Paweł Dmitruk zobaczyłbyś coś ciekawego. W dowód pokazuję screena:
screenshot-20210704185232.png

0

Niestety w chwili uruchamiania programy wyskakują błędy jak w załączonym zrzucie ekranu

Bez tytułu.png

0

Sender musi być rzutowane na DBGrid więc TDBGrid(Sender). dalej nie wiem czy akurat masz komponent DataSource3 czy wklejasz kod nie wiedząc z czym to się je. Nie kolor clWindows tylko clWindow tyle od razu widzę bez kompilatora.

0

Za zamieszanie przepraszam, po głębszej analizie znalazłem moje błędy i procedura już działa i to bardzo skutecznie. Za pomoc bardzo dziękuję

3

Taka mała wskazówka — jeśli potrzebujecie Sendera zrzutować na konkretną klasę i użyć go w wielu miejscach danego bloku kodu, to na litość boską wykonajcie rzutowanie raz, zapiszcie referencję do typowanej zmiennej i jej używajcie. A jeśli Sender zawsze zawiera referencję konkretnej (spodziewanej) klasy, to nie róbcie rzutowania, a skorzystajcie z absolute i podłączcie zmienną pod argument metody.

Dzięki temu kod będzie krótszy i łatwiejszy w zrozumieniu, bez mnóstwa nawiasów.

0

Czy móby mi pan pamóć by na wydruku wiersze z typ_dnia (Nie, Sob) tez był wyróżniony innym kolorem. Korzysta z FastREport. Z góry dziękuje

0
januszp napisał(a):

Czy móby mi pan pamóć by na wydruku wiersze z typ_dnia (Nie, Sob) tez był wyróżniony innym kolorem. Korzysta z FastREport. Z góry dziękuje

https://www.fast-report.com/documentation/UserMan/index.html?conditional_highlighting.htm

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.