Funktion zur Zeitdifferenzermittlung

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Funktion zur Zeitdifferenzermittlung

Beitrag von Manfred »

ich bastel gerade an einer Sache, die mit Zeitberechnungen zu tun hat. Also dachte ich mir, ich baue mir eine Funktion, die eine Startzeit und eine Endzeit bekommt. Also habe ich angefangen. Dann kam mir die Idee, eine universelle Funktion zu bauen. Diese soll dann Startdatum mit Zeit und Endedatum mit Zeit bekommen. Wenn diese Werte vorhanden sind, berechne ich alle Mögliochkeiten die es gibt, also so:
Sekunden, Minuten, Stunden, Tage, Wochen, Monate, Jahre. So weit so gut, aber wie gibt man sowas von der Funktion vernünftig zurück? Es kann sein, das ich mal einen, aber auch mal mehrere Werte benötige. Ich stehe gerade auf dem Schlauch und komme nicht weiter. Vielleicht ist es ja ganz einfach, aber die Umgebungstemperatur ist gerade etwas hoch.. :?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: Funktion zur Zeitdifferenzermittlung

Beitrag von HaPe »

Hallo Manfred !
So weit so gut, aber wie gibt man sowas von der Funktion vernünftig zurück? Es kann sein, das ich mal einen, aber auch mal mehrere Werte benötige.
Einfache Möglichkeit: Parameter die Daten an deine Funktion geben (können) by Referenz übergeben.
Damit kannst du dann auch mehrere Ergebnisse zurückgeben.
Aufwändigere Möglichkeit:
Eine Objektklasse mit einer SET- und GET-Methode: Mittels SET werden 1 bis n Eigenschaften an das Objekt übergeben; diese können dann per GET wieder ausgelesen werden. Deine Funktion gibt dann dieses Objekt zurück und die aufrufende Funktion liest von dort die benötigten Parameter aus.
--
Hans-Peter
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Funktion zur Zeitdifferenzermittlung

Beitrag von Manfred »

an eine Klasse hatte ich auch zuerst gedacht, aber ich wollte eigentlich nur eine Funktion machen. Dan dachte ich an ein Array als Rückgabe, aber damit kann ich mich auch nicht so richtig anfreunden. Jetzt übergebe ich erstmal einen Zusatzparameter in dem steht, was ich haben will an Einzelwert.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: Funktion zur Zeitdifferenzermittlung

Beitrag von HaPe »

Hallo Manfred !
Manfred hat geschrieben:an eine Klasse hatte ich auch zuerst gedacht, aber ich wollte eigentlich nur eine Funktion machen.
Nicht die Datums/Zeit-Funktion soll als Klasse erstellt werden sondern das Übergabe-Objekt selbst ist eine Klasse.
Die Klasse ist individuell für 1 bis n Parameter nutzbar.
Stell dir diese Klasse wie einen Packesel mit 1 bis n Satteltaschen vor. Mittels der SET-Methode füllst du eine Satteltasche und schreibst außen drauf 'Sekunden'; eine weitere Satteltasche füllst du mit den Minuten und schreibst außen 'Minuten' drauf.
Nun übergibts du nicht die 1 bis n Parameter einzeln sondern schickst den Packesel an die gewünschte Funktion oder deine Funktion füllt den Packesel und gibt diesen zurück.
Die Anwende-Syntax (in VFP) sieht so aus.

*-- Parameter-Objekt erstellen und mit Parametern füllen
loParameter = CreateObject( 'stParameter' ) && stParameter ist die entspechende Klasse mit einer SET- und einer GET-Funktion.
loParameter.SET( 'nSeconds', 12 )
loParameter.SET( 'nMinutes', 34 )
loParameter.SET( 'nHours', 6 )

*-- Funktion mit Parameter-Objekt aufrufen; diese gibt wiederum ein Parameter-Objekt mit den Ergebnissen zurück.
loReturn = ManfredsZeitFunktion( loParameter )

*-- Ergebnisse auslesen
? loParameter.GET( 'nMinutes' )

OK, das Parameter-Objekt muß man einmal erstellen kann dann aber überall verwendet werden.
Ein Vorteil ist dabei, dass man die Parameterübergabe bei Erweiterung einer Funktion mit weiteren Parametern nicht an allen Stellen im Programm anpassen muß. Notwendig ist nur das Anpassen/Erweitern der Funktion selbst und der Stelle wo eine weiterer Parameter benötigt wird.
--
Hans-Peter
Leon
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 118
Registriert: Mi, 28. Nov 2007 12:48
Wohnort: Wien
Hat sich bedankt: 5 Mal
Kontaktdaten:

Re: Funktion zur Zeitdifferenzermittlung

Beitrag von Leon »

Manfred hat geschrieben:Dann kam mir die Idee, eine universelle Funktion zu bauen. Diese soll dann Startdatum mit Zeit und Endedatum mit Zeit bekommen. Wenn diese Werte vorhanden sind, berechne ich alle Mögliochkeiten die es gibt, also so:
Sekunden, Minuten, Stunden, Tage, Wochen, Monate, Jahre. So weit so gut, aber wie gibt man sowas von der Funktion vernünftig zurück? Es kann sein, das ich mal einen, aber auch mal mehrere Werte benötige.
Du schreibst eine Funktion, in die Du Startdatum, Startzeit, Endedatum, Endezeit übergibst. In der Funktion berechnest Du die Werte für Sekunden, Minuten, Stunden, Tage, Wochen, Monate, Jahre, schreibst die berechneteten Werte in ein Array und gibst das Array zurück. Aus dem zurückgegebenen Array entnimmst Du dann den/die Werte, die Du benötigst. Ein Array ist die einfachste und schlankste Möglichkeit, mehrere Werte zurückzugeben.
Gruß aus Wien
Leon
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Funktion zur Zeitdifferenzermittlung

Beitrag von AUGE_OHR »

C:\ALASKA\XPPW32\SOURCE\COMPAT\compat87.prg
gruss by OHR
Jimmy
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Funktion zur Zeitdifferenzermittlung

Beitrag von Manfred »

@Leon,
da wird es wohl hingehen....

@Jimmy,
in wie weit soll mir Dein Hinweis weiterhelfen?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Funktion zur Zeitdifferenzermittlung

Beitrag von AUGE_OHR »

Manfred hat geschrieben:@Jimmy,
in wie weit soll mir Dein Hinweis weiterhelfen?
da sind doch die "Zeit" Berechnungen drin ...

aber wenn du "mehr" willst das würde ich die "Systemtime" Structure benutzen um damit zu "rechnen"
gruss by OHR
Jimmy
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Funktion zur Zeitdifferenzermittlung

Beitrag von Manfred »

ich möchte wenn dann generell alles berechnen können, also Tagwechsel usw. und dann ermitteln wieviel Stunden Minuten Sekunden usw. Ich baue gerade was zusammen, mal sehen ob es meinen Wünschen genügt.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Funktion zur Zeitdifferenzermittlung

Beitrag von AUGE_OHR »

Manfred hat geschrieben:ich möchte wenn dann generell alles berechnen können, also Tagwechsel usw. und dann ermitteln wieviel Stunden Minuten Sekunden usw. Ich baue gerade was zusammen, mal sehen ob es meinen Wünschen genügt.
wie schon gesagt bei "mehr" sollte man auf die Windows Structure SYSTEMTIME zurückgreifen.
https://msdn.microsoft.com/de-de/librar ... s.85).aspx
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
in der DXE LIB gibt es ein Demo für MONTHCAL_CLASS ("SysMonthCal32") welches mit der Structure arbeitet.
üblicherweise würde man mit der Maus der Startpunkt anklicken und beim loslassen wäre der Endpunkt.

klar kannst du ihm die beiden Werte selbst zuweisen ohne eine Anzeige des Calender ;)

Code: Alles auswählen

