![]() |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:08 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