![]() |
TDateTimePicker, OnChange soll zeitverzögert feuern
Hallo #,
ich habe ein Form mit TDateTimePicker und ListView. In der ListView werden pro gewählten Tag ein paar Daten angezeigt. Da das Laden etwas dauert, will ich nicht, dass der DB-Zugriff bei jedem Nutzer-"Gefummel" erfolgt. Gibt es da was fertiges ? Bei einer ComboBox hatte ich mal was gelesen, dass bei jedem Ändern ein Timer (0.5 sec) gestartet wird, der prüft dann, ob der Wert immer noch der bei der Änderung ist, wenn ja, wird die ListView aktualisiert. Das war vom Code her ziemlich mühselig. Wie würdet ihr das Lösen ? Heiko |
Re: TDateTimePicker, OnChange soll zeitverzögert feuern
Du könntest einfach einen Timer mit dem Interval 500 benutzen, und Enabled beim OnChange zuerst auf False und dann wieder auf true setzen. So mache ich das jedenfalls immer, ob es eine bessere Möglichkeit gibt, weiß ich nicht, ich glaube jedenfalls nicht, dass es noch einfacher geht.
Mfg |
Re: TDateTimePicker, OnChange soll zeitverzögert feuern
Hi,
evtl mit ![]() ![]() Mfg FAlter |
Re: TDateTimePicker, OnChange soll zeitverzögert feuern
Moin Heiko,
reagierst du auf das Ereignis OnChange() des DateTimePickers? Das geht auch anders:
Delphi-Quellcode:
Freundliche Grüße
type
TDemoForm = class(TForm) DateTimePicker: TDateTimePicker; ListView: TListView; ApplicationEvents: TApplicationEvents; procedure DateTimePickerChanged(Sender: TObject); procedure DateTimePickerKeyPress(Sender: TObject; var Key: Char); procedure FormCreate(Sender: TObject); procedure DateTimePickerChange(Sender: TObject); procedure ApplicationEventsIdle(Sender: TObject; var Done: Boolean); private LastChanged: Cardinal; end; var DemoForm: TDemoForm; implementation {$R *.dfm} const CHANGE_DELAY = 500; // ticks = msecs procedure LoadItems(items: TListItems; dt: TDateTime); var i: Integer; item: TListItem; begin items.BeginUpdate; items.Clear; for i := 0 to Random(8) do begin item := items.Add; item.Caption := IntToStr(i); item.SubItems.Add(DateToStr(dt)); end; items.EndUpdate; end; procedure TDemoForm.DateTimePickerChanged(Sender: TObject); begin with Sender as TDateTimePicker do LoadItems(ListView.Items, Date); LastChanged := 0; end; procedure TDemoForm.DateTimePickerKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then begin Key := #0; DateTimePickerChanged(Sender); end; end; procedure TDemoForm.FormCreate(Sender: TObject); begin with DateTimePicker do begin OnCloseUp := DateTimePickerChanged; OnExit := DateTimePickerChanged; end; end; procedure TDemoForm.DateTimePickerChange(Sender: TObject); begin LastChanged := GetTickCount; end; procedure TDemoForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean); begin Done := LastChanged = 0; if Done then Exit else Done := (GetTickCount - LastChanged) > CHANGE_DELAY; if Done then DateTimePickerChanged(DateTimePicker); end; |
Re: TDateTimePicker, OnChange soll zeitverzögert feuern
Hallo,
hm, also auf Enter, Kalender schliessen und Exit reagieren. OK Aber: stell dir den Nutzer vor. Er ändert von Hand ohne Aufklappen das Datum und nichts passiert. Ich hatte gerade gestern nen Kundenanruf. Er fragte, wieso ist in diesem Fenster nicht dieses Ding zum Aufklappen. Meine Antwort: Weil das dort nicht richtig funktioniert. ;( Irgendwie fehlt bei dem Teil ein OnChangedAnd_0,5_SecsNoOtherChanges ;) Heiko |
Re: TDateTimePicker, OnChange soll zeitverzögert feuern
Das Edit-Feld des DateTimePickers feuert das Ereignis OnChange() nur, wenn ein Subfield vollständig eingegeben oder verlassen wurde.
Ich habe meinen Code in Beitrag #4 etwas erweitert. |
Re: TDateTimePicker, OnChange soll zeitverzögert feuern
Andere Frage: Wieso führt jede Änderung sofort zu einem DB-Zugriff? Sollte das nicht erst passieren, wenn Du das zugrundeliegende DataSet postest? Und wann Du das postest liegt ja in Deiner Hand.
Sherlock |
Re: TDateTimePicker, OnChange soll zeitverzögert feuern
Hallo,
marabu: so ähnlich hatte ich es auch mit einer TComboBox mal gesehen ich probier es aus, Danke ! Vielleicht baue ich ne Komponente draus Sherlock: es werden Reports angezeigt, immer für den aktuellen Tag ändert der Nutzer jetzt den Tag, kann er doch erwarten, dass die Reports des neuen Tages angezeigt werden ? -> DB-Zugriff Mit Ändern meinte ich nicht DB-Ändern, sondern Datum ändern. Es wird nix in die DB geschrieben. Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:52 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