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/)
-   -   Delphi TDBGrid - Datensatz springt bei Refresh / Vertik. Pos ändern (https://www.delphipraxis.net/116999-tdbgrid-datensatz-springt-bei-refresh-vertik-pos-aendern.html)

DocE 9. Jul 2008 21:24


TDBGrid - Datensatz springt bei Refresh / Vertik. Pos ändern
 
Hallo zusammen!

Komme mit dem Problem nicht so richtig weiter, vielleicht wisst ihr Rat...

Wenn ich auf eine mit einem TDBGrid verknüpfte Datenmenge ein Refresh/Requery ausführe bin ich wieder am Anfang der Datenmenge, das ist soweit klar. Also muss man vorher ein Bookmark setzen oder nachher über die ID den aktuellen Datensatz wieder locaten. Soweit so gut. Das Problem ist jetzt, das die (vertikale) Position des Datensatzes im Grid nicht mit der vorherigen übereinstimmt. Bei Bookmark wird über Resync([rmCenter]) der Datensatz in der Mitte des Grids positioniert, bei Locate landet er logischerweise ganz unten.

Wie kann ich die vorherige Position wiederherstellen? Also so, dass der Datensatz im Grid nicht "springt". Das ist irritierend und man vertut sich leicht.

Habe schon daran gedacht mit SendMessage(DBGrid.Handle, WM_VSCROLL, SB_LINEDOWN, 0); solange zu scrollen bis man wieder an der Stelle ist, danach relocaten oder mit WM_KEYDOWN - VK_UP wieder hoch zum Datensatz... (Ich weiß, ziemlich bescheidener Workaround, aber was will man machen?!) Aber selbst dazu müßte man irgendeinen Referenzwert haben. z.B. Welcher ist der erste sichtbare Datensatz im Grid, da würde die RecordNo der DataSet reichen. Aber wie bekommt man die raus?

Die Info welche Pos die Scrollbar hat (GetScrollInfo) reicht hier nicht aus, da sich diese wiederum nur auf die Record-No bezieht, aber nichts über die tatsächliche vertikale Position des DS im Grid aussagt.. Ein SetScrollInfo versagt sowieso vollständig, deshalb obiger Workaround.

Vielleicht hat jemand noch eine Lösung oder eine bessere Idee.

Bereits jetzt vielen Dank!

Grüße
Doc

omata 9. Jul 2008 21:58

Re: TDBGrid - Datensatz springt bei Refresh / Vertik. Pos än
 
Du hast leider nicht geschrieben mit welchen Datenbankkomponenten du arbeitest.

Also ganz allgemein arbeite mit...

DataSet->DataSetProvider->ClientDataSet->DataSource->DBGrid

wenn du da dann ein Refresh ausführst (auf dem ClientDataSet), verändert sich der Datensatzzeiger nicht.
Dies gilt im speziellen für dbExpress. Wenn du eine andere Zugriffsmethode wählst sollte das aber identisch sein.

DocE 9. Jul 2008 23:00

Re: TDBGrid - Datensatz springt bei Refresh / Vertik. Pos än
 
Arbeite mit einer SQL-Query und einer DataSource. DataSetProvider und ClientDataSet verwende ich nicht.

Das Requery ist praktisch so, als würde die SQL-Abfrage vollständig neu ausgeführt bzw. wird sie auch.

Um die Frage einfacher zu formulieren:

Wie stelle ich den ersten sichtbaren Datensatz (egal was: RecordNo, DS-Feld) in einem TDBGrid fest?

oder

Wie stelle ich fest, in welcher sichtbaren Zeile eines TDBGrids sich der markierte/aktuelle DS befindet?

Das würde mir schon deutlich weiterhelfen. Rest wäre dann Workaround, aber hauptsache es funktioniert...

omata 9. Jul 2008 23:10

Re: TDBGrid - Datensatz springt bei Refresh / Vertik. Pos än
 
Ich habe geschrieben wie es geht. Wenn du das nichtmal ausprobieren willst, dann ist das dein Problem.

DocE 9. Jul 2008 23:18

Re: TDBGrid - Datensatz springt bei Refresh / Vertik. Pos än
 
o_O

:duck:

Sorry, aber wollte Dich keinesfalls angreifen! Werde das ausprobieren, allerdings interessiert mich o.g. Fragestellung auch generell. Das muss doch irgendwie möglich sein, oder nicht?


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