Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Mehrere Zeitabfragen im Timer, wie? (https://www.delphipraxis.net/181634-mehrere-zeitabfragen-im-timer-wie.html)

Codix32 30. Aug 2014 18:03

Delphi-Version: 2005

Mehrere Zeitabfragen im Timer, wie?
 
Hallo,

kann man in einem Timer mehrere Zeitabgleiche machen?

Nehmen wir an ich habe eine Listbox mit mehreren Items:

13:50 Blabla
13:50 Herd ausschalten
13:52 Text
14:00 Text
15:33 Text
16:10 usw

Ist zum Beispiel 13:50 erreicht, soll eine Meldung erscheinen.
Wenn ich Items in ein dynamisches Array einlese, kann ich im Timer die Zeiten in einer Schleife abfragen?
Oder gibt es eine Alternative zur Timer Komponenten?

zeras 30. Aug 2014 18:24

AW: Mehrere Zeitabfragen im Timer, wie?
 
Du kannst durch die Listbox durchsteppen mit Listbox.items[x]. Anzahl mit items.count.
Vielleicht hilft das.

Medium 30. Aug 2014 18:42

AW: Mehrere Zeitabfragen im Timer, wie?
 
Ich verstehe hier das Problem nicht so wirklich muss ich gestehen. Um die konkrete Frage zu beantworten: Ja, man kann natürlich im Timer-Event auch eine Schleife nutzen. Das hätte man aber auch ausprobieren können. Ich vermute hier aber eigentlich eine andere Fragestellung, nur leider fehlt diese und wir müssten raten.

Codix32 30. Aug 2014 19:10

AW: Mehrere Zeitabfragen im Timer, wie?
 
Zitat:

Zitat von Medium (Beitrag 1270340)
Ich verstehe hier das Problem nicht so wirklich muss ich gestehen. Um die konkrete Frage zu beantworten: Ja, man kann natürlich im Timer-Event auch eine Schleife nutzen. Das hätte man aber auch ausprobieren können. Ich vermute hier aber eigentlich eine andere Fragestellung, nur leider fehlt diese und wir müssten raten.

In etwa so:
Delphi-Quellcode:

procedure TForm1.Timer1Timer(Sender: TObject);
var
  aTime,bTime: TDateTime;
  str:string;
begin
 aTime := Time;

 {Timerintervall ist 1000 Kann ich hier die gesamten Intems in einer Sekunde durchgehen?}
 for i := 0 to (Listbox1.count-1) do
   begin
     bTime:= TrimLeft(copy(Listbox1.Items[i],1,8)); //<- (13:50:00  Blabla)
     If aTime >= bTime then
       begin
         inc(iFlag); //<- global
           if iFlag = 1 then
           begin
            Label4.Caption:= Listbox1.items[i];
            iFlag:=0;
           end;
       end;
   end;
end;
Gibt es da keinen besseren Ansatz?

Sir Rufo 30. Aug 2014 19:30

AW: Mehrere Zeitabfragen im Timer, wie?
 
Ja es gibt einen besseren Ansatz.
  • Benutze die Listbox ausschliesslich zur Anzeige
  • Merke die einzelnen Zeitpunkte in einer Liste
  • Mit dieser Liste kannst du die Anzeige für die Listbox füttern
  • Gehe durch die Liste und prüfe ob ein Zeitpunkt <= der aktuellen Uhrzeit ist und die letzte Signalisierung < der aktuellen Zeit (Datum+Zeit)
Wegen der Zeitdauer (geht das innerhalb einer Sekunde) brauchst du dir eigentlich keine Sorgen machen (wenn du zwischendurch nicht noch die Quadratur des Kreises berechnen willst).

Namenloser 30. Aug 2014 19:31

AW: Mehrere Zeitabfragen im Timer, wie?
 
Delphi-Referenz durchsuchenStrToTime? :glaskugel:

Codix32 30. Aug 2014 19:46

AW: Mehrere Zeitabfragen im Timer, wie?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1270352)
Ja es gibt einen besseren Ansatz.
  • Benutze die Listbox ausschliesslich zur Anzeige
  • Merke die einzelnen Zeitpunkte in einer Liste
  • Mit dieser Liste kannst du die Anzeige für die Listbox füttern
  • Gehe durch die Liste und prüfe ob ein Zeitpunkt <= der aktuellen Uhrzeit ist und die letzte Signalisierung < der aktuellen Zeit (Datum+Zeit)
