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 TDateTimePicker, OnChange soll zeitverzögert feuern (https://www.delphipraxis.net/113504-tdatetimepicker-onchange-soll-zeitverzoegert-feuern.html)

hoika 8. Mai 2008 20:54


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

Fussball-Robby 8. Mai 2008 20:57

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

FAlter 8. Mai 2008 20:59

Re: TDateTimePicker, OnChange soll zeitverzögert feuern
 
Hi,

evtl mit Delphi-Referenz durchsuchenOnExit und Delphi-Referenz durchsuchenOnMouseExit, keine Ahnung, ob das in deinem Fall was bringen würde. So lange der User noch mit Maus / Tastatur drin rumfummelt noch nicht. Gerade bei der Maus kann es aber schnell mal passieren, evtl. im entsprechenden On(Mouse)Enter einen Timer deaktivieren, im On(Mouse)Ecit aktivieren und im Timer selbst abfragen und Timer wieder deaktivieren? Naja, hört sich ziemlich umständlich an. Wäre so der erste Gedanke.

Mfg
FAlter

marabu 9. Mai 2008 06:26

Re: TDateTimePicker, OnChange soll zeitverzögert feuern
 
Moin Heiko,

reagierst du auf das Ereignis OnChange() des DateTimePickers? Das geht auch anders:

Delphi-Quellcode:
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;
Freundliche Grüße

hoika 9. Mai 2008 06:56

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

marabu 9. Mai 2008 08:21

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.

Sherlock 9. Mai 2008 09:00

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

hoika 9. Mai 2008 10:21

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 08:19 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