Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   OnDrawColumnCell - EINE Zelle färben, abhängig vom Wert einer anderen Zelle (https://www.delphipraxis.net/194195-ondrawcolumncell-eine-zelle-faerben-abhaengig-vom-wert-einer-anderen-zelle.html)

itsafranky 26. Okt 2017 23:59

Datenbank: absoluteDB • Version: 7 • Zugriff über: Delphi?

OnDrawColumnCell - EINE Zelle färben, abhängig vom Wert einer anderen Zelle
 
Moin !

Da will ich mich mal ein erstes Mal versuchen... :-)
(Hoffe ich mach nicht gleich alles falsch !

Ich möchte über OnDrawColumnCell eines dbGrids in der
Zeile X die Zelle in der Spalte Y in Abhängikeit des
Zellenwertes wegen mir in der Spalte Y+2 ändern (z.b. farbe, egal):

Spalte1........Spalte2...Spalte3

x1)rot/grün...(x2)......(x3)Wahr/Falsch.... Zeile x

Also ist x3 wahr wird x1 rot, ist x3 falsch wird x1 grün.

Das würde mir schon reichen.

Ich kann nur immer in einer Spalte "spielen".....

OK, also wäre nett wenn ihr eine Idee habt.

P.S.: Sollte ein diebezüglicher Beitrag bereits existieren
bitte nicht schimpfen, sondern bitte kurz vermuten warum ich
den nicht gefunden habe.

also thanks frank

nahpets 27. Okt 2017 00:30

AW: OnDrawColumnCell - EINE Zelle färben, abhängig vom Wert einer anderen Zelle
 
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 = 'KATEGORIE' then 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.

TigerLilly 27. Okt 2017 07:00

AW: OnDrawColumnCell - EINE Zelle färben, abhängig vom Wert einer anderen Zelle
 
Je nach Grid, kann man das anders machen, aber für VCL.TDBGrid:

In OnDrawColumncell prüfst du, ob du in der Zelle bist, die du anders dargestellt haben möchtest.
Du hast auf die Werte der anderen Zellen Zugriff, bzw auf die Feldwerte:
http://docwiki.embarcadero.com/Libra...mDBGrid.Fields

Dein Grid bewegt sich synchron zur Datenmenge und umgekehrt, dh die Zeile eines Grids entspricht der aktuellen Zeile der Datenmenge dh du kannst direkt in der Datenmenge deinen Wert holen und darauf reagieren.

Ähnliche Frage:
https://stackoverflow.com/questions/...index/37853296

Genügt das zum Weitermachen?

itsafranky 27. Okt 2017 10:38

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

vielen dank, alles gut !
entscheidend für mich idi.... war der hinweis:

"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."

habe es exact umgekehrt probiert....

netten tag frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz