Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Zwei Datum- und Zeitwerte vergleichen


derKopf - Di 06.12.05 21:45
Titel: Zwei Datum- und Zeitwerte vergleichen
Hi,
ich bin neu hier und habe ein Problem: Ich muss für die Schule als Projekt ein MP3 Wecker machen, soweit läuft auch fast alles, nur 1 bis 2 "kleine" Mängel hat das Dingen noch, und zwar:

Ich habe 2 Labels in einem wird die Uhrzeit angezeigt im anderen das Datum, darunter hab ich 2 Editfelder, wo ich jeweils die Weckzeit bzw. das Weckdatum einstelle. Dann mit druck auf den Button wird die Zeit und das Datum verglichen und dementsprechend Gültig oder Ungültig als Message ausgegeben....aber jetzt soll noch folgendes passieren:

Wenn die Zeit und das Datum gleich ist, soll eine zweite Form öffnen, in der direkt das Lied abspielt, das ich in Form 1 in einem Opendialog geöffnet habe. Dabei habe ich ein paar Probleme:

Meine Befehl im Timer für den Vergleich;

Delphi-Quelltext
1:
2:
3:
If (ATime=Time) and
   (ADate=Date) then
   Form2.ShowModal;

müsste ja eigentlich stimmen, aber die Form2 wird einfach nicht geöffnet. Aber genau der gleiche Befehl funktioniert in der Button Procedure! Nur hier nicht, warum? Achja ATime : TDateTime und Label7.Caption:= Timetostr(Time)... das gleiche natürlich auch fürs Datum.

Mein anderes Problem ist das Direkte öffnen des Liedes in Form2, ich kriegs von der Logik einfach nicht gebacken das sich das automatisch mit Form2 öffnet....ich muss immer erst auf nen Label klicken oder mir wird ne Fehlermeldung, von wegen Dateinamensende nicht gefunden oder so angezeigt....

Ziemlich verwirrend das Ganze, hoffe es kann jemand was verstehen und dementsprechend helfen :shock: 8) :D

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.
Moderiert von user profile iconTino: Titel geändert.
Moderiert von user profile iconTino: Topic aus Multimedia / Spiele / Grafik verschoben am Mi 07.12.2005 um 16:17


DarkLord05 - Di 06.12.05 21:55

:welcome: hier...
zu deinem Problem:

Mach die Überprüfung mit nem Timer (den so auf 750 ms stellen).


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
...
 Uhrzeit, Datum : String// Globale Variablen
...
 Uhrzeit = ZeitEdit.Text; // Wenn auf deinen "Start"Button geklickt 
 Datum = DatumEdit.Text;   // wird wird das hier in die Variablen geschrieben.
...
 Timer.Enable := True; // Hier wird ein Timer gestartet der Überprüft wie spät es ist.
...
// Im Timer
 UhrzeitX = TimeToStr (Time);
 DatumX = DateToStr (Date);
 IF UhrzeitX = Uhrzeit then
  if DatumX = Datum then
   begin
    //Dieses und jenes Passiert
   end;


derKopf hat folgendes geschrieben:
Form2.ShowModal;
müsste ja eigentlich stimmen, aber die Form2 wird einfach nicht geöffnet. Aber genau der gleiche Befehl funktioniert in der Button Procedure! Nur hier nicht, warum?

Da müsstest du mal zeigen was du da hast, sonst kann man nicht helfen.

//EDIT:
Bin zwar kein Admin, aber wenn du den Titel deines Beitrags änderst, dann gucken sich das bestimmt mehr an, da sie sofort wissen worum es geht. Dafür einfach auf den user defined image klicken.


derKopf - Di 06.12.05 22:14

Danke für deine Antwort, aber das funktioniert nicht so ganz, also den vergleich hab ich genauso geschrieben wie du, tut sich aber nix, das liegt aber daran das mein timer dauerhaft enebled ist...weil er ja noch datum und uhrzeit in den labels anzeigen muss....hehe man ist das verworren ;-)


derKopf - Di 06.12.05 22:41

Hier mal die Button und Timer Procedure von Form1.....




Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
//Uhrzeit und Datum anzeigen****************************************************
procedure TForm1.Timer1Timer(Sender: TObject);

var
  ATime: TDateTime;
  ADate: TDateTime;
begin
      Label7.Caption:= Timetostr(Time);
      Label9.Caption:= Datetostr(Date);

//Wenn Zeit erreicht
 if (ATime = Time) then
 if  (ADate = Date) then
    begin
    Form2.ShowModal
    end;
