AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Kolorierung einer TcxGrid nach Kriterien

Ein Thema von leonreiser · begonnen am 16. Sep 2015 · letzter Beitrag vom 21. Sep 2015
Antwort Antwort
Seite 1 von 2  1 2   
leonreiser

Registriert seit: 16. Jul 2015
30 Beiträge
 
Delphi XE8 Professional
 
#1

Kolorierung einer TcxGrid nach Kriterien

  Alt 16. Sep 2015, 18:13
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Kolorierung einer TcxGrid nach Kriterien

  Alt 16. Sep 2015, 18:19
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)
 if AViewInfo.Selected then ACanvas.Brush.Color := clSilver;
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.174 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Kolorierung einer TcxGrid nach Kriterien

  Alt 16. Sep 2015, 18:54
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 = 'Statusthen 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
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)

Geändert von juergen (16. Sep 2015 um 19:05 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#4

AW: Kolorierung einer TcxGrid nach Kriterien

  Alt 16. Sep 2015, 21:51
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.
  Mit Zitat antworten Zitat
TheFrog

Registriert seit: 24. Mär 2009
145 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Kolorierung einer TcxGrid nach Kriterien

  Alt 17. Sep 2015, 09:59
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.
  Mit Zitat antworten Zitat
TheFrog

Registriert seit: 24. Mär 2009
145 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Kolorierung einer TcxGrid nach Kriterien

  Alt 17. Sep 2015, 10:00
Uups, sehe gerade, das Juergen seine Antwort sehr ähnlich ist!

... naja, sehe es einfach als weitere Möglichkeit!
  Mit Zitat antworten Zitat
Borni

Registriert seit: 16. Aug 2004
Ort: Algermissen
89 Beiträge
 
Delphi 12 Athens
 
#7

AW: Kolorierung einer TcxGrid nach Kriterien

  Alt 17. Sep 2015, 10:40
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;

Geändert von Borni (17. Sep 2015 um 10:46 Uhr)
  Mit Zitat antworten Zitat
leonreiser

Registriert seit: 16. Jul 2015
30 Beiträge
 
Delphi XE8 Professional
 
#8

AW: Kolorierung einer TcxGrid nach Kriterien

  Alt 17. Sep 2015, 16:50
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
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Kolorierung einer TcxGrid nach Kriterien

  Alt 17. Sep 2015, 17:09
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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
leonreiser

Registriert seit: 16. Jul 2015
30 Beiträge
 
Delphi XE8 Professional
 
#10

AW: Kolorierung einer TcxGrid nach Kriterien

  Alt 21. Sep 2015, 17:23
@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 ACanvas.Brush.Color := clBlue; //und verschiedene Farbtöne versucht sie manuell einzufärben, aber "Brush" funktioniert irgendiwe nicht seitdem ich ADone gesetzt habe.
ACanvas.Font.Color := clBlue funktioniert dafür umso besser
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:21 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