AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi TDateTimePicker, OnChange soll zeitverzögert feuern
Thema durchsuchen
Ansicht
Themen-Optionen

TDateTimePicker, OnChange soll zeitverzögert feuern

Ein Thema von hoika · begonnen am 8. Mai 2008 · letzter Beitrag vom 9. Mai 2008
Antwort Antwort
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#1

TDateTimePicker, OnChange soll zeitverzögert feuern

  Alt 8. Mai 2008, 21:54
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
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: TDateTimePicker, OnChange soll zeitverzögert feuern

  Alt 8. Mai 2008, 21:57
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
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.096 Beiträge
 
FreePascal / Lazarus
 
#3

Re: TDateTimePicker, OnChange soll zeitverzögert feuern

  Alt 8. Mai 2008, 21:59
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
Felix Alter
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: TDateTimePicker, OnChange soll zeitverzögert feuern

  Alt 9. Mai 2008, 07:26
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
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: TDateTimePicker, OnChange soll zeitverzögert feuern

  Alt 9. Mai 2008, 07:56
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
Heiko
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: TDateTimePicker, OnChange soll zeitverzögert feuern

  Alt 9. Mai 2008, 09:21
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#7

Re: TDateTimePicker, OnChange soll zeitverzögert feuern

  Alt 9. Mai 2008, 10:00
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
Oliver
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: TDateTimePicker, OnChange soll zeitverzögert feuern

  Alt 9. Mai 2008, 11:21
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
Heiko
  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 02:16 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