Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Kolorierung einer TcxGrid nach Kriterien (https://www.delphipraxis.net/186615-kolorierung-einer-tcxgrid-nach-kriterien.html)

leonreiser 16. Sep 2015 17:13

Kolorierung einer TcxGrid nach Kriterien
 
Hallo Leute,

Ich arbeite zurzeit an einer VCL Formularanwendung in der
in einer TcxGrid Datensätze aus einer Datenbank stehen.
Nun wollte ich ,abhängig von der Spalte "Status" die verschiedenen Rows Grün(bei status 1) und Braun(bei status 0)) machen.
Dazu verwende ich dass CustomDrawCell der Grid und überprüfe dann jedesmal wenn eine Cell gezeichnet wird, ob der Status eben 1 oder 0
ist und koloriert sie dann.
Wenn ich die Anwendung dann starte geht auch alles, nur wenn ich mich dann per Hand(z.B.: mit Pfeiltasten) in der Tabelle bewege,
fängt das Programm an falsche Einträge zu markieren.
Jedoch markiert es nicht nur die falschen, sonden nach meiner Beobachtung ziemlich random(insofern dass bei einem Computerprogramm möglich ist ;) ).
Auch wenn ich die Sortierreihnfolge ändert, werden falsche einträge markiert.
hier ist mal der Code:
Delphi-Quellcode:
procedure TFormMain.tvHPSUsersCustomDrawCell(Sender: TcxCustomGridTableView;
  ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo;
  var ADone: Boolean);
begin
  if tcxGrid1.DataController.GetValue(AViewInfo.RecordViewInfo.Index,tcxGrid1.DataController.GetItemByFieldName('Status').index) = 0 then begin
      ACanvas.Brush.Color := clOlive;
      end else begin
            ACanvas.Brush.Color := clGreen;
  end;
 if AViewInfo.Selected = true then ACanvas.Brush.Color := clSilver;
end;
Ich hoffe ihr könnt mir helfen.

Lg leon

mkinzler 16. Sep 2015 17:19

AW: Kolorierung einer TcxGrid nach Kriterien
 
Ich kenen die Komponenete nicht, stehen hier nicht die benötigten Infos zum Datensatz?
TcxGridTableDataCellViewInfo

Bei Boolean-Variablen ist eine Prüfung auf True nicht nur überflüssig, sondern auch noch fehlerträchtig ( True ist nicht unbedingt das Selbe wie True; TRUE ist nicht False)
Delphi-Quellcode:
 if AViewInfo.Selected then ACanvas.Brush.Color := clSilver;

juergen 16. Sep 2015 17:54

AW: Kolorierung einer TcxGrid nach Kriterien
 
Hallo,

ich habe diese Anforderung mit den Styles des TcxGrids gelöst.
Im TcxGridDBColumn<meine Spalte> unter der Eigenschaft => Styles => OnGetContentStyle folgenden Code einbringen:
Delphi-Quellcode:
procedure xxx_Frm.cxGrid_meine_Spalte_StylesGetContentStyle(Sender: TcxCustomGridTableView;
  ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem; out AStyle: TcxStyle);
var
  AColumn: TcxGridDBColumn;
begin
  if (AItem as TcxGridDBColumn).DataBinding.FieldName = 'Status' then begin
    if ARecord.Values[AItem.Index] = 1 then AStyle := clgreen // oder cxstylxx
    else AStyle := clbrown ; // oder AStyle := cxStylexxx;
  end;
end;
Ich hoffe es entspricht deinen Anforderungen.

Edit: Code an deine "Status" und Farbe angepasst

Dejan Vu 16. Sep 2015 20:51

AW: Kolorierung einer TcxGrid nach Kriterien
 
Du musst Dir aber einen TcxStyle definieren und den zuweisen. Nur eine Farbe klappt nicht. Du kannst Dem Style auch keine Farbe zuweisen, weil 'AStyle' als 'out' deklariert ist.

Du MUSST also einen eigenen Style deklarieren. Das ist aber sehr praktisch, weil damit der komplette Stil der Zelle gesetzt wird.

TheFrog 17. Sep 2015 08:59

AW: Kolorierung einer TcxGrid nach Kriterien
 
Nur mal so als ergänzende Anregung:

Ich habe hier mal eine Lösung über das OnGetContentStyle-Event der Styles-Property der TableView gemacht:

Delphi-Quellcode:
procedure TForm.MycxGridDBTableViewStylesGetContentStyle(Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem; var AStyle: TcxStyle);
var
  Col: TcxGridColumn;
  FieldValue: Variant;
