Entwickler-Ecke

Datenbanken - Einfärben einer Zelle in einem DBGrid


wschrabi - Mi 13.07.11 21:11
Titel: Einfärben einer Zelle in einem DBGrid
Hi,
also alles was ich gefunden habe bzgl meiner Frage ist immer das Einfärben einer ganzen Zeile in einem DBGrid. Ich möchte aber nur eine Zelle rot färben, wenn der darin enthaltene INtegerwert negativ ist. Dass das mit OnDrawColumnCell als Event geht, weiss ich bereits. DOch wie geht es weiter? Kann mir da jemand ein einfache Bsp posten? DANKE


haentschman - Mi 13.07.11 21:20

... nur weil heute Freitag ist :lol:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
Zahl: Integer;
.
.
.
if Column.Fieldname = 'DeinFeldname' then //alternativ über den Index der Spalte
begin
  if Zahl < 0 then
  begin
    DBGrid.Canvas.brush.color:=clRed;
    DBGrid.Canvas.font.color:=clRed;
    DBGrid.DefaultDrawColumnCell(rect, 1, column,state);
  end
  else
  begin
    DBGrid.Canvas.brush.color:=clWhite;
    DBGrid.Canvas.font.color:=clWhite;
    DBGrid.defaultdrawcolumnCell(rect, 1, column,state);
  end;
end;


PS: Mal sehen ob du den kleinen eingebauten Fehler (ist eigentlich keiner wenn man es so will) selbst korrigieren kannst.
:zwinker:


wschrabi - Mi 13.07.11 21:47

Danke DIr, danke deiner hilfe hab ichs jetzt hinbekommen
Ja den bug hab ich. 1) DBGrid1 und 2) Font and brush color die selbe, da sieht man nix.

Super danke dir


jasocul - Do 14.07.11 08:00

Vielleicht solltest du noch jeweils den Status gdSelected (in Abhängigkeit, ob das Grid den Focus hat), bzw. dgAlwaysShowSelection prüfen und die Farben dann invertierten.
Das kann dann etwa so aussehen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
            if FGrid.Focused then
            begin
              if gdSelected in state then
              begin
                FGrid.Canvas.Font.Color := Element.Farbe;
              end
              else
              begin
                FGrid.Canvas.Brush.Color := Element.Farbe;
              end;
            end
            else
            begin
              if dgAlwaysShowSelection in FGrid.Options then
              begin
                if gdSelected in state then
                begin
                  FGrid.Canvas.Font.Color := Element.Farbe;
                end
                else
                begin
                  FGrid.Canvas.Brush.Color := Element.Farbe;
                end;
              end
              else
              begin
                FGrid.Canvas.Brush.Color := Element.Farbe;
              end;
            end;

Ist ein Code-Fragment aus einer meiner eigenen Komponenten, aber da die Bezeichnungen sprechend sind, wird das wohl kein Porblem sein.