[Gelöst] TDBGrid anderes scrollen?

Rund um die LCL und andere Komponenten
MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

[Gelöst] TDBGrid anderes scrollen?

Beitrag von MmVisual »

Hallo,

Wenn man im TDBGrid mit dem Mausrad scrollt, dann wird erst der Datensatz weiter gescrollt, danach, wenn der Datensatz unten am unteren Tabellenrand angekommen ist wird die Tabelle weiter gescrollt.

Nun, die User erwarten eigentlich etwas anderes, die wollen dass wenn man in der Tabelle mit dem Mausrad scrollt, dass sich sofort der Tabelleninhalt verschiebt und nicht erst der Datensatz an das Ende der Tabelle.

Kann man das irgendwie umstellen?

VG Markus
Zuletzt geändert von MmVisual am Do 9. Nov 2023, 15:02, insgesamt 1-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: TDBGrid anderes scrollen?

Beitrag von Sieben »

Nicht dass ich wüsste. Aber du könntest mal schauen, ob die hier vorgestellte Variante, die versucht die SelectedRow zu zentrieren, dem gewünschten Verhalten nicht zumindest nahe kommt.

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: TDBGrid anderes scrollen?

Beitrag von theo »

Sonst gibt's auch noch KDBGrid: https://wiki.lazarus.freepascal.org/KControls
Auch im OPM erhältlich.
Ich habe es noch nie benutzt und weiss daher nicht, ob es deinen Vorstellungen entspricht.

Mathias
Beiträge: 6210
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TDBGrid anderes scrollen?

Beitrag von Mathias »

Nun, die User erwarten eigentlich etwas anderes, die wollen dass wenn man in der Tabelle mit dem Mausrad scrollt, dass sich sofort der Tabelleninhalt verschiebt und nicht erst der Datensatz an das Ende der Tabelle.
Ich habe dies gerade in Libre Calc probiert. Dort wird sofort die Tabelle gescrollt.


TStringGrid habe ich auch probiert, dort ist das gleiche verhalten wie bei TDBGrid beschrieben wurde.

Nach meiner Meinung etwas merkwürdig, das die Lazarus Grids sich anders verhalten als die von der Tabellenkalkulation.
Excel kann ich leider nicht testen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2641
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TDBGrid anderes scrollen?

Beitrag von m.fuchs »

Mathias hat geschrieben:
Mi 8. Nov 2023, 14:09
TStringGrid habe ich auch probiert, dort ist das gleiche verhalten wie bei TDBGrid beschrieben wurde.

Nach meiner Meinung etwas merkwürdig, das die Lazarus Grids sich anders verhalten als die von der Tabellenkalkulation.
Beim StringGrid ist es aber einfach lösbar: Die Property MouseWheelOption muss von mwCursor auf mwGrid gestellt werden.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

charlytango
Beiträge: 845
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: TDBGrid anderes scrollen?

Beitrag von charlytango »

m.fuchs hat geschrieben:
Mi 8. Nov 2023, 16:24
Beim StringGrid ist es aber einfach lösbar: Die Property MouseWheelOption muss von mwCursor auf mwGrid gestellt werden.
hab gerade nachgeschaut, TDBEdit hat eine andere Vererbungshierarchie als TStringGrid.
MouseWheelOption gibt es im TDBGrid nicht.

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: TDBGrid anderes scrollen?

Beitrag von Sieben »

Da das Property schon in TCustomGrid (als protected) angelegt ist, könnte man es in einem TDBGrid veröffentlichen. Es tut nur leider ohne weiteres nicht, man müsste wohl ein eigenes DoMouseWheel implementieren.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2641
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TDBGrid anderes scrollen?

Beitrag von m.fuchs »

Das hat beim TDBGrid auch etwas damit zu tun, was beim Scrollen passiert. Sind denn alle Datensätze schon im Speicher oder werden sie beim Scrollen erst aus der DB geladen?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: TDBGrid anderes scrollen?

Beitrag von MmVisual »

Die Datensätze sind in der Regel schon alle da, damit rechts die Scrollbox korrekt gezeicht werden kann.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2641
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TDBGrid anderes scrollen?

Beitrag von m.fuchs »

MmVisual hat geschrieben:
Mi 8. Nov 2023, 19:09
Die Datensätze sind in der Regel schon alle da, damit rechts die Scrollbox korrekt gezeicht werden kann.
Ist das eine Vermutung oder weißt du das ganz sicher? Um die Scrollbars zu zeichnen würde ja auch der RecordCount vom DataSet ausreichen.

In der Methode DoMouseWheelDown wird jedenfalls (unter anderem) folgendes gemacht:

Code: Alles auswählen

FDatalink.MoveBy(1);
Das erscheint mir schon so, als würde da einfach im gekoppelten DataSet ein Record weitergegangen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Soner
Beiträge: 624
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: TDBGrid anderes scrollen?