INLINE METHOD SetDateTime(cDateTime)
LOCAL st := SYSTEMTIME():NEW()
LOCAL nRet := 0
LOCAL nKW  := 0

   nKW  := WeekOf( cDateTime )

   st:wYear         := VAL( SUBSTR(cDateTime, 1,4) )
   st:wMonth        := VAL( SUBSTR(cDateTime, 5,2) )
   st:wDay          := VAL( SUBSTR(cDateTime, 7,2) )
   st:wDayOfWeek    := nKW
   st:wHour         := VAL( SUBSTR(cDateTime, 9,2) )
   st:wMinute       := VAL( SUBSTR(cDateTime,11,2) )
   st:wSecond       := VAL( SUBSTR(cDateTime,13,2) )
   st:wMilliseconds := 0

// nRet := @user32:SendMessageA(::hDPick,DTM_SETSYSTEMTIME,GDT_VALID,st)
// new by Pablo
   nRet := ::dp_DateTime_SetSystemtime(::hDPick,GDT_VALID,st)

RETURN nRet

// http://msdn.microsoft.com/en-us/library/bb761813%28v=VS.85%29.aspx
INLINE METHOD dp_DateTime_SetSystemtime(hdp, gd, pst)
   RETURN <DTM_SETSYSTEMTIME>["__bo__hw__sl__sl__pt"]( gd, pst)
wenn du es auch für verschiedene Zeitzonen benötigst hätte ich noch meine TIMEZONE App anzubieten.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Funktion zur Zeitdifferenzermittlung

Beitrag von AUGE_OHR »

und ... was ist daraus geworden ?

habe mal bei Pablo nachgefragt was in seiner Class FILETIME64 steckt.

Code: Alles auswählen

#include "OT4XB.CH"

PROCEDURE MAIN()
LOCAL st1  := FileTime64():NEW()
LOCAL st2  := FileTime64():NEW()
LOCAL st3

   st1:SetDateTime( DATE()    , TIME()     )
   st2:SetDateTime( DATE()+99 , "23:59:00" )

   // Differenz in Sekunden
   st3 := ft64_ElapSeconds(st1,st2)
? st3/60/60/24
    WAIT
RETURN
wenn das nicht exakt genug ist gibt es auch

Code: Alles auswählen

ft64_ElapMilliSeconds(pft,pft2)
Return elapsed time betwen pft and pft2 in milliseconds
gruss by OHR
Jimmy
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Funktion zur Zeitdifferenzermittlung

Beitrag von Manfred »

hm,
zu Filetime habe ich nichts in der Hilfe gefunden. Ist das schon länger drin, oder habe ich nicht die aktuelle DLL? Klingt aber gut.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Funktion zur Zeitdifferenzermittlung

Beitrag von AUGE_OHR »

Manfred hat geschrieben:zu Filetime habe ich nichts in der Hilfe gefunden. Ist das schon länger drin, oder habe ich nicht die aktuelle DLL? Klingt aber gut.
hier ein PDF von Pablo
ot4xb-wiki -docs - FILETIME64.pdf
(184.81 KiB) 218-mal heruntergeladen
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Funktion zur Zeitdifferenzermittlung

Beitrag von brandelh »

Manfred hat geschrieben:hm,
zu Filetime habe ich nichts in der Hilfe gefunden. Ist das schon länger drin, oder habe ich nicht die aktuelle DLL? Klingt aber gut.
Die Classe und die Methode heißen FILETIME64 bei Pablo, irgendein Namenskonflikt.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Funktion zur Zeitdifferenzermittlung

Beitrag von AUGE_OHR »

brandelh hat geschrieben:irgendein Namenskonflikt.
Ja ... in den Tools gibt es eine Function FILETIME(), deshalb hat Pablo die CLASS umbenannt.

Anmerkung : obwohl die CLASS auch "milliseconds" hat sollte man die nicht für < 1Sec. verwenden.
dafür gibt es die API Function GetTickCount()

Code: Alles auswählen

nTicks := DllCall("Kernel32.dll",DLL_STDCALL,"GetTickCount")
gruss by OHR
Jimmy
Antworten