Delphi-PRAXiS

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.

Uwe Raabe 12. Dez 2016 13:19

AW: DBGrids - Alternative zu RecNo?
 
Zitat:

Zitat von himitsu (Beitrag 1355914)
OK, dann war der Name DataLink etwas missverständlich.

Eigentlich sind TDataLink ja nur Links zum DataSet/DataRecord und kennen das Grid nicht.

In diesem Fall handelt es sich aber um einen
Delphi-Quellcode:
TGridDataLink
und der kennt wiederum sein
Delphi-Quellcode:
TCustomDBGrid
.

Rabenrecht 14. Dez 2016 08:26

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:
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;
Wie lässt sich das vermeiden?

borstenei 14. Dez 2016 08:53

AW: DBGrids - Alternative zu RecNo?
 
Ich hatte das mal so gemacht:

Delphi-Quellcode:
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;
...aber auch hier wird die blaue Markierung übermalt , was mich nicht gestört hat.
und das with nicht beachten , heute bin ich etwas schlauer...:-D

Uwe Raabe 14. Dez 2016 09:01

AW: DBGrids - Alternative zu RecNo?
 
Zitat:

Zitat von Rabenrecht (Beitrag 1356058)
Wie lässt sich das vermeiden?

Check doch einfach auf
Delphi-Quellcode:
gdRowSelected in State
und lass in dem Fall die Finger von
Delphi-Quellcode:
Canvas.Brush.Color
.

Rabenrecht 14. Dez 2016 15:01

AW: DBGrids - Alternative zu RecNo?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1356067)
Zitat:

Zitat von Rabenrecht (Beitrag 1356058)
Wie lässt sich das vermeiden?

Check doch einfach auf
Delphi-Quellcode:
gdRowSelected in State
und lass in dem Fall die Finger von
Delphi-Quellcode:
Canvas.Brush.Color
.

Das hatte leider keinen Effekt. Wie es scheint, wird gdRowSelected überhaupt nicht gesetzt. :(

Uwe Raabe 14. Dez 2016 15:08

AW: DBGrids - Alternative zu RecNo?
 
Zitat:

Zitat von Rabenrecht (Beitrag 1356131)
Zitat:

Zitat von Uwe Raabe (Beitrag 1356067)
Zitat:

Zitat von Rabenrecht (Beitrag 1356058)
Wie lässt sich das vermeiden?

Check doch einfach auf
Delphi-Quellcode:
gdRowSelected in State
und lass in dem Fall die Finger von
Delphi-Quellcode:
Canvas.Brush.Color
.

Das hatte leider keinen Effekt. Wie es scheint, wird gdRowSelected überhaupt nicht gesetzt. :(

Kommt halt auf die Optionen an. Was ist mit gdSelected? Schau doch mal im Debugger, was in dem Fall drin steht.

ConnorMcLeod 14. Dez 2016 15:28

AW: DBGrids - Alternative zu RecNo?
 
Delphi-Quellcode:
  if ([] = (State * [gdFocused, gdSelected])) then
  begin
    // clever settings go here
  end; // if

Slipstream 16. Dez 2016 03:32

AW: DBGrids - Alternative zu RecNo?
 
Zitat:

Zitat von Rabenrecht (Beitrag 1355796)
Hallo
Gibt es eine Alternative zu RecNo um die aktuelle Zeile zb. in einem DrawColumnCell-Ereignis zu bestimmen?

Aus diesem und anderen Gründen bevorzuge ich das TjvDBgrid aus den Jedi-Komponenten. Das hat nämlich die Eigenschaft AlternateRowColor, wo ich eine Farbe für den alternativen Hintergrund angeben kann. Zusätzlich gibts dann noch die Eigenschaft AlternateRowFontColor, wo ich die Schriftfarbe festlegen kann. Danach zeigt das Jedi-DBGrid seine Zeilen in zwei sich abwechselnden Farben an.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:41 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