![]() |
DBGrid --> aktuelle Zeile erkennen, Farben ändern
Hallo Leute,
ich habe in einem DBGrid die Hintergrund- und Schriftfarbe in den Zeilen in Abhängigkeit eines Zellwertes unter Nutzung von OnDrawColumnCell geändert. Der standardmäßig blaue Balken (clNavy) mit weißer Schrift, der mir die aktuelle Zeile anzeigt, geht mir in diesen Zeilen verloren. Gibt es eine Möglichkeit festzustellen, ob die aktuell zu zeichnende Zeile die aktuell gewählte ist, damit ich die Verwendung von OnDrawColumnCell für diese Zeile unterbinden kann? Beispiel: wenn Feldx den Text 'SUMME' enthält, dann zeichne diese Zeile mit gelber Schrift auf blauen Grund, wenn diese Zeile aber die aktuelle ist, dann verwende die Standardfarben mfg eddy |
Wenn Du OnDrawCell nutzt, dann kannst Du den Parameter State testen.
Delphi-Quellcode:
...:cat:...
if (gdSelected in State) or (gdFocused in State) then
// die zelle ist markiert und/oder selektiert |
Hallo sakura,
vielen Dank für Deine schnell Hilfe! Habe diese Zeile in meine Funktion eingefügt und es klappt jetzt so, wie ich das gern hätte. Der Vollständigkeit halber hänge ich hier noch den Quelltext an, falls mal jemand ein ähnliches Problem hat.
Delphi-Quellcode:
procedure TFAuf.dbg32DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState); const parr : array[0..2] of string =(cRAB, cZSM, cA); var s : string; begin // die zelle ist markiert und/oder selektiert // dann sollen die Standard-Farben verwendet werden (weiß auf navy) if (gdSelected in State) or (gdFocused in State) then exit; { ansonsten soll die Farbe in Abhängigkeit eines Strings der angezeigten Datenbank geändert werden Hinweis: die Farben sind hier nur zu Testzwecken ohne Rücksicht darauf, ob sie zueinander passen, frei gewählt worden} s := TabPP.FieldByName('PosArt').AsString; // Number of String - ermöglicht case-Auswertung von Strings // -1, wenn s nicht in Array vorhanden ist sonst 0 für's Erste, usw. case NofStr(s, parr) of 0: begin dbg32.Canvas.Brush.Color := clBlue; dbg32.Canvas.Font.Color := clYellow; end; 1: begin dbg32.Canvas.Brush.Color := clRed; dbg32.Canvas.Font.Color := clAqua; end; 2: if TabPP.FieldByName('SummenKopf').AsBoolean then begin dbg32.Canvas.Brush.Color := clGreen; end; end; dbg32.DefaultDrawColumnCell(Rect, DataCol, Column, State); end; mfg eddy |
Re: DBGrid --> aktuelle Zeile erkennen, Farben ändern
:oops:
ich schaffe es nicht. meine DBGrid Tabelle lässt sich nciht durch canvas.font.color oder so steuern... *heul*!!!!!! kann mir jemand eine demo zur verfügung stellen? |
Re: DBGrid --> aktuelle Zeile erkennen, Farben ändern
Poste mal deine Fehlermeldung, sonst können wir dir nicht helfen ;-)
|
Re: DBGrid --> aktuelle Zeile erkennen, Farben ändern
nix fehlermeldung. alles ist ok. nur die befehle zeigen keine reaktion. ich vermute, dass ich den code an eine falsche stelle gesetzt habe. ich habe on FormShow und in DrawCell versucht.
Das Beispiel oben bringt mich nicht weiter. Sorry. :freak: |
Re: DBGrid --> aktuelle Zeile erkennen, Farben ändern
eddy hatte es in drawcolumncell realisiert. vielleict liegt da der fehler, oder zeige mal den aufruf !
raik |
Re: DBGrid --> aktuelle Zeile erkennen, Farben ändern
Kann mir bitte jemad sagen was das "TabPP" von eddy bedeutet?
Danke. |
Re: DBGrid --> aktuelle Zeile erkennen, Farben ändern
hallo kolio,
in dem oberen quelltext ist TAbPP eine Tabelle. herzlich willkommen in der DP. raik |
Re: DBGrid --> aktuelle Zeile erkennen, Farben ändern
Danke.
Ich hab's mit
Code:
versucht, geht aber leider nur für die erste Spalte. DataSource1 ist bei mir mit eine Query verbunden.
if DataSource1.DataSet.FieldByName('Wochentag').AsString = '' then
begin // end; |
Re: DBGrid --> aktuelle Zeile erkennen, Farben ändern
Hallo Leute,
ich habe noch ein einfaches Beispiel gemacht und getestet:
Code:
Wenn irgendetwas bei Euch nicht funktioniert, müßt Ihr mal ein bischen was vom verwendeten Code zeigen.
type
TForm1 = class(TForm) PageControl1: TPageControl; TabSheet1: TTabSheet; Panel1: TPanel; Tab1: TTable; DS1: TDataSource; dbg1: TDBGrid; procedure dbg1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} // verwendete Datenbank enthält folgendes Feld // Geschlecht, A, 1 // in Abhängigkeit von W = weiblich oder M = männlich werden die Zeilen des // DBGrid unterschiedlich gefärbt procedure TForm1.dbg1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var s : string; begin // die zelle ist markiert und/oder selektiert // dann sollen die Standard-Farben verwendet werden (weiß auf navy) if (gdSelected in State) or (gdFocused in State) then exit; { ansonsten soll die Farbe in Abhängigkeit eines Strings der angezeigten Datenbank geändert werden Hinweis: die Farben sind hier nur zu Testzwecken ohne Rücksicht darauf, ob sie zueinander passen, frei gewählt worden} // Variante 1 zum Einlesen des Wertes aus der Datenbank: s := uppercase(Tab1.FieldByName('Geschlecht').AsString); // oder // Variante 2 s := uppercase((dbg1.DataSource.DataSet as TTable).FieldByName('Geschlecht').AsString); // oder // Variante 3 s := uppercase(((Sender as TDBGrid).DataSource.DataSet as TTable).FieldByName('Geschlecht').AsString); // eine Variante reicht natürlich aus !!! if s = 'W' then begin dbg1.Canvas.Brush.Color := clBlue; dbg1.Canvas.Font.Color := clYellow; end else if s = 'M' then begin dbg1.Canvas.Brush.Color := clRed; dbg1.Canvas.Font.Color := clAqua; end; // falls weder M noch W, dann bleibt die Zeile wie Standard dbg1.DefaultDrawColumnCell(Rect, DataCol, Column, State); end; mfg eddy |
Re: DBGrid --> aktuelle Zeile erkennen, Farben ändern
Vielen Dank eddy,
hab das Problem gefunden. Lag daran, das beim Programmstart noch keine Daten in der Datasource vorhanden sind. |
Hallo zusammen,
ich habe ein Urlaubsantragformular programmiert. Wenn der Chef sich einloggt, hat er via ComboBox die Möglichkeit auszuwählen, welche Urlaubsanträge er sehen will. Einmal alle, einmal die genehmigten, und einmal die nicht genehmigten. Jetzt möchte ich es so machen, daß die nicht genehmigten rot eingefärbt sind (also nur die Zellen), die genehmigten grün und, wenn er alle sieht, sollen halt auch die nicht genehmigten rot und die genehmigten grün sein. Kann mir jemand weiterhelfen? Danke schon mal im Voraus! |
Wäre es zuviel verlangt, wenn man mal eine Antwort bekommen würde? gg
|
Re: DBGrid --> aktuelle Zeile erkennen, Farben ändern
Was hast du in den letzten 24 Stunden unternommen, um selbst an die Lösung zu gelangen?
Delphi-Quellcode:
Grüße vom marabu
procedure TMainForm.DBGridDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var f: TField; begin f := Query.FieldByName('GENEHMIGT'); with Sender as TDBGrid do begin if f.IsNull then Canvas.Brush.Color := clWhite else if f.AsBoolean then Canvas.Brush.Color := clGreen else Canvas.Brush.Color := clRed; DefaultDrawColumnCell(Rect, DataCol, Column, State); end; end; |
Hallo,
danke für den Code, ich werde es auf der Arbeit mal ausprobieren. Ich habe nichts unternommen, da ich auf der Arbeit drei Projekte gleichzeitig mache und ich mich, während ich dort nicht weiterkam, mit etwas anderem beschäftigt habe. Nochmals danke für die Hilfe! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:29 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