end;


//Weckzeit und Datum************************************************************
procedure TForm1.Button1Click(Sender: TObject);
var
  ATime: TDateTime;
  ADate: TDateTime;

begin
      ATime := StrToTime(Edit1.Text);
      ADate := StrToDate(Edit2.Text);
if    ATime > Time then
if    ADate >= Date then
      ShowMessage('Wecker eingestellt')
else
      ShowMessage('Ungültige Zeit/Datum');
end;


Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.


alzaimar - Mi 07.12.05 17:00

Die Bedingung

Delphi-Quelltext
1:
If (aTime=Time) and (aDate=Date)                    

ist nun mal nicht erfüllt, denn dann müsste der Timer just genau in der Sekunde aufgerufen werden... manchmal klappt das und manchmal eben nicht...

Wann soll den die Form aufgerufen werden?
Wenn z.B. die Weckzeit überschritten wurde(!), dann aber nur 1x.

Deine Programmlogik ist einfach falsch...


P_G - Mi 07.12.05 17:07

Hi,

1. In welcher Weise gibst du Datum und Uhrzeit in die Editfenster ein?
Dummes Beispiel: '17 Uhr' wird sicher nie zu einem positiven Vergleich mit TDateTime führen. D.h. der eingegebene String muß der TDateTime Konvention entsprechen.

2. Woran koppelst du den Start der mp3-Datei? Wenn du es an OnActivate von Form2 setzt, sollte es eigentlich gehen...

Gruß, P_G


Tino - Mi 07.12.05 17:15
Titel: Re: Logikproblem
Hallo!

user profile iconderKopf hat folgendes geschrieben:
Mein anderes Problem ist das Direkte öffnen des Liedes in Form2, ich kriegs von der Logik einfach nicht gebacken das sich das automatisch mit Form2 öffnet....ich muss immer erst auf nen Label klicken oder mir wird ne Fehlermeldung, von wegen Dateinamensende nicht gefunden oder so angezeigt....


Bitte erstelle für jede Frage ein eigenes Topic in der richtigen Sparten! Danke!

Gruß
Tino


smiegel - Do 08.12.05 10:30

Hallo,

Dein Problem besteht darin, dass Du die Zeitwerte so einfach nicht vergleichen kannst, weil dort Millisekunden enthalten sind. Ich kann mir nur schwer vorstellen, dass ein Timer auf die Millisekunde genau aufgerufen wird.

Um das Problem zu umgehen, musst Du den Zeitwert vorher umwandeln, um die Millisekunden weg zu bekommen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var std1, min1, min1, ms1, 
    std2, min2, sek2, ms2  :Word;
...
...
  DecodeTime(Time, std1, min1, sek1, ms1);
  DecodeTime(aTime, std2, min2, sek2, ms2);
  if (Date=aDate) and ((sdt1=std2) and (min1=min2) and (sek1=sek2)) then Form2.ShowModal;
...
...


derKopf - Do 08.12.05 16:02

Hi,
danke für die ganzen Antworten und Hilfestellungen, aber es kommt immer wieder die selbe Fehlermeldung. Hab das gefühl der Mediaplayer kann Mp3´s nicht von alleine abspielen bzw. durch ein Event oder sonstiges starten...Im anhang ist die Fehlermeldung, die erscheint, wenn ich den MP in jeglicher Art automatisch starten lasse...hoffe jemand weiss weiter.

@smiegel

