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; 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
Klabautermann: 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; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!