Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DBGrid --> aktuelle Zeile erkennen, Farben ändern (https://www.delphipraxis.net/2813-dbgrid-aktuelle-zeile-erkennen-farben-aendern.html)

eddy 8. Feb 2003 10:33


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

sakura 8. Feb 2003 12:00

Wenn Du OnDrawCell nutzt, dann kannst Du den Parameter State testen.
Delphi-Quellcode:
if (gdSelected in State) or (gdFocused in State) then
  // die zelle ist markiert und/oder selektiert
...:cat:...

eddy 8. Feb 2003 12:19

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

mojo777 13. Sep 2003 15:05

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?

Alexander 13. Sep 2003 15:13

Re: DBGrid --> aktuelle Zeile erkennen, Farben ändern
 
Poste mal deine Fehlermeldung, sonst können wir dir nicht helfen ;-)

mojo777 13. Sep 2003 16:43

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:

kiar 13. Sep 2003 16:51

Re: DBGrid --> aktuelle Zeile erkennen, Farben ändern
 
eddy hatte es in drawcolumncell realisiert. vielleict liegt da der fehler, oder zeige mal den aufruf !

raik

kolio 30. Jan 2005 19:43

Re: DBGrid --> aktuelle Zeile erkennen, Farben ändern
 
Kann mir bitte jemad sagen was das "TabPP" von eddy bedeutet?
Danke.

kiar 30. Jan 2005 19:47

Re: DBGrid --> aktuelle Zeile erkennen, Farben ändern
 
hallo kolio,

in dem oberen quelltext ist TAbPP eine Tabelle.


herzlich willkommen in der DP.

raik

kolio 30. Jan 2005 20:38

Re: DBGrid --> aktuelle Zeile erkennen, Farben ändern
 
Danke.

Ich hab's mit

Code:
if DataSource1.DataSet.FieldByName('Wochentag').AsString = '' then
begin
  //
end;
versucht, geht aber leider nur für die erste Spalte. DataSource1 ist bei mir mit eine Query verbunden.

eddy 31. Jan 2005 10:55

Re: DBGrid --> aktuelle Zeile erkennen, Farben ändern
 
Hallo Leute,

ich habe noch ein einfaches Beispiel gemacht und getestet:

Code:
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;
Wenn irgendetwas bei Euch nicht funktioniert, müßt Ihr mal ein bischen was vom verwendeten Code zeigen.

mfg
eddy

kolio 31. Jan 2005 20:26

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.

justify 16. Mai 2005 20:01

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!

justify 17. Mai 2005 17:56

Wäre es zuviel verlangt, wenn man mal eine Antwort bekommen würde? gg

marabu 17. Mai 2005 18:35

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:
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;
Grüße vom marabu

justify 18. Mai 2005 19:25

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 09:28 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