Entwickler-Ecke

Datenbanken - Farbige Zellen in DBGrid


zcidq8 - Sa 06.08.05 19:19
Titel: Farbige Zellen in DBGrid
Hallo,

ich benutze die DBGrid Komponente zum anzeigen meiner Daten. Jetzt möchte ich aber einzelne Zellen, also nicht die ganze Reihe oder Spalte, farbig markieren.
Wie geht das? Geht das überhaupt?
:roll:


hansa - Sa 06.08.05 20:14

Das sind die Anfänge davon, ein DBGrid nicht zu benutzen ! Würde mal ernsthaft überlegen, darauf zu verzichten und ein normales Stringrid zu verwenden.


alex517 - Mo 08.08.05 11:03

Hallo zcidq8,

warum die Arbeit mit einem Stringgrid?

Setze DBGrid1.DefaultDrawing := false und verwende das Ereignis DrawColumnCell der DBGrid.




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:
30:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if (State * [gdSelected, gdFocused, gdFixed] = []) then
  begin
    // Hintergrund des Feldes Status einfärben
    if (Column.Field.FieldName='Status'then
    begin
      case Column.Field.AsInteger of
       0: DBGrid1.Canvas.Brush.Color := clYellow;
       5: DBGrid1.Canvas.Brush.Color := clGreen;
      10: DBGrid1.Canvas.Brush.Color := clBlue;
      end;
    end;

    // Schriftfarbe des Feldes EATyp setzen 
    if (Column.Field.FieldName='EATyp'then
    begin
      case Column.Field.AsInteger of
       0: DBGrid1.Canvas.font.Color := clYellow;
      10: DBGrid1.Canvas.font.Color := clGreen;
      20: DBGrid1.Canvas.font.Color := clRed;
      end;
      DBGrid1.Canvas.font.Style := DBGrid1.Canvas.font.Style + [fsBold];  // fett
    end;

    DBGrid1.Canvas.fillRect( rect );
  end;
  DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);  // Text ausgeben lassen
end;



alex


zcidq8 - Mo 15.08.05 09:51
Titel: Super!
Funktioniert ja super. Danke. Geht ja einfacher als ich dachte. :D


Lazarus - Sa 20.08.05 00:10

Funktioniert zwar schon aber bei Multiselect nicht mehr wirklich :cry:

Ich suche eigentlich ein DBGrid, was kleine Images vor dem Eintrah machen kann, Farbige Reihen und kleine Symbole für die Sortierrichtung in den Oberewn Spaltenbuttons hat und auch Sortieren kann Spaltenweise...

Kennt da jemand was oder ein paar Tutorials Beispiele oder so ???
Logisch, am liebsten wäre eine Freewarekomponente, aber ich kann auch selber was stricken, wenn ich genug info's hätte :D


JRegier - Sa 20.08.05 07:05

user profile iconLazarus hat folgendes geschrieben:
Funktioniert zwar schon aber bei Multiselect nicht mehr wirklich :cry:

Ich suche eigentlich ein DBGrid, was kleine Images vor dem Eintrah machen kann, Farbige Reihen und kleine Symbole für die Sortierrichtung in den Oberewn Spaltenbuttons hat und auch Sortieren kann Spaltenweise...

Kennt da jemand was oder ein paar Tutorials Beispiele oder so ???
Logisch, am liebsten wäre eine Freewarekomponente, aber ich kann auch selber was stricken, wenn ich genug info's hätte :D


Wenn du sortieren willst "Spaltenweise" dann nimm die JEDI Komponenten!

Was meinst du bei Multiselect funzt nicht? Also du mußt State abfragen und bei State Selected eine Andere Farbe setzen!


Lazarus - So 21.08.05 15:12

Na ich habe testweise mal sowas gemacht :

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
with DBGrid1.Canvas do begin
    if State = [gdSelected, gdFocused] then begin
       Brush.Color := clRed;
       Font.Color  := clWhite;
    end else begin
       Brush.Color := clWhite;
       Font.Color  := clRed;
    end;
    FillRect( Rect );
    TextOut( Rect.Left, Rect.Top, Column.Field.Text );
 end;

Dann sieht das ja bunt aus, aber ich habe Rowselect und Multiselect = True;

Aber das geht dann alles nicht mehr...
Eine oder mehrere selektierte sieht man garnicht mehr ...

Dabei wollte ich nur eine Tabellierpapier - Optik...

Ich habe schon viele Samples angeschaut (google) aber irgendwas läuft bei mir nicht so...
Ich habe auch schon mit Defautdrawing false/true gefummelt aber es sieht immer doof aus alles ....
Ist bestimmt ein logischer fehler und deshalb mal wieder schwer zu finden :P

Moderiert von user profile iconKlabautermann: Code- durch Delphi-Tags ersetzt.


Lazarus - So 21.08.05 15:18

Also mit dem Sortieren, war es ja easy, weil ich es einfach über SQL machen konnte. Ich benutze KaDao...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TfrmMain.dbgMainTitleClick(Column: TColumn);
begin
  dmMain.tblTestFiles.DisableControls;
  dmMain.tblTestFiles.Active := False;
  try
    if boAufsteigend then
      dmMain.tblTestFiles.SQL.Text := 'Select * from KeyDefs Order by ' + Column.FieldName + '';
    else
      dmMain.tblTestFiles.SQL.Text := 'Select * from KeyDefs Order by ' + Column.FieldName + '' + ' DESC';
    boAufsteigend := not boAufsteigend;
  finally
    dmMain.tblTestFiles.Active   := True;
    dmMain.tblTestFiles.EnableControls;
  end;
end;


Diese kleinen Pfeile oben gibt es noch nicht, da noch keine Idee...

Moderiert von user profile iconKlabautermann: Code- durch Delphi-Tags ersetzt.


Lazarus - Mi 07.09.05 21:32

So ein Ärger, habe schon zig Versionen getestet, aber meim Multiselect bekomme ich es nicht hin eine Farbumschaltung, wie ein Tabellierpapier zu machen. Irgendwie verhält sich dann alles merkwürdig.
Hat das schon mal einer gemacht und einen Tip ??
Zur Info, ich habe Multiselect und Rowselect = True....


JRegier - Do 08.09.05 07:34

user profile iconLazarus hat folgendes geschrieben:
So ein Ärger, habe schon zig Versionen getestet, aber meim Multiselect bekomme ich es nicht hin eine Farbumschaltung, wie ein Tabellierpapier zu machen. Irgendwie verhält sich dann alles merkwürdig.
Hat das schon mal einer gemacht und einen Tip ??
Zur Info, ich habe Multiselect und Rowselect = True....



Ich gebe dir ein Tip! :idea: Rufe nach dem Selektieren also z.B. OnMouseUp DBGrid1.Repaint auf, dann sollte es funktionieren!


CenBells - Do 08.09.05 10:01

hi,

für die pfeile wirst du wohl ne andere komponente verwenden müssen. In den header kannst du zwar auch von hand zeichenen, daß wird aber umständlich.
Ich verwende für so etwas - pfeile, farben, multiselect etc - seit jahren erfolgreich den VirtualStringTree von Mike Lischke.
http://www.delphi-gems.com

Gruß
Ken