Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

farbliche Markierung im dbGrid

103 views
Skip to first unread message

Peter Schoettler

unread,
Feb 7, 2001, 4:52:49 AM2/7/01
to
Hi nG.

Ich möchte in einem dbGrid, dass einzelne Zellen einer bestimmten
Spalte farblich markiert werden, wenn diese einem Kriterium nicht
entsprechen, welche sich aus den anderen Zellen des entsprechenden
Records/Datensatzes errechnet.

Ich möchte also eine Bedingte Formatierung wie ich sie unter Excel
kenne.

Wie geht das?


Peter Schoettler

unread,
Feb 7, 2001, 8:17:43 AM2/7/01
to
On Wed, 07 Feb 2001 09:52:49 GMT, PScho...@sbh-worldwide.com (Peter
Schoettler) wrote:
>Ich möchte in einem dbGrid, dass einzelne Zellen einer bestimmten
>Spalte farblich markiert werden, wenn diese einem Kriterium nicht
>entsprechen, welche sich aus den anderen Zellen des entsprechenden
>Records/Datensatzes errechnet.

Das ganze soll sich nicht nur auf die aktuelle Spalte, Zeile oder
Zelle beziehen, sondern auf das ganze Grid.

Gunter Pala

unread,
Feb 7, 2001, 8:43:24 AM2/7/01
to

Peter Schoettler schrieb in Nachricht <3a8119e5...@news.CIS.dfn.de>...
Hallo Peter,

DefaultDrawing auf False, dann in DrawColumnCell
Canvas.Brush.Color, Font.Color usw. setzen.

Wenn Du auf das Dataset zugreifen meochtest, vorher:
ein
type TCustomDBGridCracker=class(TCustomDBGrid);

dann kannst Du z.B. mit
...
with TCustomDBGridCracker(Sender) do
Begin
Case DataLink.DataSet.FieldbyName('ART').AsInteger of
0:Canvas.Font.Color:=clRed
...

zugreifen.

abschliessend:
DefaultDrawColumnCell(Rect, DataCol, Column, State);

HTH
Tschuess G.Pala

Peter Schoettler

unread,
Feb 7, 2001, 8:58:06 AM2/7/01
to
On Wed, 7 Feb 2001 14:43:24 +0100, "Gunter Pala"
<_X_te...@rz.uni-leipzig.de> wrote:
>DefaultDrawing auf False, dann in DrawColumnCell
>Canvas.Brush.Color, Font.Color usw. setzen.
> [...]

Hm, soweit bin ich auch schon.
Und mir ergibt das, dass die komplette Zeile farblich verändert wird.
Ich möchte aber nur einzelne Zellen des Grids farblich verändert
haben.
Wie geht das?

Gunter Pala

unread,
Feb 7, 2001, 9:05:33 AM2/7/01
to

Peter Schoettler schrieb in Nachricht <3a8153f3...@news.CIS.dfn.de>...


Hallo Peter,
Teste einfach zusätzlich die Angabe DataCol.

Tschuess G.Pala


Peter Schoettler

unread,
Feb 7, 2001, 9:28:06 AM2/7/01
to
On Wed, 7 Feb 2001 15:05:33 +0100, "Gunter Pala"
<_X_te...@rz.uni-leipzig.de> wrote:
>Teste einfach zusätzlich die Angabe DataCol.

Kannst du mir da mit einem Bsp auf die Sprünge helfen?

Gunter Pala

unread,
Feb 7, 2001, 9:35:49 AM2/7/01
to

Peter Schoettler schrieb in Nachricht <3a815b5a...@news.CIS.dfn.de>...

Hallo Peter, na z.B.
...
If DataCol=1 Then
Begin
Canvas.Font.Color:=clWindow;
Canvas.Brush.Color:=clRed
end
...
Tschuess G.Pala

--
Kann man als Parkinson-Kranker eigentlich auf BSE updaten ?

Ralf Steinhaeusser

unread,
Feb 7, 2001, 10:42:54 AM2/7/01
to
Schau Dir einmal das SMDBGrid an,
glaub mir, es zahlt sich aus, sicht nur wegen dem einfärben.

http://www.scalabium.com/smdbgrid.htm


Peter Schoettler

