Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#2

AW: OnDrawColumnCell - EINE Zelle färben, abhängig vom Wert einer anderen Zelle

  Alt 27. Okt 2017, 01:30
Suchst Du sowas? (Nur Fragmente als Idee)
Delphi-Quellcode:
procedure SetKategorieColor(iID : Integer; Field : TField; frmDBG : TfrmDGB);
begin
       if (Field.AsString = csDublette) then frmDBG.SetCellColor(clPurple,clWhite)
  else if (Field.AsString = csFormatUnbekannt) then frmDBG.SetCellColor(clRed,clYellow)
  else if (Field.AsString = csFrame) then frmDBG.SetCellColor(clBlue,clWhite)
  else
...
  else if (Copy(Field.AsString,1,4) = 'HTTP') then frmDBG.SetCellColor(clRed,clWhite)
  else if (Copy(Field.AsString,1,6) = 'Socket') then frmDBG.SetCellColor(clRed,clWhite)
  ;
  if (frmDBG.dbg.Tag = iID) then begin
    frmDBG.dbg.Canvas.Font.Style := [fsBold];
    frmDBG.SwapColor;
  end else begin
    frmDBG.dbg.Canvas.Font.Style := [];
  end;
end;

procedure TfrmDGB.SwapColor; // Cellfarbe und Schriftfarbe vertauschen.
var
      clTemp : TColor;
begin
  clTemp := dbg.Canvas.Brush.Color;
  dbg.Canvas.Brush.Color := dbg.Canvas.Font.Color;
  dbg.Canvas.Font.Color := clTemp;
end;

procedure TfrmDGB.SetCellColor(clBrush : TColor; clFont : TColor);
begin
  dbg.Canvas.Brush.Color := clBrush;
  dbg.Canvas.Font.Color := clFont;
end;

procedure TfmMain.frmDBGImageUrlsdbgDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  sName : String;
begin
  sName := AnsiUpperCase(Column.FieldName);
  if sName = 'KATEGORIEthen begin // Für dieses Feld wollen wir 'ne Sonderbehandlung.
    SetKategorieColor(fImgUrlID.AsInteger,Column.Field,frmDBGImageUrls);
  end else begin
    if (frmDBGImageUrls.dbg.Tag = fImgUrlID.AsInteger) then begin // Abfragen, ob' der aktuelle Satz ist.
      frmDBGImageUrls.dbg.Canvas.Font.Style := [fsBold];
      frmDBGImageUrls.dbg.Canvas.Font.Color := clBlack;
    end else begin
      frmDBGImageUrls.dbg.Canvas.Font.Style := [];
    end;
  end;
  // Der Aufruf von DefaultDrawColumnCell am Ende ist wichtig, sonst klappt es nicht.
  frmDBGImageUrls.dbg.DefaultDrawColumnCell(Rect, DataCol, Column, State);
  inherited;
end;
Hier gibt es ein Formular (TfmMain) mit u. a. dem Frame (TfrmDGB), auf welchem ein tJVDBGrid (dbg) liegt.

Dem DBGrid wird im Ereignis OnDrawColumnCell die Methode frmDBGImageUrlsdbgDrawColumnCell zugewiesen.

Eventuell kanmnst Du Dir hieraus was passendes zusammensuchen.

Prinzipiell kann man im Ereignis zu OnDrawColumnCell an den Spaltennamen zu der aktuell gezeichneten Zelle kommen und davon abhängig die Inhalte der anderen Spalten zum gleichen Datensatz abfragen und darauf "farblich" reagieren.

Man muss bei der Verarbeitung im Ereignis immer von der Zelle ausgehen, die gezeichnet wird. Man kann nicht von einer Zelle aus eine andere farblich umgestaltenn, sondern nur für die gerade zu zeichnende Zelle auf die Werte der anderen Spalten zum Datensatz reagieren.
  Mit Zitat antworten Zitat