Wegen der Zeitdauer (geht das innerhalb einer Sekunde) brauchst du dir eigentlich keine Sorgen machen (wenn du zwischendurch nicht noch die Quadratur des Kreises berechnen willst).

Ich grüße Dich Sir Rufo,

Also das Formular soll nach dem Start in der Taskleiste liegen.
Wenn in der Liste zum Beispiel '13:00 Putin wegen zu hohem Gaspreis anrufen' steht, soll ein Fenster oder eine MessageBox um 13:00 Uhr auf dem Desktop erscheinen und diese Meldung oder wenn es mehrere 13:00 Ereignisse gibt, diese anzeigen.

Codix32 30. Aug 2014 19:56

AW: Mehrere Zeitabfragen im Timer, wie?
 
Zitat:

Zitat von Namenloser (Beitrag 1270353)
Delphi-Referenz durchsuchenStrToTime? :glaskugel:

Ok:
Delphi-Quellcode:
   bTime:= StrtoTime(TrimLeft(copy(Listbox1.Items[i],1,8))); //<- (13:50:00 Blabla)

Olli73 30. Aug 2014 20:10

AW: Mehrere Zeitabfragen im Timer, wie?
 
Wenn du alle aktuellen Ereignisse abgearbeitet hast, dann könntest du auch einfach prüfen, wann das nächste Ereignis eintritt und das Timerintervall entsprechend setzen.

Gruß
Olli

Sir Rufo 30. Aug 2014 20:11

AW: Mehrere Zeitabfragen im Timer, wie?
 
Zitat:

Zitat von Codix32 (Beitrag 1270358)
Ich grüße Dich Sir Rufo,

Also das Formular soll nach dem Start in der Taskleiste liegen.
Wenn in der Liste zum Beispiel '13:00 Putin wegen zu hohem Gaspreis anrufen' steht, soll ein Fenster oder eine MessageBox um 13:00 Uhr auf dem Desktop erscheinen und diese Meldung oder wenn es mehrere 13:00 Ereignisse gibt, diese anzeigen.

Öhm ja, mach doch einfach, es sollte nur den Timer nicht blockieren.

hathor 30. Aug 2014 21:50

AW: Mehrere Zeitabfragen im Timer, wie?
 
Zitat:

Zitat von Codix32 (Beitrag 1270348)
Gibt es da keinen besseren Ansatz?


Das geht auch besser mit einem Memo:

Delphi-Quellcode:
//Aufrufen, wenn ListBox1 geändert oder gefüllt wird
procedure TForm2.Button1Click(Sender: TObject);
begin
Memo1.Lines:= ListBox1.Items;
end;

procedure TForm2.Timer1Timer(Sender: TObject);
var
  myTime : TDateTime;
  formatted : string;
begin
myTime:= now;
DateTimeToString(formatted, 't', myTime);
if formatted<>Label1.caption then Label1.Caption:= formatted else Exit;

//wird nur 1x/Minute ausgeführt beim Minutenwechsel
if POS(Label1.caption,Memo1.Text)<>0 then
WinApi.Windows.Beep(1500,50); // oder weiter mit procedure AUSWERTUNG...
end;

ExceptionOverflow 12. Sep 2014 15:34

AW: Mehrere Zeitabfragen im Timer, wie?
 
Hallo,

leider schon etwas spät aber ich dachte mir meine Idee könnte trotzdem mal weiterhelfen:
An deiner Stelle würde ich die Liste welche du speicherst / erstellst mit den verschiedenen Aufgaben und deren Zeiten auswerten und den Timer (Tick Event) auf die Zeit bzw. den Zeitabstand zum nächsten Event setzen und wenn dies "getickt" hat wieder das selbe für das nächst anstehende "Event /Aufgabe". Und wenn man diese Liste anpasst oder ändert musst du das natürlich prüfen ob sich die aktuelle Zeitspanne zum nächsten Event geändert hat und dann ggf. die Zeit von Timer anpassen.

Soweit meine Idee - ich hoffe ich habe dein Problem richtig erkannt und liege mit meinem Vorschlag nicht komplett daneben :cyclops:

Beste Grüße,

Niclas


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