![]() |
DBGrids - Alternative zu RecNo?
Hallo
Gibt es eine Alternative zu RecNo um die aktuelle Zeile zb. in einem DrawColumnCell-Ereignis zu bestimmen? So wie ich RecNo verstehe, greift man damit immer auf den Datensatz zu, was einen gewaltigen Performance-Einbruch zur Folge haben kann. Wenn RecNo überhaupt gesetzt ist. Stimmt dies im Wesentlichen, kommt RecNo für mich nicht in Frage. Meine Aufgabe ist es, projektübergreifend in allen von DGGrid abgeleiteten Grids die Zeilen alternierend einzufärben. Ich habe bereits verschiedene Workarrounds ausprobiert, die versuchen Anhand von Grid.Top, Rect.Top und Rect.Bottom oder anderen Werten die Bildschirmposition betreffend eine Zeilennummer zu extrapolieren, aber bisher hat nichts wirklich funktioniert. Beispiel:
Delphi-Quellcode:
delta := Grid.Top - Rect.Top;
RowNo := delta div (Rect.Bottom - Rect.Top); Wenn ich mir das auf Papier aufmale, müsste das eigentlich funktionieren. Dass die Zeilen alternierend eingefärbt werden, klappt auch. Welche Zeile als erstes eingefärbt wird (dh. alle geraden oder alle ungeraden), hängt von der Platzierung des Grids ab... Weiß jemand, wie man das lösen kann? Freue mich über jede Hilfe :) |
AW: DBGrids - Alternative zu RecNo?
Schau Dir bitte mal das DBGrid aus der JVCL an, das hat die gewünschte Funktion. Eventuell kannst Du Dir ja die Logik dort abschauen oder Deine Grids vom TJvDBGrid ableiten.
![]() ![]() Das Folgende ist jetzt eher mal geraten und nicht getestet:
Delphi-Quellcode:
if (dbgrid.Row Mod 2 = 0) then begin
dbgrid.Canvas.Font.Style := [fsBold]; dbgrid.Canvas.Brush.Color := clLime; dbgrid.Canvas.Font.Color := clBlack; end else begin dbgrid.Canvas.Font.Style := []; end; |
AW: DBGrids - Alternative zu RecNo?
Moin...:P
Zitat:
Willkommen in der DP...:dp: |
AW: DBGrids - Alternative zu RecNo?
RecNo ist einfach nur der Index des Datensatzes im Speicher des DataSet.
So wie ItemIndex in einer ListBox/ComboBox. Aber bei einem "ordentlichen" Grid nimmt man eh nicht RecNo, da der DataController dieser Grids ja sortieren und filtern könnte, womit die Anzeige nicht mehr mit der im DataSet übereinstimmt. |
AW: DBGrids - Alternative zu RecNo?
Zitat:
Die Standard-VCL DBGrids haben das leider nicht. In DrawColumnCell ist lediglich der aktuelle Col Index verfügbar. Sonst wäre das ja alles kein Problem :lol: Zitat:
Aber der Hinweis, dass sobald die Daten gefiltert werden, die RecNo nichts mehr über die Zeile in der Anzeige aussagt, macht es für mich ohnehin uninteressant. Bleibt also die Frage: Wie kann die die Zeilennummer extrapolieren? |
AW: DBGrids - Alternative zu RecNo?
Mach Dir eine Ableitung von TDbGrid mit
Delphi-Quellcode:
Dann klappt's auch mit dem Modulo ;-)
protected
procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override; |
AW: DBGrids - Alternative zu RecNo?
Das hier könnte vielleicht hilfreich sein:
Delphi-Quellcode:
type
TDBGridHelper = class helper for TDBGrid public function IsOddRowNr: Boolean; end; function TDBGridHelper.IsOddRowNr: Boolean; begin Result := Odd(DataLink.ActiveRecord); end; |
AW: DBGrids - Alternative zu RecNo?
Zitat:
Das liefert die Info, ob der aktuell selektierte Record ODD ist. Aber beim Zeichnen muß man sich diese Daten aus dem DataController/Cache des Grids holen, denn zum Anzeigen wird und kann nicht ständig das DataSet gescrollt werden. |
AW: DBGrids - Alternative zu RecNo?
Zitat:
Delphi-Quellcode:
gibt die relative Nummer innerhalb des Grid-Buffers an. Insbesondere wird der Wert innerhalb der Zeichenroutine auf die aktuelle Zeilennummer gesetzt
DataLink.ActiveRecord
Delphi-Quellcode:
und danach wieder hergestellt.
FDataLink.ActiveRecord := ARow;
|
AW: DBGrids - Alternative zu RecNo?
OK, dann war der Name DataLink etwas missverständlich.
Eigentlich sind TDataLink ja nur Links zum DataSet/DataRecord und kennen das Grid nicht. |
AW: DBGrids - Alternative zu RecNo?
Zitat:
Delphi-Quellcode:
und der kennt wiederum sein
TGridDataLink
Delphi-Quellcode:
.
TCustomDBGrid
|
AW: DBGrids - Alternative zu RecNo?
Ok, hatte das RecNo missverstanden.
Jetzt habe ich es hinbekommen die Zeilen alternierend einzufärben. Dabei tauchte leider ein weiteres Problem auf: die Einfärbung der Zeilen "übermalt" die blaue Hinterlegung der Zeile, dessen Zelle gerade ausgewählt ist. Hier der wesentliche Quelltext:
Delphi-Quellcode:
Wie lässt sich das vermeiden?
procedure MeinVonTDBGridAbgeleitetesGrid.DrawColumnCell(const Rect: TRect; DataCol: Integer;
Column: TColumn; State: TGridDrawState); var RowNo : Integer; begin RowNo := DataSource.DataSet.RecNo; if not Odd(RowNo) then Canvas.Brush.Color := myRowColor; else Canvas.Brush.Color := Color; DefaultDrawColumnCell(Rect,DataCol,Column,State); end; |
AW: DBGrids - Alternative zu RecNo?
Ich hatte das mal so gemacht:
Delphi-Quellcode:
...aber auch hier wird die blaue Markierung übermalt , was mich nicht gestört hat.
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState); begin with TDBGrid(Sender), Canvas do begin if ADOTable1.RecNo mod 2 = 0 then Brush.Color:=clSilver; DefaultDrawColumnCell(Rect, DataCol, Column, State); end; und das with nicht beachten , heute bin ich etwas schlauer...:-D |
AW: DBGrids - Alternative zu RecNo?
Zitat:
Delphi-Quellcode:
und lass in dem Fall die Finger von
gdRowSelected in State
Delphi-Quellcode:
.
Canvas.Brush.Color
|
AW: DBGrids - Alternative zu RecNo?
Zitat:
|
AW: DBGrids - Alternative zu RecNo?
Zitat:
|
AW: DBGrids - Alternative zu RecNo?
Delphi-Quellcode:
if ([] = (State * [gdFocused, gdSelected])) then
begin // clever settings go here end; // if |
AW: DBGrids - Alternative zu RecNo?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz