[Gelöst] TDBGrid anderes scrollen?
-
- Beiträge: 1346
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 2.0.10 FPC 3.2)
- CPU-Target: 32/64Bit
[Gelöst] TDBGrid anderes scrollen?
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
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.
-
- Beiträge: 198
- 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?
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.
Re: TDBGrid anderes scrollen?
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.
Auch im OPM erhältlich.
Ich habe es noch nie benutzt und weiss daher nicht, ob es deinen Vorstellungen entspricht.
-
- Beiträge: 5933
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunc)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: TDBGrid anderes scrollen?
Ich habe dies gerade in Libre Calc probiert. Dort wird sofort die Tabelle 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.
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
Mit Java und C/C++ sehe ich rot
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2623
- 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?
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
-
- Beiträge: 813
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz 2.2.6
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
-
- Beiträge: 198
- 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?
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.
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2623
- 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?
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
-
- Beiträge: 1346
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 2.0.10 FPC 3.2)
- CPU-Target: 32/64Bit
Re: TDBGrid anderes scrollen?
Die Datensätze sind in der Regel schon alle da, damit rechts die Scrollbox korrekt gezeicht werden kann.
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2623
- 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?
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);
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
-
- Beiträge: 608
- 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?
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?
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) 8-mal heruntergeladen
-
- Beiträge: 1346
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 2.0.10 FPC 3.2)
- CPU-Target: 32/64Bit
Re: TDBGrid anderes scrollen?
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:
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.
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;
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.
Re: TDBGrid anderes scrollen?
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.
-
- Beiträge: 608
- 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?
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:
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.
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;
Schreibt einfach was ihr denkt, ihr versuche morgen Abend ein Patch zu reichen.
-
- Beiträge: 608
- 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?
Ich habe hier feature request eingereicht, wie ich oben in meinem letzten Text beschrieben habe.
Macht eure Ergänzungen oder Einwände bitte dort.
Macht eure Ergänzungen oder Einwände bitte dort.