Seite 1 von 1

Funktion zur Zeitdifferenzermittlung

Verfasst: Sa, 27. Aug 2016 17:03
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.. :?

Re: Funktion zur Zeitdifferenzermittlung

Verfasst: Sa, 27. Aug 2016 17:27
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.

Re: Funktion zur Zeitdifferenzermittlung

Verfasst: Sa, 27. Aug 2016 17:33
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.

Re: Funktion zur Zeitdifferenzermittlung

Verfasst: Sa, 27. Aug 2016 17:51
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.

Re: Funktion zur Zeitdifferenzermittlung

Verfasst: Sa, 27. Aug 2016 22:09
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.

Re: Funktion zur Zeitdifferenzermittlung

Verfasst: So, 28. Aug 2016 0:55
von AUGE_OHR
C:\ALASKA\XPPW32\SOURCE\COMPAT\compat87.prg

Re: Funktion zur Zeitdifferenzermittlung

Verfasst: So, 28. Aug 2016 7:49
von Manfred
@Leon,
da wird es wohl hingehen....

@Jimmy,
in wie weit soll mir Dein Hinweis weiterhelfen?

Re: Funktion zur Zeitdifferenzermittlung

Verfasst: So, 28. Aug 2016 17:18
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"

Re: Funktion zur Zeitdifferenzermittlung

Verfasst: So, 28. Aug 2016 17:20
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.

Re: Funktion zur Zeitdifferenzermittlung

Verfasst: Mo, 29. Aug 2016 0:53
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.

Re: Funktion zur Zeitdifferenzermittlung

Verfasst: Fr, 02. Sep 2016 21:10
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

Re: Funktion zur Zeitdifferenzermittlung

Verfasst: Sa, 03. Sep 2016 7:06
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.

Re: Funktion zur Zeitdifferenzermittlung

Verfasst: Sa, 03. Sep 2016 16:10
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) 219-mal heruntergeladen

Re: Funktion zur Zeitdifferenzermittlung

Verfasst: Sa, 03. Sep 2016 20:54
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.

Re: Funktion zur Zeitdifferenzermittlung

Verfasst: Sa, 03. Sep 2016 21:45
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")