AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DBGrids - Alternative zu RecNo?

Ein Thema von Rabenrecht · begonnen am 9. Dez 2016 · letzter Beitrag vom 16. Dez 2016
Antwort Antwort
Seite 1 von 2  1 2      
Rabenrecht

Registriert seit: 9. Dez 2016
79 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

DBGrids - Alternative zu RecNo?

  Alt 9. Dez 2016, 16:00
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
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: DBGrids - Alternative zu RecNo?

  Alt 9. Dez 2016, 16:05
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;

Geändert von nahpets ( 9. Dez 2016 um 16:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#3

AW: DBGrids - Alternative zu RecNo?

  Alt 9. Dez 2016, 16:17
Moin...
Zitat:
was einen gewaltigen Performance-Einbruch zur Folge haben kann
...wie kommst darauf? RecNo ist eine Integer Property. Lesen...fertsch.

Willkommen in der DP...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#4

AW: DBGrids - Alternative zu RecNo?

  Alt 9. Dez 2016, 17:54
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 9. Dez 2016 um 18:03 Uhr)
  Mit Zitat antworten Zitat
Rabenrecht

Registriert seit: 9. Dez 2016
79 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: DBGrids - Alternative zu RecNo?

  Alt 12. Dez 2016, 08:25
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

...wie kommst darauf? RecNo ist eine Integer Property. Lesen...fertsch.
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?
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: DBGrids - Alternative zu RecNo?

  Alt 12. Dez 2016, 08:54
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
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#7

AW: DBGrids - Alternative zu RecNo?

  Alt 12. Dez 2016, 10:45
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#8

AW: DBGrids - Alternative zu RecNo?

  Alt 12. Dez 2016, 12:41
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#9

AW: DBGrids - Alternative zu RecNo?

  Alt 12. Dez 2016, 13:17
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 DataLink.ActiveRecord gibt die relative Nummer innerhalb des Grid-Buffers an. Insbesondere wird der Wert innerhalb der Zeichenroutine auf die aktuelle Zeilennummer gesetzt FDataLink.ActiveRecord := ARow; und danach wieder hergestellt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#10

AW: DBGrids - Alternative zu RecNo?

  Alt 12. Dez 2016, 14:11
OK, dann war der Name DataLink etwas missverständlich.

Eigentlich sind TDataLink ja nur Links zum DataSet/DataRecord und kennen das Grid nicht.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:30 Uhr.
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