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 7 TDBGrid Scrollbar (https://www.delphipraxis.net/191773-delphi-7-tdbgrid-scrollbar.html)

A.Griffin 17. Feb 2017 13:21

Delphi 7 TDBGrid Scrollbar
 
Hallo zusammen,

ich verwende Delphi 7 und habe eine TDBGrid die als Datasource eine TDataSource und als DataSet eine TTable hat. Jetzt ist das problem, dass der Datensatz immer wieder mit neuen Daten gefüttert wird und, wenn man dabei in der TDBGrid scrollt, dann springt die Scrollbar immer wieder zu den neuen Datensätzen. Ich möchte, wenn man in der Grid runterscrollt und neue Datensätze kommen, die Scrollleiste an der Stelle bleiben soll. Kann einer mir dabei helfen?

Mit freundlichen Grüßen
Alex

nahpets 17. Feb 2017 14:42

AW: Delphi 7 TDBGrid Scrollbar
 
Das liegt nicht am DBGrid.

Das DBGrid zeigt immer (meist etwa mittig) den aktuellen Datensatz der Datenquelle an.

Wird bei 'ner TTable nun was an neuen Daten angefügt, so wandert der Datensatzzeiger von TTable auf den zuletzt eingefügten Datensatz. Die Anzeige im DBGrid wandert automatisch mit.

Soll im DBGrid aber diese "Wanderung" nicht nachvollzogen werden, so muss man sich vor dem Einfügen neuer Datensätze den aktuellen Datensatz merken, die Daten einfügen und dann zum gemerkten Datensatz zurückkehren.

Schau Dir bitte mal in der Delphi 7-Hilfe das Beispiel zu "GetBookmark, GotoBookmark, FreeBookmark, FindPrior, Value, OnDataChange, Bof (Beispiel)" an, eventuell kannst Du es entsprechend Deiner Bedürfnisse anpassen.

Ungetestet eventuell sowas in der Art:
Delphi-Quellcode:
procedure TForm1.DatenInTabelleUebernehmen(MyData : TTable);
var
   SavePlace: TBookmark;
begin
  MyData.DisableControls;
  { Positionsmarke abrufen, damit wir zum selben Datensatz zurückkehren können }
  SavePlace := MyData.GetBookmark;
  try
    { Daten einfügen }
    MyData.Append;
    // Felder mit Inhalt belegen
    MyData.Post;
    { Zurück zu Positionsmarke wechseln. }
    MyData.GotoBookmark(SavePlace);
    { Wert zuweisen }
    { Positionsmarke freigeben }
  finally
    FreeBookmark(SavePlace);
  end;
  MyData.EnableControls;
end;
Aufruf im Programm:
Delphi-Quellcode:
DatenInTabelleUebernehmen(DeineTTableKomponente);

A.Griffin 22. Feb 2017 15:47

AW: Delphi 7 TDBGrid Scrollbar
 
Hat Alles wunderbar geklappt! Vielen Dank für die Lösung.

A.Griffin 23. Feb 2017 12:51

AW: Delphi 7 TDBGrid Scrollbar
 
Mir ist gerade aufgefallen, dass die vertikale Position wunderbar gespeichert wird, aber leider wird beim Verändern des Datensatzes immer noch die Scrollbar horizontal nach ganz links gesetzt. Das stört jetzt immer noch wenn man einen sehr "breiten" Datensatz offen hat und alles wegrutscht.

nahpets 23. Feb 2017 13:11

AW: Delphi 7 TDBGrid Scrollbar
 
Naja, dann die Routine halt noch ein bisserl (ungetestet) anpassen:
Delphi-Quellcode:
procedure TForm1.DatenInTabelleUebernehmen(MyData : TTable);
var
   SavePlace: TBookmark;
   SaveField: TField;
begin
  MyData.DisableControls;
  { Positionsmarke abrufen, damit wir zum selben Datensatz zurückkehren können }
  SavePlace := MyData.GetBookmark;
  { Focussiertes Feld merken }
  SaveField := DBGrid.SelectedField;
  try
    { Daten einfügen }
    MyData.Append;
    // Felder mit Inhalt belegen
    MyData.Post;
    { Zurück zu Positionsmarke wechseln. }
    MyData.GotoBookmark(SavePlace);
    { Zurück zu fokussierten Feld }
    DBGrid.SelectedField := SaveField;
  finally
    { Positionsmarke freigeben }
    FreeBookmark(SavePlace);
  end;
  MyData.EnableControls;
end;
Damit sollte der Fokus zumindest wieder in dem Feld sein, in dem er vor der Aktuallisierung war. Es wird aber nicht zwingend die exakte Optik vom Zustand vor der Aktuallisierung wieder hergestellt sein.

Ansonsten schau Dir mal die Methode ScrollBy an.

A.Griffin 2. Mär 2017 08:15

AW: Delphi 7 TDBGrid Scrollbar
 
Der Fehler mit dem horizontalen Scrollen lag an dgRowSelect := True. Mit der Einstellung wird die horizontale Scrollbar bei jeder Interaktion nach ganz links versetzt. z.B. wenn man vertikal scrollt oder wenn man in die DBGrid klickt.


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