Beitrag von Soner »

Ich wollte das auch immer haben, deshalb habe ich es jetzt umgesetzt. Ein Beispielprogramm mit TBufDataset ist dabei.
Ihr könnt es auch in eurem Programm direkt testen in dem Ihr Abschnitte mit Kommenter "// Copy in your code ..." und "// ... until here" in eurem Projekt einfügt, einmal im Interface-Teil und einmal im Implementation-Teil.
Dann müst ihr in Form.OnCreation-Teil, das noch hinzufügen:
EureDBGrid.MouseWheelOption:=mwGrid;

Testet es bitte in eurem Projekt, das ist Ein-Minuten-Arbeit, wenn es gut funktioniert, dann kann ich Patch einreichen.
Bei mir funktioniert es wunderbar mit ZEOS-Komponente.

Es wird bei "MouseWheelOption:=mwGrid" Seitenweise gescrollt, sollte es vielleicht halbe Seite oder die letzte bzw. erste Zeile von vorherige Seite angezeigt werden?
Dateianhänge
dbgridpagescroll-pub.zip
(137.86 KiB) 52-mal heruntergeladen

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: TDBGrid anderes scrollen?

Beitrag von MmVisual »

Vielen Dank für den Code!

Ich habe das Scrollen noch etwas "verfeinert". Nun kann mit "Ctrl" seitenweise gescrollt werden, und ohne "Ctrl" so wie vorher:

Code: Alles auswählen

function TDBGrid.DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean;
begin
  Result := False;
  if Assigned(OnMouseWheelUp) then
    OnMouseWheelUp(Self, Shift, MousePos, Result);
  if not Result and Datalink.Active then begin
    // hier die Änderung:
    if ssCtrl In Shift then TComponentDataLink(Datalink).MoveBy(-VisibleRowCount*2+1)
    else TComponentDataLink(Datalink).MoveBy(-1);
    Result := True;
  end;
end;

function TDBGrid.DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean;
begin
  Result := False;
  if Assigned(OnMouseWheelDown) then
    OnMouseWheelDown(Self, Shift, MousePos, Result);
  if not Result and Datalink.Active then begin
    // hier die Änderung:
    if ssCtrl In Shift then TComponentDataLink(Datalink).MoveBy(VisibleRowCount*2-Row)
    else TComponentDataLink(Datalink).MoveBy(1);
    Result := True;
  end;
end; 
Eventuell müsste man das
TMouseWheelOption = (mwCursor, mwGrid);
noch erweitern zu:
TMouseWheelOption = (mwCursor, mwGrid, mwBoth);
Mit dem mwBoth könnte man das mit der Ctrl Taste einbauen.

Guter Tipp, dass man die Klasse TDBGrid lokal einfach überschreiben kann ohne gleich eine neue Komponente erfinden zu müssen.
EleLa - Elektronik Lagerverwaltung - www.elela.de

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: TDBGrid anderes scrollen?

Beitrag von wp_xyz »

Ich würde das nicht mit der mwGrid-Option zusammenwürfeln. Denn das mwGrid beim TStringGrid funktioniert anders: da bleibt die aktive Zeile unverändert und es scrollt nur das Grid, das die Zelle "mitnimmt" und diese allmählich aus dem sichtbaren Fenster herausbefördert. In dieser Lösung hier aber scrollt weiterhin die aktive Zelle, nur halt in größeren Sprüngen. Das verhält sich so wie PgUp/PgDown mit dem Mausrad bedient.

Soner
Beiträge: 624
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: TDBGrid anderes scrollen?

Beitrag von Soner »

wp_xyz bei TDBGrid muss die aktive Zeile immer in sichtbaren Bereich sein, aber dieser Unterschied ist für den Benutzer unwichtig, Hauptsache er scrollt Seitenweise. Ob seitenweise oder zeilenweise, am Endeffekt wird gescrollt und die aktive Zeile wird auf jeden Fall geändert.

Die Idee von MmVisiual ist auch gut. Ich tendiere auf so etwas:

Code: Alles auswählen

if (ssCtrl In Shift)or(MouseWheelOption=mwGrid) then  Seiteweisescrollen
else Normalscrollen;
Damit sind die bisherigen Benutzer, die an einem Programm gewöhnt sind nicht verwirrt, aber man kann auch seitenweise Scrollen.

Schreibt einfach was ihr denkt, ihr versuche morgen Abend ein Patch zu reichen.

Soner
Beiträge: 624
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: TDBGrid anderes scrollen?

Beitrag von Soner »

Ich habe hier feature request eingereicht, wie ich oben in meinem letzten Text beschrieben habe.
Macht eure Ergänzungen oder Einwände bitte dort.

Antworten