Dein Vergleich funktioniert aber leider auch nicht... :(


Tino - Do 08.12.05 17:01

@derKopf: In diesem Topic bitte nur das Problem "Zwei Datum- und Zeitwerte vergleichen" diskutuieren. Alles andere gehört in einem neuen Topic!


derKopf - Do 08.12.05 22:19

Zitat:
@derKopf: In diesem Topic bitte nur das Problem "Zwei Datum- und Zeitwerte vergleichen" diskutuieren. Alles andere gehört in einem neuen Topic!


Ok werde mich dran halten! Aber dann direkt zurück zu dem Problem; schmiegel dein Versuch mit dem vergleich funktioniert leider auch nicht. Hat noch jemand anders eine idee?


Blackheart666 - Do 08.12.05 22:30

Es gäbe noch eine Möglichkeit, Du vergleichst die Zeit <> als dann ist das ohne weiteres zu machen.
Und bei einenem Wecker kommt es auf ne' sec bestimmt nicht an.


derKopf - Fr 09.12.05 10:08

Meinst du anstatt des Gleichheitszeichens, "< >" oder was? Kannst mir mal nen Beispiel geben? hab das so versucht aber er macht trotzdem wieder nichts...


Miri - Fr 09.12.05 10:35

Setz mal


Delphi-Quelltext
1:
if aktuelle zeit > Weckzeit                    


Damit läuft dein Timer und sobald das Intervall ausgelöst wird und die Weckzeit überschritten ist (was bei einem entsprechenden Intervall keine große Verzögerung sein dürfte), wird der Wecker gestartet... Damit musst du nicht auf ne Millisekunde genau die Weckzeit treffen...


Blackheart666 - Fr 09.12.05 10:44

In Etwa So...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if FormatDateTime('hh:mm:ss',Time)>'09:40:00' then
  Caption:='Es ist 9:40 Uhr';
  if FormatDateTime('hh:mm:ss',Time)>'09:41:00' then
  Caption:='Es ist 9:41 Uhr';
end;


mehmeh - Fr 09.12.05 10:49

das heißt aber das wenn der wecker ca 7 Uhr angehen soll und du den PC erst 8 Uhr einsachltest, das der wecker trotzdem angeht, weil 8 Uhr größer als 7 ist


Blackheart666 - Fr 09.12.05 10:59

Sollte ja nur ein Bsp.sein das kann Er doch überprüfen ist Systemzeit > als Weckzeit + 1 min bleib ruhig.


mehmeh - Fr 09.12.05 12:05

wie machst du es denn nu


Miri - Fr 09.12.05 12:23

user profile iconmehmeh hat folgendes geschrieben:
das heißt aber das wenn der wecker ca 7 Uhr angehen soll und du den PC erst 8 Uhr einsachltest, das der wecker trotzdem angeht, weil 8 Uhr größer als 7 ist


Man kann ja auch ein Intervall eingeben sprich aktuelle zeit > weckzeit und aktuelle zeit < weckzeit + ne minute

Es ging doch nur ums Prinzip... und außerdem... wenn ich mir nen Wecker stelle, sorge ich auch dafür, dass Batterien drin sind, sonst weckt der mich nämlich auch nich... (sprich, wenn man sich nen Wecker stellt, sollte man auch dafür sorgen, dass er zu der entsprechenden Zeit funktionstüchtig ist ;) )


derKopf - Fr 09.12.05 16:50

Hi, sorry Leute das ich nicht so schnell antworte, aber hatte nur die ersten beiden Stunden Informatik, danach normal Schule.....naja aber anscheinend bin ich zu doof, es will immer noch nicht funktionieren, hier mein Quelltext:


//Uhrzeit und Datum anzeigen****************************************************
procedure TForm1.Timer1Timer(Sender: TObject);

var
ATime: TDateTime;
ADate: TDateTime;
begin
Label7.Caption:= Timetostr(Time);
Label9.Caption:= Datetostr(Date);

//Wenn Zeit erreicht
if (ATime > Time) and
(ADate = Date) then
begin
Form2.ShowModal
end;
end;


//Weckzeit und Datum************************************************************
procedure TForm1.Button1Click(Sender: TObject);
var
ATime: TDateTime;
ADate: TDateTime;

begin
ATime := StrToTime(Edit1.Text);
ADate := StrToDate(Edit2.Text);
if (ATime > Time) and
(ADate >= Date) then
ShowMessage('Wecker eingestellt')
else
ShowMessage('Ungültige Zeit/Datum');
end;


Blackheart666 - Fr 09.12.05 17:28

Ich hab jezt mal angenommen die Form2 soll angezeigt werden wenn die zeit erreicht ist...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
var
  Form1: TForm1;
  ADate,ATime: TDateTime;
implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label1.Caption:= Timetostr(Time);
  Label2.Caption:= Datetostr(Date);
  ATime := StrToTime(Edit1.Text); // Das hat gefehlt
  ADate := StrToDate(Edit2.Text); // Das hat gefehlt
   if (Time >ATime) and (Date =ADate) then // Hier war ein Dreher bei Dir
 begin
  Timer1.Enabled:=False;
  Form2.Show;
 end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
   ATime := StrToTime(Edit1.Text);
   ADate := StrToDate(Edit2.Text);
   if (ATime > Time) and (ADate >= Date) then
   ShowMessage('Wecker eingestellt')
   else
   ShowMessage('Ungültige Zeit/Datum');
end;


end.


Blackheart666 - So 11.12.05 00:24

Immer noch zu Hoch ? ... dann lass es einfach ...