unread,
Feb 8, 2001, 1:29:40 AM2/8/01
to
On Wed, 7 Feb 2001 15:35:49 +0100, "Gunter Pala"
<_X_te...@rz.uni-leipzig.de> wrote:
>If DataCol=1 Then
>Begin
> Canvas.Font.Color:=clWindow;
> Canvas.Brush.Color:=clRed
>end

Tja, erst einmal danke so weit.
ABER... ich poste mal ein bisken Source, um mein PRoblem zu erklären:


if datacol = 11
then
begin
ware := Column.Field.DataSet.FieldByName('WARE').asfloat;
[...]
davp := Column.Field.DataSet.FieldByName('DAVP').asfloat;

total := ware + [...] + davp;

if total <> Column.Field.DataSet.FieldByName('BETRAG').asfloat
then
begin
dbgrid1.canvas.brush.color := clRed;
dbgrid1.canvas.font.style := [fsBold];
end
else
begin
dbgrid1.canvas.brush.color := clgray;
dbgrid1.canvas.font.style := [];
end;

dbgrid1.DefaultDrawColumnCell(rect, DataCol, Column, State);
end;


Das Problem ist nun, dass nur die Zelle in der ersten Zeile korrekt
eingefärbt wird, während in den anderen Zeilen die falsche Farbe
benutzt wird, d.h. obwohl immer "total" = Field('Betrag') errechnet
werden müsste, scheint ab der zweiten Zeile <> zu gelten.
Ich vermute mal, das die Berechnung für "total" immer auf den
aktuellen Record, der im dbGrid den Focus hat, basiert und da der
Focus beim Aufbau des Grids immer beim ersten Record bleibt,
vergleicht das Kriterium immer jede Zeile mit der ersten Zeile.
Könnte das so hinkommen?
Und wie kann ich das Problem lösen?

Gunter Pala

unread,
Feb 8, 2001, 1:42:00 AM2/8/01
to

Peter Schoettler schrieb in Nachricht <3a823a5...@news.CIS.dfn.de>...

>On Wed, 7 Feb 2001 15:35:49 +0100, "Gunter Pala"
><_X_te...@rz.uni-leipzig.de> wrote:
>>If DataCol=1 Then
>>Begin
>> Canvas.Font.Color:=clWindow;
>> Canvas.Brush.Color:=clRed
>>end
>
>Tja, erst einmal danke so weit.
>ABER... ich poste mal ein bisken Source, um mein PRoblem zu erklären:
>
>
> if datacol = 11
> then
> begin
> ware := Column.Field.DataSet.FieldByName('WARE').asfloat;
> [...]
> davp := Column.Field.DataSet.FieldByName('DAVP').asfloat;
>
> total := ware + [...] + davp;
>
> if total <> Column.Field.DataSet.FieldByName('BETRAG').asfloat
> then
> begin


Guten Morgen Peter,
der Vergleich von zwei Gleitpunktzahlen auf Gleichheit ist unischer
(Rundungsfehler und durch interne Darstellung).

Wie unterscheidest Du, ob Deine Zeile markiert ist ?
(gdSelected is State)

Anbei einfach mal ein funktionierender Code aus einem
meiner Projekte.

-------
type TCustomDBGridCracker=class(TCustomDBGrid);

procedure TMainform_GLTMP.MLDGDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);

Var S:String[2];
F:Boolean;
begin
F:=gdSelected in State;
with TCustomDBGridCracker(Sender) do
Begin
S:=DataLink.DataSet.FieldbyName('ART').AsString;
If (S='++') or (S='--') or (S='**')
then
Begin
If F Then
begin


Canvas.Font.Color:=clWindow;
Canvas.Brush.Color:=clRed
end

else Canvas.Font.Color:=clRed
end
else
Begin
If F Then
begin
Canvas.Font.Color:=clWindow;
Canvas.Brush.Color:=clActiveCaption
end
else Canvas.Font.Color:=MLDG.Font.Color
end;

If DataLink.DataSet.FieldbyName('ERLEDIGT').AsBoolean then
Begin
Canvas.Font.Color:=clBtnFace;
If F Then Canvas.Brush.Color:=clInactiveCaption
end
end;
MLDG.DefaultDrawColumnCell(Rect,DataCol,Column,State)
end;
-------

HTH
Tschuess G.Pala

--
Kann ich als Parkinson-Kranker eigentlich auf BSE updaten ?

0 new messages