begin
  Col := GetColumnByFieldName('Status');

  if Assigned(Col) then
  begin
    FieldValue := ARecord.Values[Col.Index];
    if FieldValue <> Null then
    begin
      // falls FieldValue = "Grün" ==> AStyle := FStyleGruen
      // ansonsten falls FieldValue = "Rot" ==> AStyle := FStyleRot
      // usw.
    end;
  end;
end;
Der Code wurde nur mal schnell rauskopiert ohne Anspruch auf Vollständigkeit!

Die Styles (im Beispiel FStyleGruen, usw.) habe ich einfach vorher einmalig erstellt.

TheFrog 17. Sep 2015 09:00

AW: Kolorierung einer TcxGrid nach Kriterien
 
Uups, sehe gerade, das Juergen seine Antwort sehr ähnlich ist!

... naja, sehe es einfach als weitere Möglichkeit!

Borni 17. Sep 2015 09:40

AW: Kolorierung einer TcxGrid nach Kriterien
 
so gehts auch
Delphi-Quellcode:
procedure gridCustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo;var ADone: Boolean);
var
  rot:Boolean;
begin

  if (AViewInfo.Item = SPALTENNAMEZUMFAERBEN) then begin
    rot :=AViewInfo.RecordViewInfo.GridRecord.Values[SPALTEMITBEDINGUNG.Index]>=0;
    if rot then begin
      ACanvas.Font.Color := clWhite;
      ACanvas.Brush.Color := clred;
    end else begin
      ACanvas.Font.Color := clWhite;
      ACanvas.Brush.Color := clgreen;
    end;
  end;
end;

leonreiser 17. Sep 2015 15:50

AW: Kolorierung einer TcxGrid nach Kriterien
 
Danke für alle Antworten erstmal.
Ich habs jetzt einfach mit folgendem Cod hinbekommen:
Delphi-Quellcode:
procedure TFormMain.tcxGridCustomDrawCell(Sender: TcxCustomGridTableView;
  ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo;
  var ADone: Boolean);
var
  rot:Boolean;
begin
  if AViewInfo.RecordViewInfo.GridRecord.Values[tvHPSUsers.DataController.GetItemByFieldName('status').Index] = 0 then
  ACanvas.font.Color := clGrayText
  else
  ACanvas.font.Color := CLNone;
end;
Nun hat jemand zu mir gesagt, dass immer wenn man in dem CustomDrawCell etwas verändert, dass
man dann die ADone Variable (siehe Parameterliste TcxGridCustomDrawCell)auf True setzen sollte.
Tu ich dass, wird mir in der Tabelle nichts mehr angezeigt, was daran liegt dass ich den Text
noch nicht in das Canvas schreibe.

Jedoch klappt ja alles wenn ich ADone nicht auf true setze.
Was bringt mir diese Variable denn jetzt nun?
Ist sie eine Art free nur für Cells oder Canvas??

Ansonsten danke schonmal für die Problemlösung.

Lg Leon

Daniel 17. Sep 2015 16:09

AW: Kolorierung einer TcxGrid nach Kriterien
 
Mittels "ADone" steuerst Du, wer für das Zeichnen der Zellen verantwortlich sein soll. Damit soll vermieden werden, dass am Ende Deine Zeichenoperationen von DevExpress buchstäblich übermalt werden.
Wenn also jemand eine Zelle vollständig selbst zeichnet, dann setzt er die Variable "ADone" auf den Wert "true" und verhindert damit weiteres Zeichnen seitens DevExpress.

leonreiser 21. Sep 2015 16:23

AW: Kolorierung einer TcxGrid nach Kriterien
 
@Daniel

Oke das habe ich verstanden.
Dadurch resultiert warscheinlich auch, dass wenn man jetzt eine Row markiert,
dass sie nichtmehr so leicht bläulich wird, sondern nurnoch umrandet.
Gibt es eine Möglichkeit die Zelle beim anklicken wie herkömmlich
so blau transparent zu verfärben?
Ich habe schon mit
Delphi-Quellcode:
ACanvas.Brush.Color := clBlue; //und verschiedene Farbtöne
versucht sie manuell einzufärben, aber "Brush" funktioniert irgendiwe nicht seitdem ich ADone gesetzt habe.
Delphi-Quellcode:
ACanvas.Font.Color := clBlue
funktioniert dafür umso besser :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:41 Uhr.
Seite 1 von 2  1 2      

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