Newsgroup: it.comp.lang.delphi
Titolo: TDateTime

Ciao a tutti,
Ho realizzato un'applicazione che conta il tempo che l'utente trascorre in
Internet.
In tutte le varie funzioni e procedure per il calcolo del tempo ho usato il
type TDateTime. Tuttavia, questo non ammette valori maggiori di 24 per le
ore! Qualcuno di voi sa se esiste un altro type analogo (che possa contenere
per le ore un valore maggiore di 24) che possa usare e che mi eviti di
riscrivere le procedure?
Grazie CIAO

 ha scritto nel messaggio
news:PL%M8.19778$TS.6...@news1.tin.it...


 di 24 per le ore!
Se ti riferisci al fatto che, se usi DecodeTime, per l'ora non ti restituisce valori > 24,
è vero. Però basta che tu sappia che un TDateTime altro non è che un numero frazionale, e
la sua parte intera è il numero di giorni.
Quindi:
 dOre := dOre + (Trunc(dDiff) * 24);
dove dDiff è la differenza fra una data e l'altra, e dOre è stato ricavato con DecodeTime.
--
Jax

"Jax" <rispo...@newsgroup.grazie> ha scritto nel messaggio
news:Rr1N8.30398$86.7...@twister1.libero.it...
Forse nn mi sono spiegata bene.
Ad esempčio nel mio prog c'e una funzione che calcola la la somma di una
sequenza di tempi(hh.mm.ss) in DateTime e restituisce il valore in DateTime.
Se la somma dei tempi ha un numero di ore maggiore di 24 il programma si
blocca!
Ho bisogno di un type analogo al TDateTime (cioč che mi permetta di
continuare ad usare le varie routine di Delphi) ma che nello stesso tempo mi
permetta di usare tempi con numero di ore maggiore di 24.
Tutto chiaro?
Grazie ciao

 Tutto chiaro?
No.
TDateTime funziona e bene. Posta il codice.

 il programma si blocca!
Forse non mi sono spiegato bene io. Se tu hai un TDateTime, anche se tu lo conteggi solo
come hh:mm:ss, lui contiene anche le informazioni sui giorni, che come ti ho detto, è la
parte intera di un TDateTime.
Per esempio:
 tempo1 := EncodeTime(14, 43, 00, 00);
 tempo2 := EncodeTime(16, 20, 00, 00);
 tempo3 := tempo1 + tempo2;
Se fai una semplice somma di questi due valori, otterrai 07:03 e non 31:03... perché come
dici tu un TDateTime non può contenere più di 24 ore: però tempo3 contiene 1 giorno!
Quindi il totale delle ore è 1*24 + 7 = 31.
Se quello che vuoi è un TDateTime che memorizza più di 24 ore in senso stretto, non
esiste.
E sinceramente non riesco a capire a cosa ti serva... se ci posti un esempio forse
riusciamo a risolvere il tuo problema.
--
Jax

"Jax" <rispo...@newsgroup.grazie> ha scritto nel messaggio
news:HtjN8.35402$K4.8...@twister2.libero.it...

Io ho una tabella con in una colonna dei valori TdateTime (hh.mm.ss) e in
particolare una funzione che carica tutti i valori e li somma.
es:
riga1:     3:3:54        (3ore, 3min, 54sec)
riga2:     2:0:23        (2ore, 0min, 23sec)
la funzione ritorna: 5:4:17 (in formato TDateTime)
Ok?
ma se la somma da più di 24ore la funzione scassa!

 ma se la somma da più di 24ore la funzione scassa!
Scusa, non per essere pedanti... ma il problema non potrebbe stare nella
funzione? E non potresti postare la funzione?

 ma se la somma da più di 24ore la funzione scassa!
credo l'unica soluzione sia modificare la funzione seguendo i suggerimenti 
di Jax lavorando con tre variabili, una per l'ora, una per i minuti e una 
per i secondi, sarebbe anche utile sapere cosa devi fare con il valore che 
ti restituisce la funzione, se devi solo mostrarlo a video o stamparlo 
converti le tre variabili in stringa le concateni,
per conculedere, non credo che qualcuno si sia inventato un tipo tdatetime 
per rappresentare l'ora in 28:30:15.
Ciao, Antò.

 ma se la somma da più di 24ore la funzione scassa!
E' come ti dicevo io.
Mettiamo che hai
riga3: 23:3:15
In tal caso la funzione ritorna 4:07:32, ma se guardi il valore della somma tramite uno
watch, scoprirai che il suo valore è 1,171898....., che vuol dire che è passato più di un
giorno: quindi sono passate (24x1)+4 ore, 7 minuti e 32 secondi.
Un TDateTime è un numero reale composto da
<parte intera>=data
<parte frazionale>=tempo
Se guardi *solo* il tempo di un TDateTime, ti *sembra* che non contenga più di 24 ore, ma
in realtà li contiene, sotto forma di giorni.
Adesso, io non so cosa vuoi fare, ma penso che alla fine dovrai far vedere all'utente il
totale delle ore, minuti, secondi; quindi alla fin fine devi fare un DecodeTime per
separare i valori e *quindi* fare
 DecodeTime(dSomma, iOre, iMin, iSec, iMsec);
 iOre := iOre + (24*Trunc(dSomma));
 Caption := Format('Totale: %d ore, %d minuti, %d secondi', [iOre, iMin, iSec]);
In sintesi, devi conteggiare anche la parte intera del TDateTime, moltiplicata per 24.
Se hai ancora qualche dubbio posta pure :)
--
Jax

"Jax" <rispo...@newsgroup.grazie> ha scritto nel messaggio
news:6ymN8.36253$K4.8...@twister2.libero.it...

Grazie a tutti per l'aiuto, alla fine ho risolto modificando le varie
fundioni di calcolo del tempo.
Non è stato bello, però alla fine ho raggiunto il mio scopo.
Grazie ancora
CIAO

 type TDateTime.
Scorretto, a mio avviso, a livello logico.
Al TDateTime si applica lo stesso discorso che si applica ai
puntatori.  Sono entrambi indicatori e la somma dei loro valori
non ha molto senso.  Ha senso, invece, la differenza: due date
non si possono sommare, ma la loro differenza da' il numero di
giorni trascorsi; due puntatori non si possono sommare, ma la
loro differenza da' il numero di byte compresi tra le locazioni
puntate.  In generale, a mio avviso, per gestire delle "quantita'"
bisogna utilizzare variabili di altro tipo, adottando l'unita'
di misura giusta (se vuoi monitorare il tempo trascorso, usi, per
esempio, come u.m. i minuti).
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG