AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein TFileOpenDialog fürht zu kuriosem DBGrid-Verhalten
Thema durchsuchen
Ansicht
Themen-Optionen

TFileOpenDialog fürht zu kuriosem DBGrid-Verhalten

Ein Thema von mariusbenz · begonnen am 20. Jul 2016 · letzter Beitrag vom 21. Jul 2016
Antwort Antwort
mariusbenz

Registriert seit: 6. Mär 2015
38 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: TFileOpenDialog fürht zu kuriosem DBGrid-Verhalten

  Alt 20. Jul 2016, 14:29
Ich finde die Lösung mit dem Timer auch sehr unschön. Mir schien es nur so, dass das mit dem GotoBookmark nur klappt, wenn ich ihn aus einer komplett anderen Funktion her aufrufe(also alles was nicht direkt mit dem Button-click bzw den Query-Ereignissen zusammenhängt), weil das Grid sich GANZ am Ende irgendwie aktualisiert und dadurch auf den ersten Datensatz springt.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: TFileOpenDialog fürht zu kuriosem DBGrid-Verhalten

  Alt 20. Jul 2016, 14:40
AFAIK sind die Bookmarks von vor dem Refresh nach dem Refresh nicht mehr gültig.

Das kann man aber mit Delphi-Referenz durchsuchenTDataSet.BookmarkValid ganz einfach prüfen
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
mariusbenz

Registriert seit: 6. Mär 2015
38 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: TFileOpenDialog fürht zu kuriosem DBGrid-Verhalten

  Alt 21. Jul 2016, 07:16
Als dieses Verhalten das erste Mal aufgetreten ist, sah die Prozedur noch folgendermaßen aus:

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);
      end;
  end;
Die Bookmarks waren nur der Versuch, diesen Fehler zu kompensieren.

Und auch da war es schon so, dass nach dem FileOpenDialog mit PickFolders der Cursor am gleichen Datensatz stehen geblieben ist,er aber ohne PickFolders auf den ersten Datensatz zurückgesprungen ist, und zwar nachdem die Prozedur beendet war(zumindest scheint es so).
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TFileOpenDialog fürht zu kuriosem DBGrid-Verhalten

  Alt 21. Jul 2016, 07:22
Deswegen mein ich: ID merken => Update machen => Refresh => Locate auf gemerkte ID.
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
mariusbenz

Registriert seit: 6. Mär 2015
38 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: TFileOpenDialog fürht zu kuriosem DBGrid-Verhalten

  Alt 21. Jul 2016, 07:56
Danke ConnorMcLeod, die Funktion Locate war die, die meinem Arbeitskollegen nicht mehr eingefallen war, weshalb ich den Umweg über die Bookmarks gemacht habe. Sieht deutlich schöner aus mit dem Locate.

Code:
procedure TfrmMain.BtnDateiZuPosClick(Sender: TObject);
  var sTemp : String;
      LetzteID : Integer;
  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);
        LetzteID:= AdsQuePosition.FieldByName('ID').AsInteger;
      end;
    // Aktualisieren
    AdsQuePosition.Refresh;
    Application.ProcessMessages;
    AdsQuePosition.Locate('ID', LetzteID, []);

    LblHyperlink.Caption:= AdsQuePosition.FieldByName('Datei').AsString;
  end;
Richtig funktioniert hat es allerdings erst, nachdem ich nach dem Refresh noch ein ProcessMessages mache. Dadurch kann ich mir auch den ******* Timer sparen.
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: TFileOpenDialog fürht zu kuriosem DBGrid-Verhalten

  Alt 21. Jul 2016, 08:10
Freut mich, wenns jetzt passt!
Was mir noch aufgefallen ist: das Update passiert nur, wenn FODDateiPos.Execute, aber das Refresh passiert immer. Wenn nicht FODDateiPos.Execute, dann ist LetzteID undefiniert.
Ich würde entweder alles in das if-begin-end hineintun oder die ID schon vor dem if merken (das wäre auch sicherer bezüglich dem Update - wer weiß, was in dem SetSQLAndExecute alles abgeht...).
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: TFileOpenDialog fürht zu kuriosem DBGrid-Verhalten

  Alt 21. Jul 2016, 08:13
Und das Application.ProcessMessages kann man noch eliminieren, wenn man die Events BeforeRefresh und AfterRefresh geschickt bestückt.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz