Entwickler-Ecke

Datenbanken - [TAdvDBGrid] Zeilen einfärben mit Farbwert aus Datenbank


accessViolation - Mi 18.07.07 18:26
Titel: [TAdvDBGrid] Zeilen einfärben mit Farbwert aus Datenbank
Hallo zusammen,

ich habe folgendes Problem:
Ich habe ein TAdvDBGridvon TMS und möchte die Zeilen einfärben. Dafür gibt es in meiner Datenbank-Tabelle extra eine Spalte mit der Farbe.
Ich hab erst ewig mit dem OnGetCellColor-Ereignis herumprobiert und versucht, die Farbe des aktuellen Datensatzes mit

Delphi-Quelltext
1:
ABrush.Color := Query.FieldByName('Farbe').AsInteger                    

zuzuweisen, bis ich festgestellt habe, dass sich die Query.RecNo immer gleich ist...

Am besten wäre irgendein Ereignis, das für jede Zeile aufgerufen wird und in dem ich die Farbe ändern kann.
Gib es so etwas,
oder hat jemand eine andere Idee?

Denn wenn ich schon bei jedem Datensatz eine Spalte mit der zugehörigen Farbe habe, ist es fast schwachsinnig, extra zum Einfärben nochmal die ganze Query mit

Delphi-Quelltext
1:
2:
3:
4:
while not Query.Eof do begin
   RowColor := Query.FieldByName('Farbe').AsInteger; // <- oder ähnlich
   Query.Next;
end;

zu durchlaufen, zumal es sich bei einem AdvDBGrid ja um ein datensensitives Steuerelement handelt.

Da muss es doch etwas eleganteres geben ;)

Vielleich hat jemand von Euch eine Idee.

Viele Grüße
Dietmar

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


Andreas Schilling - Fr 20.07.07 07:28

Ich habe zwar die Komponente nicht, aber einen Tip. Wenn du versucht hast per Haltepunkt zu verfolgen was im OnGetCellColor-Ereignis passiert, dann landest du in einer Endlosschleife. Wenn nämlich die Procedure abgearbeitet ist, wird wieder kurz die Programmoberfläche angezeigt und das Spiel beginnt von neuem. Die Oberfläche wird neu gezeichnet und das beginnt wieder links oben. Also wird wieder zuerst das OnGetCellColor-Ereignis für die linke obere Zelle ausgeführt usw. usw.
Hat den das OnGetCellColor-Ereignis nicht das gewünschte Ergebnis gebracht (ohne gesetzten Haltepunkt)?


accessViolation - Fr 20.07.07 09:39

Das mit der Endlosschleife beim Haltepunkt habe ich auch schon gesehen.

Das gewünschte Ergebnis hat OnGetCellColor (ohne Haltepunkt) nicht gebracht, weil es ja jedesmal, wenn irgendetwas im Grid angezeigt wird, aufgerufen wird, und nicht (wie ich zuerst dachte) für jeden Datensatz (bzw. für jede Zelle) nur einmal...


Andreas Schilling - Fr 20.07.07 12:48

Also ich gehe mal davon aus, dass es für jede Zelle nur einmal aufgerufen wird beim Neuzeichnen. Wenn die Zeile Quelltext nichts bewirkt wäre jetzt der komplette Quelltext der Procedure hilfreich um weiter zu helfen. Ich kann die im Moment nur ein Beispiel für ein normales DBGrid für das ondrawcolumncell Ereignis liefern. Damit färbe ich immer die Zeilenhintergründe abwechselnd

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:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
  Gridfarbe(DBGrid1, Rect, DataCol, Column, State, Query1);
end;

procedure Gridfarbe(Sender: TObject; const Rect: TRect; DataCol: Integer;
                      Column: TColumn; State: TGridDrawState; DSET_QUELLE : TIBDataset);
begin
  if (gdSelected in State)
  or ((Sender as TDBGrid).SelectedRows.CurrentRowSelected )
  then begin
    (sender as TDBGrid).Canvas.Brush.Color := $00FDD6B3;
    (sender as TDBGrid).Canvas.Font.Color := clBlack;
  end 
  else
    if (DSET_QUELLE.RecNo mod 2) > 0
    then begin
      (sender as TDBGrid).Canvas.Brush.Color := GLOBAL_GRID_FARBE2;
      (sender as TDBGrid).Canvas.Font.Color := clBlack;
    end;

  (sender as TDBGrid).DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;


Für dich angepasst wäre es wohl so

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure Gridfarbe(Sender: TObject; const Rect: TRect; DataCol: Integer;
                      Column: TColumn; State: TGridDrawState; DSET_QUELLE : TIBDataset);
begin
  if (gdSelected in State)
  or ((Sender as TDBGrid).SelectedRows.CurrentRowSelected )
  then begin
    (sender as TDBGrid).Canvas.Brush.Color := $00FDD6B3;
    (sender as TDBGrid).Canvas.Font.Color := clBlack;
  end
  else begin
    (sender as TDBGrid).Canvas.Brush.Color := DSET_Quelle.fieldbyname('Farbe').AsInteger;
    (sender as TDBGrid).Canvas.Font.Color := clBlack; 
  end;

  (sender as TDBGrid).DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;