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?
Das ganze soll sich nicht nur auf die aktuelle Spalte, Zeile oder
Zelle beziehen, sondern auf das ganze Grid.
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
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?
Hallo Peter,
Teste einfach zusätzlich die Angabe DataCol.
Tschuess G.Pala
Kannst du mir da mit einem Bsp auf die Sprünge helfen?
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 ?
http://www.scalabium.com/smdbgrid.htm
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?
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 ?