Funktion zur Zeitdifferenzermittlung

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

Moderator: Moderatoren

Funktion zur Zeitdifferenzermittlung

Beitragvon Manfred » Sa, 27. Aug 2016 16:03

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 Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Manfred
Foren-Moderator
Foren-Moderator
 
Beiträge: 16097
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: Funktion zur Zeitdifferenzermittlung

Beitragvon HaPe » Sa, 27. Aug 2016 16:27

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
HaPe
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 149
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz

Re: Funktion zur Zeitdifferenzermittlung

Beitragvon Manfred » Sa, 27. Aug 2016 16:33

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 Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Manfred
Foren-Moderator
Foren-Moderator
 
Beiträge: 16097
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: Funktion zur Zeitdifferenzermittlung

Beitragvon HaPe » Sa, 27. Aug 2016 16:51

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
Benutzeravatar
HaPe
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 149
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz

Re: Funktion zur Zeitdifferenzermittlung

Beitragvon Leon » Sa, 27. Aug 2016 21:09

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
Leon
UDF-Programmierer
UDF-Programmierer
 
Beiträge: 74
Registriert: Mi, 28. Nov 2007 12:48
Wohnort: Wien

Re: Funktion zur Zeitdifferenzermittlung

Beitragvon AUGE_OHR » Sa, 27. Aug 2016 23:55

C:\ALASKA\XPPW32\SOURCE\COMPAT\compat87.prg
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10211
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Funktion zur Zeitdifferenzermittlung

Beitragvon Manfred » So, 28. Aug 2016 6:49

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

@Jimmy,
in wie weit soll mir Dein Hinweis weiterhelfen?
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Manfred
Foren-Moderator
Foren-Moderator
 
Beiträge: 16097
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: Funktion zur Zeitdifferenzermittlung

Beitragvon AUGE_OHR » So, 28. Aug 2016 16:18

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
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10211
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Funktion zur Zeitdifferenzermittlung

Beitragvon Manfred » So, 28. Aug 2016 16:20

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 Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Manfred
Foren-Moderator
Foren-Moderator
 
Beiträge: 16097
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: Funktion zur Zeitdifferenzermittlung

Beitragvon AUGE_OHR » So, 28. Aug 2016 23:53

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/library/windows/desktop/ms724950(v=vs.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: 10211
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Funktion zur Zeitdifferenzermittlung

Beitragvon AUGE_OHR » Fr, 02. Sep 2016 20:10

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
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10211
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Funktion zur Zeitdifferenzermittlung

Beitragvon Manfred » Sa, 03. Sep 2016 6:06

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 Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Manfred
Foren-Moderator
Foren-Moderator
 
Beiträge: 16097
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: Funktion zur Zeitdifferenzermittlung

Beitragvon AUGE_OHR » Sa, 03. Sep 2016 15:10

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) 21-mal heruntergeladen
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10211
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Funktion zur Zeitdifferenzermittlung

Beitragvon brandelh » Sa, 03. Sep 2016 19:54

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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13332
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: Funktion zur Zeitdifferenzermittlung

Beitragvon AUGE_OHR » Sa, 03. Sep 2016 20:45

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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10211
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg


Zurück zu Programmierung allgemein

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast