Entwickler-Ecke

Datenbanken - Farbige Zeile in DBGrid


Crowbar - Di 04.02.03 16:52
Titel: Farbige Zeile in DBGrid
Hallo,
wie kann ich in einem DBGrid jede 2. Zeile z.B. mit einem grünen Hintergrund darstellen.
Mit den Spalten klappt es über TForm1.FilterDBGridDrawColumnCell(...), aber die Zeilen...?

Crowbar


UGrohne - Di 04.02.03 17:48

Mach das doch auch in dem Ereignis, du überprüfst halt, ob die Zeile durch 2 teilbar ist oder net (mod) und dann machste die Zelle farbig.... du machst ja bei den spalten auch nix anderes....

Gruß


Crowbar - Di 04.02.03 18:10

Das Problem hierbei ist nur, dass ich für das Zählen der Zeilen die Table.RecNo nehmen müsste. Nun, und dann stimmt meine DBGird-Sortierung nicht mit der Table.RecNo überein. Dadurch kann es dann sein, dass ich 4 nacheinanderfolgende farbige Zeilen habe, statt abwechselnd.

Gruss Crowbar


UGrohne - Di 04.02.03 19:15

Warum musst Du da Table.RecNo nehmen? Das Ereignis OnDrawColumnCell bietet doch die Variable DataCol, die die derzeitige Zeile anzeigt. Ich hab da 2 Prozeduren drausgemacht:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure Tform1.DBGridauftraegeDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
if einstellungenform.CBcolored.Checked then
   ColorGrid(DBGridauftraege, mainform.IBAuftraege, Rect, DataCol, Column, State);
end;

procedure Tform1.ColorGrid(dbgIn: TDBGrid; qryIn: TIBQuery; const Rect: TRect;DataCol: Integer; Column: TColumn;State: TGridDrawState);
var
  iValue: LongInt;
begin
if (DataCol mod 2)<>1 then
       dbgIn.Canvas.Brush.Color := clred
       else
       dbgIn.Canvas.Brush.Color := clwhite;

    // Feld zeichnen
    dbgIn.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;


Die erste ist das Ereignis (habs net so verändert, da wird noch ne Abfrage gemacht, obs farbig sein soll) und die zweite prüft welche Farbe genommen werden soll, je nachdem obs ne gerade oder ungerade Zeile ist. Probier das mal, müsste funktionieren.

Gruß


grayfox - Di 04.02.03 23:33

hallo UGrohne!

datacoll beschreibt die spalten und nicht die zeilen ;) bei einem 'normalen' DBGrid kann man nur über Recno auf die 'zeilen' zugreifen. und das sieht bei einem gesetzten filter oft nicht so toll aus. da bleibt dann nur der ausweg zu fremdkomponenten übrig, bei denen man auf die rows zugreifen kann. zb VUBGrid oder SMDBGrid

mfg, stefan


UGrohne - Mi 05.02.03 00:15

Ups, stimmt, da hab ich nen Denkfehler gemacht, sorry. Gut, dann würde ich ne Variable setzen. Sobald DataCol wieder 0 ist, wird die Variable umgeschaltet und die andere Farbe genommen


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure Tform1.ColorGrid(dbgIn: TDBGrid; qryIn: TIBQuery; const Rect: TRect;DataCol: Integer; Column: TColumn;State: TGridDrawState); 
var 
  ungerade:Boolean;
begin 
if (DataCol=0) then 
      ungerade:=not ungerade;
if ungerade then
       dbgIn.Canvas.Brush.Color := clred 
       else 
       dbgIn.Canvas.Brush.Color := clwhite; 
    // Feld zeichnen 
    dbgIn.DefaultDrawColumnCell(Rect, DataCol, Column, State); 
end;


Ein bisschen Phantasie walten lassen.

Also das hab ich mir gerade in 30sec ausgeknobelt, hängt mich net auf, wenns net funktioniert, is nur so ne Idee. Natürlich sollte die Variable nen Anfangswert haben... Also besser Unit-Weit deklarieren und irgendwo initialisieren, in einem Ereignis vom Query bzw Table.


smiegel - Mi 05.02.03 00:27

Hallo,

was passiert wenn Du satt Table.RecNo, Field.RecNo oder Field.Index benutzt?