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/)
-   -   Dataset übernimmt Wert erst wenn TwwDBEdit Focus verliert (https://www.delphipraxis.net/203846-dataset-uebernimmt-wert-erst-wenn-twwdbedit-focus-verliert.html)

Getox 31. Mär 2020 09:56

Dataset übernimmt Wert erst wenn TwwDBEdit Focus verliert
 
Hallo,

ich habe ein TwwDBEdit. Wenn ich den Wert darin ändere und das Edit dann verlasse, wird der Wert zuverlässig in das DataField übernommen. Wenn ich aber direkt auf meinen Speichern-button klicke ohne vorher das Edit zu verlassen, steht in dem verknüpften Field noch der alte Wert. Es sind aber knapp 10 TwwDBEdits mit diesem Dataset verbunden und man weiß so nicht, ob und welches nun verändert wurde. Gibt es eine Funktion, um direkt die ganzen Änderungen aus allen Edits ind das Dataset zu flushen OHNE es zu posten?

Danke

Getox 31. Mär 2020 10:10

AW: Dataset übernimmt Wert erst wenn TwwDBEdit Focus verliert
 
Ok... UpdateRecord klappt.

himitsu 31. Mär 2020 10:14

AW: Dataset übernimmt Wert erst wenn TwwDBEdit Focus verliert
 
Gibt es da vielleicht sowas wie eine Option ala ImmidiatePost, in dem Edit?

Bei DevExpress das Gleiche, damit bei Eingabe nicht jeder einzelne Tastendruck ein OnChange auslöst, wird "standardmäßig" erst beim OnExit der Wert an das dahinterliegende DataSet weitergegeben, aber dort lässt sich dieses Verhalten umstellen.
Bzw., es gibt dort an den Edits auch eine Post-Methode, wo man den aktuellen Wert manuell speichern übertragen kann.

DasWolf 31. Mär 2020 12:31

AW: Dataset übernimmt Wert erst wenn TwwDBEdit Focus verliert
 
Ich würde dann mal behaupten, Du hast einen Speichern-Button des falschen Typs.

himitsu 31. Mär 2020 12:37

AW: Dataset übernimmt Wert erst wenn TwwDBEdit Focus verliert
 
Zitat:

Zitat von DasWolf (Beitrag 1460921)
Ich würde dann mal behaupten, Du hast einen Speichern-Button des falschen Typs.

Das ändert leider nichts am grundsätzlichen Problem. (ok, er könnte diesen einen Button eventuell leicht austauschen)

Ja, ein ToolButton/SpeedButton, der keinen Fokus bekommt, wodurch dann kein OnExit auftritt und der Wert nicht im DataSet landet, ist echt blöd,
aber z.B. auch der DatasetNavigator jeglicher Hersteller besteht ausschließlich aus SpeedButtons, was deswegen echt Spaß macht.

Delphi.Narium 31. Mär 2020 16:47

AW: Dataset übernimmt Wert erst wenn TwwDBEdit Focus verliert
 
Speichern geht eigentlich auch recht einfach mit DataSet.Post ;-)

Da ich gerne mit TActionList arbeite, gibt es in sonnem Fall auch eine Action für's speichern. ShortCut wird Strg+S und ist damit dann auch "kompatibel" zu 'ner Masse anderer Programme, bei denen das Speichern eines Dokumentes, einer Tabelle ... mit dem ShortCut Strg+S versehen ist.

Man muss dann auch nicht schauen, ob man die Tabreihenfolge exakt richtig angelegt hat, kann auch Speedbuttons und DBNavigatoren benutzen, ohne irgendwelche Fokusprobleme zu bekommen. Ist man gerade in 'nem DBMemo klappt das Verlassen mit Tab auch nicht so recht, jedenfalls, wenn das Memo auch Tabs zulässt ... Und mit Strg+S ist man meist auch noch schneller, als immer erstmal mit der Maus die "richtige Stelle" zu suchen / finden ;-)

himitsu 31. Mär 2020 18:09

AW: Dataset übernimmt Wert erst wenn TwwDBEdit Focus verliert
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1460939)
Speichern geht eigentlich auch recht einfach mit DataSet.Post ;-)

nein?

Das Dataset.Post speichert ja nur, was schon im Dataset drin ist, aber wenn das Edit den Wert noch nicht übergeben hat,
und dann ist der Wert nach dem Post auch weg, da im AfterPost/AfterScroll die Edits sich den aktuellen Wert des Datasets holen.


Das TDBEdit von Delphi übergibt den Wert sofort beim Edit.OnChange. Beim Dataset.Post wird das dann problemlos gespeichert.

Es gibt aber DBEdits anderer Hersteller, die übergeben "standardmäßig" den eingegebenen Wert erst beim Edit.OnExit oder eben z.B. bei sowas wie Edit.Post oder Edit.Update, bzw. Edit.DataController.Post ...
Bis zu diesem Moment weiß das Dataset noch nichtmal, dass es eine Änderung gab/gibt.


Funktionsbeispiel:
  • dein TDataset und das eine TField darin ist ein TMemo
  • dein Dataset.Post wäre demnach Memo.Lines.SaveToFile
  • das DBEdit ist ein TEdit
    • normal macht das Edit beim Edit.OnChange ein
      Delphi-Quellcode:
      {Memo.Lines[0]} Memo.Lines.Text := Edit.Text
    • aber es gibt auch "bessere" Edits, die machen das nicht bei jedem einzelnen OnChange, sondern nur einmal beim OnExit (oder bei einem expliziten Update-Befehl)
  • Hast du jetzt eines der besseren DBEdits und machst nun dein Post (Memo.Lines.SaveToFile), ohne vorher z.B. den Fokus zu ändern, dann ist dort die Änderung noch nicht enthalten.
  • -
  • ach ja, beim Memo.OnChange natürlich
    Delphi-Quellcode:
    Edit.Text := Memo.Lines[0];
    , was dann quasi beim Open/Load/AfterScroll den Inhalt des DBEdits füllt

Heimlich 1. Apr 2020 09:00

AW: Dataset übernimmt Wert erst wenn TwwDBEdit Focus verliert
 
Guten Morgen,

mach vor dem Speichern einfach einen Fokuswechsel. Ganz easy auf ein Control, das immer sichtbar ist.


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