Autor Beitrag
accessViolation
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 68

Win
Delphi 5 Enterpr.
BeitragVerfasst: Mi 18.07.07 18:26 
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
ausblenden 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128
Erhaltene Danke: 1

WIN XP, WIN 7
Delphi 5 Ent, Delphi 2007 Pro, XE4
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 68

Win
Delphi 5 Enterpr.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128
Erhaltene Danke: 1

WIN XP, WIN 7
Delphi 5 Ent, Delphi 2007 Pro, XE4
BeitragVerfasst: 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
ausblenden 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
ausblenden 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;