Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   DBGrids - Alternative zu RecNo? (https://www.delphipraxis.net/191116-dbgrids-alternative-zu-recno.html)

Rabenrecht 9. Dez 2016 15:00

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 :)

nahpets 9. Dez 2016 15:05

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.

http://wiki.delphi-jedi.org/wiki/JVCL_Help:TJvDBGrid

http://wiki.delphi-jedi.org/wiki/JVC...ernateRowColor

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;

haentschman 9. Dez 2016 15:17

AW: DBGrids - Alternative zu RecNo?
 
Moin...:P
Zitat:

was einen gewaltigen Performance-Einbruch zur Folge haben kann
...wie kommst darauf? RecNo ist eine Integer Property. Lesen...fertsch. :wink:

Willkommen in der DP...:dp:

himitsu 9. Dez 2016 16:54

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.

Rabenrecht 12. Dez 2016 07:25

AW: DBGrids - Alternative zu RecNo?
 
Zitat:

Zitat von nahpets (Beitrag 1355797)
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.

JvDBGrids bieten in ihrer DrawCell Methode Zugriff auf den aktuellen Col und Row Index.

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:

Zitat von haentschman (Beitrag 1355798)
...wie kommst darauf? RecNo ist eine Integer Property. Lesen...fertsch. :wink:

Tja, das meinte jedenfalls jemand auf StackOverflow ;)

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?

ConnorMcLeod 12. Dez 2016 07:54

AW: DBGrids - Alternative zu RecNo?
 
Mach Dir eine Ableitung von TDbGrid mit
Delphi-Quellcode:
  protected
    procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
Dann klappt's auch mit dem Modulo ;-)

Uwe Raabe 12. Dez 2016 09:45

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;

himitsu 12. Dez 2016 11:41

AW: DBGrids - Alternative zu RecNo?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1355894)
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;

Jain.

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.

Uwe Raabe 12. Dez 2016 12:17

AW: DBGrids - Alternative zu RecNo?
 
Zitat:

Zitat von himitsu (Beitrag 1355900)
Jain.

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.

Das stimmt jetzt aber nicht so ganz. Der
Delphi-Quellcode:
DataLink.ActiveRecord
gibt die relative Nummer innerhalb des Grid-Buffers an. Insbesondere wird der Wert innerhalb der Zeichenroutine auf die aktuelle Zeilennummer gesetzt
Delphi-Quellcode:
FDataLink.ActiveRecord := ARow;
und danach wieder hergestellt.

himitsu 12. Dez 2016 13:11

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 12:40 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz