Vorab schon mal der Code-Abschnitt um den es geht:
Code:
procedure TfrmMain.BtnDateiZuPosClick(Sender: TObject);
var sTemp : String;
begin
if Sender = TObject(BtnOrdnerZuPos) then FODDateiPos.Options:= [fdoPickFolders]
else if Sender = TObject(BtnDateiZuPos) then FODDateiPos.Options:= [];
// In
DB schreiben
if FODDateiPos.Execute then
begin
sTemp:= FODDateiPos.FileName;
SetSQLAndExecute(AdsQryMFA, 'UPDATE RLS_Detail ' +
'SET Datei = ' + QuotedStr(sTemp) + ' ' +
'WHERE ID = ' + AdsQuePosition.FieldByName('ID').AsString);
Book := AdsQuePosition.GetBookmark;
end;
// Aktualisieren
AdsQuePosition.Refresh;
LblHyperlink.Caption:= AdsQuePosition.FieldByName('Datei').AsString;
end;
Die Funktion SetSQLAndExecute führt einfach nur den
SQL-Befehl aus.
Wenn ich die Prozedur mit den Options [fdoPickFolders] ausführe, bleibt der Cursor an der gleichen Position im DBGrid stehen.
Wenn ich die Prozedur mit den Options [] ausführe, springt der Cursor an die erste Position im DBGrid. Ich habe schon versucht, mir die Position mit dem Bookmark zu merken und dann am Ende wieder dort hinzuspringen. Das funktioniert auch, wenn ich erst danach durch einen Button-Click, oder so wie ich es jetzt ziemlich unschön umgangen habe, indem ich im AfterRefresh der
Query einen Timer starte, an die entsprechende Position zurückspringe. Wenn ich z.B. im AfterRefresh direkt an die Position mit GoToBookmark springe, funktioniert das zwar auch, allerdings scheint sich das Grid danach noch zu aktualisieren, sodass ich wieder beim ersten Datensatz lande.
Zudem kann ich das Springen an die erste Position manchmal verhindern, wenn ich kurz im Debugmodus anhalte und da ein paar Sekunden warte.
Hat irgendjemand eine Ahnung, warum sich das Grid in dem einen Fall so komisch verhält, und im anderen Fall richtig?