![]() |
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:
Ich hoffe ihr könnt mir helfen.
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; Lg leon |
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;
|
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:
Ich hoffe es entspricht deinen Anforderungen.
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; Edit: Code an deine "Status" und Farbe angepasst |
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. |
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:
Der Code wurde nur mal schnell rauskopiert ohne Anspruch auf Vollständigkeit!
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; Die Styles (im Beispiel FStyleGruen, usw.) habe ich einfach vorher einmalig erstellt. |
AW: Kolorierung einer TcxGrid nach Kriterien
Uups, sehe gerade, das Juergen seine Antwort sehr ähnlich ist!
... naja, sehe es einfach als weitere Möglichkeit! |
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; |
AW: Kolorierung einer TcxGrid nach Kriterien
Danke für alle Antworten erstmal.
Ich habs jetzt einfach mit folgendem Cod hinbekommen:
Delphi-Quellcode:
Nun hat jemand zu mir gesagt, dass immer wenn man in dem CustomDrawCell etwas verändert, dass
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; 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 |
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. |
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:
versucht sie manuell einzufärben, aber "Brush" funktioniert irgendiwe nicht seitdem ich ADone gesetzt habe.
ACanvas.Brush.Color := clBlue; //und verschiedene Farbtöne
Delphi-Quellcode:
funktioniert dafür umso besser :D
ACanvas.Font.Color := clBlue
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:41 Uhr. |
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