![]() |
Differenz 2erDatum in Tmemo
Delphi-Quellcode:
der hintergrund ist das ich die differenz beider daten
var zeit1,zeit2:TTime;
Pufferhours,Pufferminutes,Pufferseconds:integer; ... zeit1:=(Now); zeit2:=strtotime(wecktime); Pufferhours:= HoursBetween(zeit1,Zeit2); Pufferminutes:= MinutesBetween(zeit1,Zeit2); Pufferseconds:= SecondsBetween(zeit1,Zeit2); //erst mal als idee um die zeitdifferenz zu sehen label7.Caption:=inttostr(Pufferhours)+':'+ inttostr(Pufferminutes)+':'+ inttostr(Pufferseconds); //irgendwie funzt das noch nicht in ein 4-stelliges tmemo basteln möchte. also wie ein countdown Zitat:
![]() und wie mach ich das mit dem tmemo? |
Re: Differenz 2erDatum in Tmemo
Zitat:
Bei dem Topic gibt es ja viele Funktionen... Wenn du was in eine Memo einfügen willst, dann wandle es in einen String um (DateToStr(..)) und dann füg das ein (Bsp: Memo1.lines.Add(DateToStr(variable)) |
Re: Differenz 2erDatum in Tmemo
naja ich will in dem memo die zeitdifferenz von wecktime und realer time wiedergeben.
wenn z.b. die weckzeit in 5min ist, dann soll der das so in die 4tmemos schreiben: 05:00 04:59... until 00:00 jo habs hier im letzten eintrag gefunden: ![]() |
Re: Differenz 2erDatum in Tmemo
Hallo danku,
vielleicht hilft dir auch der folgende Code:
Delphi-Quellcode:
Gruß Hawkeye
procedure Demo;
var Wecken : TDateTime; Restzeit : Real; s : string; begin Wecken := Today + StrToTime('17:00'); Restzeit := Wecken - Now; if (Restzeit < 0) then s := 'abgelaufen vor %d Tag(en) %s Stunden' else s := 'noch %d Tag(e) %s Stunden'; ShowMessage (Format(s, [Trunc(Abs(Restzeit)), TimeToStr(Frac(Restzeit))])); end; |
Re: Differenz 2erDatum in Tmemo
das steht in dem timer:
(update)
Delphi-Quellcode:
Das geht fast einwandfrei. Den ersten Part der TRadiogroup muss ich demnächst noch bearbeiten.
WeckTime:= edhours.Text + ':' + edmin.Text + ':' + edseconds.Text ;
WeckDate:= cbdatum.Text; } //**********Dauer vorgegeben if rgeins.Checked then if not canvas.TextWidth(edzeit.Text)>1 then edzeit.setfocus else if canvas.TextWidth(edzeit.text)>1 then if cbsignal.Checked=false then begin // opendialog1.Execute; cbsignal.checked:=true; timer.Enabled:=true; end else timer.Enabled:=true; //**********FESTE UHRZEIT if rgzwei.Checked then if cbsignal.checked=false then begin cbsignal.checked:=true; end; if TimeToStr(Now) =WeckTime then begin fileopen:= Label2.caption; With MediaPlayer1 do begin Filename := opendialog1.filename; Open; Play; timer.Enabled:=false; end; end; //************BUFFER IN MEMO DecodeTime(Time, aStd, aMin, aSec, aMsec); //now := Timetostr(Time); Uhrzeit_Ende := strtoTime(Wecktime); Wecktime:=Timetostr(Uhrzeit_Ende); Uhrzeit_Verbleib := Time - Uhrzeit_ende; Buffer := timetostr(Uhrzeit_Verbleib); if Uhrzeit_Ende > Time then begin Std := copy(Buffer, 1,2); Min := copy(Buffer, 4,2); Sec := copy(Buffer, 7,2); bsec := strtoint(Sec) +1; mehours.text:=std; memin.Text:=min; meseconds.text:=inttostr(bsec); end else begin Std := copy(Buffer, 1,2); Min := copy(Buffer, 4,2); bstd := 23-strtoint(std); bmin := 59-strtoint(min); if asec >0 then bsec := 60-asec else bsec := 0; mehours.text:=inttostr(bstd); memin.Text:=inttostr(bmin); meseconds.text:=inttostr(bsec); end; mir gehts darum, das die weckzeit mit dem weckdatum übereinstimmt. mein vorschlag war:
Delphi-Quellcode:
da gibts aber eine fehlermeldung.
if TimeToStr(Now) =strtodate(WeckTime + WeckDatum) then begin
kann es vll. auch an
Delphi-Quellcode:
liegen?
if Uhrzeit_Ende > Time then...
|
Re: Differenz 2erDatum in Tmemo
hat einer einen vorschlag? :gruebel:
|
Re: Differenz 2erDatum in Tmemo
Zitat:
Du willst eine String (TimeToStr) mit einem Datum (TDatTime) vergleichen
Delphi-Quellcode:
Wobei Du auf das Datumformat in strToDateTime achten mußt.
if now >= strToDateTime(WeckTime + WeckDatum) then
begin end; Aus der Hilfe: Zitat:
Klaus |
Re: Differenz 2erDatum in Tmemo
Delphi-Quellcode:
ist vom ansatz her i.o. aber das now hat trotzdem zu der rechte seite (>=) einen zeitkompalierfehler. *wortneuschöpfung :roll:
if now >= strToDateTime(WeckTime + WeckDatum) then
fehlermeldung: *ist keine gültige datums und urhzeitangabe* WeckTime:= edhours.Text + ':' + edmin.Text + ':' + edseconds.Text ; WeckDate:= cbdatum.Text; //die combobox is stressing ... |
Re: Differenz 2erDatum in Tmemo
Andere Reihenfolge und ein Leerzeichen:
Delphi-Quellcode:
Grüße vom marabu
if now >= strToDateTime(WeckDatum + ' ' + WeckTime) then
|
Re: Differenz 2erDatum in Tmemo
das passt aber mit dem datum immer noch nicht richtig.
wenn das weckdate (bsp: 06:45:00) ist und die relle zeit 14:15, dann nimmt der ja anhand
Delphi-Quellcode:
automatisch den nächsten tag an und in den tmemo (3 felder in stunden, minuten, sekunden)
now >= strToDateTime(WeckDatum + ' ' + WeckTime)
wird die differenz geschrieben, aber sobald man eben nicht das datum von morgen sondern bspw. erst in 3tagen auswählt, berechnet der immer nur die differenz zum nächsten tag. :gruebel: vll. muesste ich WeckDate:= cbdatum.Text; anders definieren. |
Re: Differenz 2erDatum in Tmemo
hab das problem weckzeit in abhängigkeit vom weckdatum schon seit tagen versucht zu lösen und probiert.
obwohl ich dem timer zuweise:
Delphi-Quellcode:
wird wenn das weckdate kleiner als die reale zeit ist, immer nur von einem tag ausgegangen.
WeckTime:= edhours.Text + ':' + edmin.Text + ':' + edseconds.Text ;
WeckDate:= cbdatum.Text; if TimeToStr(Now) =WeckTime then begin //now >= strToDateTime(WeckTime + WeckDate) selbst geht auch nicht für mein prob ... DecodeTime(Time, aStd, aMin, aSec, aMsec); //now := Timetostr(Time); Uhrzeit_Ende := strtoTime(Wecktime); Wecktime:=Timetostr(Uhrzeit_Ende); Uhrzeit_Verbleib := Time - Uhrzeit_ende; Buffer := timetostr(Uhrzeit_Verbleib); if Uhrzeit_Ende > Time then begin... else begin ... in klartext: weckzeit: 06:45:00 //vom user eingestellt über 3 editfelder weckdate: 02.06.06 dann geben die 3editfelder den countdown für die differenz von 18:1:00 aus. // nur als richtwert. sobald jetzt aber das weckdate auf 03.06.06 gesetzt wird, kommt das selbe wie oben also 18:1:00 differenz aus. kann mir einer helfen? |
Re: Differenz 2erDatum in Tmemo
Zitat:
Gruß Hawkeye |
Re: Differenz 2erDatum in Tmemo
Hallo.
Du hast einen dicken Fehler in deiner Rechnung:
Delphi-Quellcode:
Du rechnest hier mit TDateTime-Werten. Diese Werte geben den Zeitabstand zu einem Referenzdatum in Tagen an. Nur mit den Uhrzeitanteilen -- Time und UhrzeitEnde sind Werte kleiner 1 -- rechnest du effektiv mit einer Uhrzeit am 30. Dez 1899, was gewiss nicht dein Wunsch ist. Um den zeitlichen Abstand zwischen zwei Zeitpunkten zu bestimmen müssen unbedingt beide Zeitpunkte auf das gleiche Referenzdatum normiert sein.
Uhrzeit_Verbleib := Time - Uhrzeit_ende;
Du darfst also nicht Time (0.75 = 18 Uhr), sondern musst Now (38869.75 = heute 18 Uhr) als Minuend verwenden. Aus gleichem Grund musst du beim Subtrahend (UhrzeitEnde) mit der Kombination von WeckDatum und WeckZeit rechnen (UhrzeitEnde := StrToDate(WeckDatum) + StrToTime(WeckTime) // nur zur Verdeutlichung). Bei der Differenz darfst du dann allerdings auch Werte größer als 1 erwarten, die dann einen Zeitraum angeben. Der Wert vor dem Komma repräsentiert die Tage, der Wert nach dem Komma den Bruchteil eines Tages. Bei der Darstellung von Zeiträumen Größer oder gleich 1 versagt TimeToStr(), aber du kannst statt dessen die Funktion ![]() Freundliche Grüße vom marabu |
Re: Differenz 2erDatum in Tmemo
Also würdest du das so machen?
Delphi-Quellcode:
man kann die datetimetostr2 doch auch anders machen?... function DateTimeToStr2(dt: TDateTime; daySep: string): string; begin Result := Format('%d%s%s', [Trunc(dt), daySep, TimeToStr(dt)]) end; begin WeckTime:= edhours.Text + ':' + edmin.Text + ':' + edseconds.Text ; WeckDate:= cbdatum.Text; DecodeTime(Time, aStd, aMin, aSec, aMsec); Uhrzeit_Ende := StrToDate(WeckDate) + StrToTime(WeckTime); Wecktime:=Timetostr(Uhrzeit_Ende); Uhrzeit_Verbleib := Now - Uhrzeit_ende; DateTimeToStr2(Uhrzeit_Verbleib,WeckTime); //parameter funzen aber nich 100% Buffer := timetostr(Uhrzeit_Verbleib); if Uhrzeit_Ende > Time then begin Std := copy(Buffer, 1,2); Min := copy(Buffer, 4,2); Sec := copy(Buffer, 7,2); bsec := strtoint(Sec) +1; mehours.text:=std; memin.Text:=min; meseconds.text:=inttostr(bsec); end else begin Std := copy(Buffer, 1,2); Min := copy(Buffer, 4,2); bstd := 23-strtoint(std); bmin := 59-strtoint(min); if asec >0 then bsec := 60-asec else bsec := 0; mehours.text:=inttostr(bstd); memin.Text:=inttostr(bmin); meseconds.text:=inttostr(bsec); end; ... //einen tag höher setzen if (Wecktime) < TimeToStr(now) then cbdatum.ItemIndex:= 1; Problem aber weiterhin Weckzeit in Abhängigkeit vom Weckdatum |
Re: Differenz 2erDatum in Tmemo
Hallo Daniel,
ich würde es so oder ähnlich machen - nur den Rechenteil, nicht die Ablaufsteuerung:
Delphi-Quellcode:
Freundliche Grüße vom marabu
procedure TDemoForm.???
var dtAlarm: TDateTime; begin dtAlarm := StrToTime(edhours.Text + ':' + edmin.Text + ':' + edseconds.Text) + StrToDate(cbdatum.Text); if Now < dtAlarm then ShowRemainingTime(dtAlarm); end; procedure TDemoForm.ShowRemainingTime(dtAlarm: TDateTime); var s: String; dtRemaining: TDateTime; hours, mins, secs, msecs: Word; begin // DecodeTime(Time, aStd, aMin, aSec, aMsec); // Uhrzeit_Ende := StrToDate(WeckDate) + StrToTime(WeckTime); // Wecktime := Timetostr(Uhrzeit_Ende); // Uhrzeit_Verbleib := Now - Uhrzeit_ende; dtRemaining := dtAlarm - Now; DecodeTime(dtRemaining, hours, mins, secs, msecs); hours := hours + 24 * Trunc(dtRemaining); meHours.Text := IntToStr(hours); meMin.Text := IntToStr(mins); meSeconds.Text := IntTostr(secs); { Buffer := timetostr(Uhrzeit_Verbleib); if Uhrzeit_Ende > Time then begin Std := copy(Buffer, 1,2); Min := copy(Buffer, 4,2); Sec := copy(Buffer, 7,2); bsec := strtoint(Sec) +1; mehours.text := std; memin.Text := min; meseconds.text := inttostr(bsec); end else begin Std := copy(Buffer, 1,2); Min := copy(Buffer, 4,2); bstd := 23-strtoint(std); bmin := 59-strtoint(min); if asec > 0 then bsec := 60-asec else bsec := 0; mehours.text := inttostr(bstd); memin.Text := inttostr(bmin); meseconds.text := inttostr(bsec); end; } end; |
Re: Differenz 2erDatum in Tmemo
hm so geht das.
bissel kürzer und effektiver. danke |
Re: Differenz 2erDatum in Tmemo
ich hab noch in der showremainingtime procedure
das dazugefügt:
Delphi-Quellcode:
wieso wird dann aber nicht wenn die verbleibende zeit und die reale zeit gleich null sind
if Now =(dtRemaining) then begin
fileopen:= Label2.caption; With MediaPlayer1 do begin Filename := opendialog1.filename; Open; Play; die datei abgespielt? |
Re: Differenz 2erDatum in Tmemo
Hallo Daniel,
die reale Zeit (Now) wird wohl in absehbarer Zeit nicht Null werden. Probiere es mal so:
Delphi-Quellcode:
Grüße vom marabu
begin
if dtRemaining < 0 then begin fileopen:= Label2.caption; with MediaPlayer1 do begin Filename := OpenDialog1.Filename; Open; Play; // ... |
Re: Differenz 2erDatum in Tmemo
das geht aber nicht in deiner prozedur ..ShowRemainingTime(dtAlarm: TDateTime);
|
Re: Differenz 2erDatum in Tmemo
Warum nicht?
marabu |
Re: Differenz 2erDatum in Tmemo
das lied wird nicht geladen.
sobald ich
Delphi-Quellcode:
außerhalb schreib
if dtRemaining ..
Delphi-Quellcode:
,
if Now < dtAlarm then
ShowRemainingTime(dtAlarm); if dtRemaining... wirkt der timer auf die memofelder immer als 0. (also die memofelder haben einen 0-wert |
Re: Differenz 2erDatum in Tmemo
Ist vielleicht besser, wenn du deinen Code in der Prozedur unterbringst, welche ShowRemainingTime() aufruft:
Delphi-Quellcode:
Gute Nacht
procedure TDemoForm.SingHaleluja;
begin fileopen := Label2.caption; // ?? with MediaPlayer1 do begin Filename := OpenDialog1.Filename; Open; Play; end; end; procedure TDemoForm.??? var dtAlarm: TDateTime; begin dtAlarm := StrToTime(edhours.Text + ':' + edmin.Text + ':' + edseconds.Text) + StrToDate(cbdatum.Text); if Now < dtAlarm then ShowRemainingTime(dtAlarm) // es hat noch Zeit else SingHaleluja; // jetzt randalieren end; marabu |
Re: Differenz 2erDatum in Tmemo
hm. ich habe ein problem wenn die real-time vor 24:00 (00:00) ist und der benutzer als weckzeit bspw. 00:30 einstellt. wie kann ich das problem wo in der methode lösen?
Delphi-Quellcode:
procedure Tfmclock.timerzeitTimer(Sender: TObject);
... //////// ZEITDAUER IN MIN/////////////////////////////////////// procedure ShowRemainingTime2(dtAlarm2: TDateTime); var s: String; dtRemaining2: TDateTime; hours2, mins2, secs2, msecs2: Word; begin // DecodeTime(Time, aStd, aMin, aSec, aMsec); // Uhrzeit_Ende := StrToDate(WeckDate) + StrToTime(WeckTime); // Wecktime := Timetostr(Uhrzeit_Ende); // Uhrzeit_Verbleib := Now - Uhrzeit_ende; dtRemaining2:= dtAlarm2 - Now; DecodeTime(dtRemaining2, hours2, mins2, secs2, msecs2); hours2 := hours2 + 24 * Trunc(dtRemaining2); meHours.Text := IntToStr(hours2); meMin.Text := IntToStr(mins2); meSeconds.Text := IntTostr(secs2); end; begin ... |
Re: Differenz 2erDatum in Tmemo
Hallo Daniel,
vielleicht reicht dir schon das:
Delphi-Quellcode:
Grüße vom marabu
dtRemaining2 := dtAlarm2 - Now;
if dtRemaining2 < 0 then dtRemaining2 := dtRemaining2 + 1; |
Re: Differenz 2erDatum in Tmemo
schön wärs aber passt leider nicht.
sobald die stunden-anzeige über '00':'00':'00' geht, tut sich nichts. ich habe im onchange stehen:
Delphi-Quellcode:
denn 24:##:## nimmt der ja eh nicht an
if strtoint(edende.text) =24
then edende.text:='00'; Edit: ich habs gelöst ;) |
Re: Differenz 2erDatum in Tmemo
Vergiss meinen Beitrag #24 - du arbeitest ja mit Datumsanteilen, da geht das so nicht. Der gezeigte Code sollte mit Now = 23:30 (heute) und Alarm = 00:30 (morgen) zurecht kommen. Kann es sein, dass dein Problem irgendwo anders auftritt?
marabu Zitat:
|
Re: Differenz 2erDatum in Tmemo
geht doch noch nicht 100pro,
denn jedesmal springt der sobald es größer 00:00:00 ist, auf 23:##:## zurück. |
Re: Differenz 2erDatum in Tmemo
kann mir einer helfen?
das proggie ist fertig, bis auf das nach 24uhr( 0uhr) problem. |
Re: Differenz 2erDatum in Tmemo
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Daniel,
dein in Beitrag #23 gezeigter Code ist in Ordnung, dein Problem scheint woanders zu liegen. Damit man dir helfen kann, musst du den relevanten Quellcode zeigen, den Input und den (falschen und erwarteten) Output beschreiben. Am Besten klappt das, wenn du deinen Code funktional entworfen hast. Wenn du alles in irgendwelche event handler reinquetschst, dann wird die Beschreibung von Input und Output zu komplex. Grüße vom marabu |
Re: Differenz 2erDatum in Tmemo
ich hab mir mal den bsp.progg heruntergeloadet. du hast mich auf eine idee gebracht.
das mit dem "kalenderblatt" war mir klar. nur wusste ich noch nicht wie diese komponente heißt. ich will ja nichts sagen: aber kann es sein das bei dir ein fehler im code ist? ich habe das mal bei mir getestet und bei mir setzt der countdown nach 4sec aus, d.h. es wird nicht weiter nach unten gezählt
Delphi-Quellcode:
procedure Tfmclock.timerzeitTimer(Sender: TObject);
//////// ZEITDAUER IN MIN/////////////////////////////////////// procedure ShowRemainingTime2(dtAlarm2: TDateTime); var dtRemaining2: TDateTime; h, m, s, ms: Word; begin dtRemaining2 := dtAlarm2 - Now; DecodeTime(dtRemaining2, h, m, s, ms); Inc(h, 24 * Trunc(dtRemaining2)); Caption := Format('%.2d:%.2d:%.2d', [h, m, s]); meHours.Text := IntToStr(h); meMin.Text := IntToStr(m); meSeconds.Text := IntTostr(s); end; ///////////////////////////////////// function RestOfSecond: Word; var h, m, s: Word; begin DecodeTime(Now, h, m, s, Result); end; /////////////////////////////////////// begin if cbsignal.Checked=false then begin timerzeit.Enabled:=false; showmessage('Signaldatei auswählen!'); rgeins.Checked:=true; rgzwei.Enabled:=true end else begin edzeit.enabled:=false; sbzeit.Enabled:=false; with Sender as TTimer do begin Enabled := False; if dtpTime.DateTime > Now then begin ShowRemainingTime2(dtpTime.DateTime); InterVal := RestOfSecond; Enabled := True; end else begin //datei abspielen ... |
Re: Differenz 2erDatum in Tmemo
Zitat:
Zitat:
Mein Konzept in der Demo ist die pauschale Deaktivierung des Timers im Timer-Event und die bedingte Reaktivierung, wenn die Alarmzeit noch nicht erreicht ist. So wie du meinen Code verbaut hast, kommt dieses Konzept nicht mehr richtig zum Tragen. Wenn also dein Countdown nach vier Sekunden stehen bleibt, dann sicher deshalb, weil der Timer nicht mehr reaktiviert wurde. An der Ecke würde ich mal graben. Aber auch eine ungewollte Verkettung von Events könnte die Ursache sein. Du solltest das Programmverhalten vielleicht etwas genauer beschreiben. Gute Nacht marabu |
Re: Differenz 2erDatum in Tmemo
es sieht so aus, als hab ich erst mal ne lösung gefunden.
meld mich dann noch mal. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:49 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