| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  18-12-2008, 22:19 | #1 | 
| Senior Member Iscritto dal: Sep 2007 
					Messaggi: 309
				 | 
				
				[VB .net 2005] Oggetto DateTime
			 
		Ciao a tutti, sto lavorando su un progetto eseguibile con VS .Net 2005, linguaggio VB. Ho diversi testbox dove all'interno va inserito un valore nel formato HH:MM:SS Il mio problema e' il seguente: se ad esempio inserisco 12:36:02 (quindi meno di 24 ore) il tutto funziona, ma se inserisco invece un valore come 27:11:34 (quindi 27 ore) allora ho un errore. Una parte di codice che utilizzo ora e' questa : Codice: Dim totHMS As New DateTime totHMS = CType(frmMain.txtUrb.Text, Date)) 1) convertire il valore in secondi 2) sommare circa 7 textbox come quella ed ottenere un risultato sempre nel formato HH:MM:SS, anche se HH e' maggiore di 24 ore (dove l'oggetto DateTime se faccio la somma delle textbox mi restituisce anche i giorni se HH>24, e non mi accetta il "Ctype(textbox.text, date)" se HH nella textbox e' maggiore a 24). Come posso fare a risolvere questo problema? Probabilmente sbaglio approccio, ma non riesco ad ottenere nulla senza sporcare il codice in un modo incomprensibile. Avete qualche suggerimento o esempio di codice scritto bene? Grazie!   | 
|   |   | 
|  19-12-2008, 01:19 | #2 | 
| Member Iscritto dal: Dec 2008 
					Messaggi: 82
				 | 
		mettere un handler sulla oneditchange della textbox ? e se uno inserisce nelle prime due cifre un numero > 24 gli metti una messagebox e blocchi il tutto
		 
				__________________ Software house Manfriday | 
|   |   | 
|  19-12-2008, 03:16 | #3 | |
| Senior Member Iscritto dal: Sep 2007 
					Messaggi: 309
				 | Quote: 
 Il fatto e' che non posso far cosi', dato che il software deve accettare valori anche superiori a 24 ore, come 36:10:24 ad esempio. Mi serve per fare dei conti sulle ore totali di utilizzo di un dato servizio aziendale e dovendosi interfacciare ad un'altra piattaforma/software son costretto ad accettare anche tali valori. Una soluzione la ho trovata, ma e' decisamente orribile! Ovvero: tratto il contenuto della textbox come stringa, tramite le funzioni left, right etc setto tre variabili temporanee che chiamero' ad esempio "a_ore" "a_minuti" "a_secondi" che converto poi da stringa a integer, ci lavoro sopra cosi' e poi le riconverto in stringa, ma mi escono fuori 200 linee di codice incasinatissimo e illeggibile, spererei in una soluzione che in caso di modifiche successive e nel debug non mi faccia impazzire (devo ripetere l'operazione troppe volte nel software per una logica simile). Altre idee? Thanks.   | |
|   |   | 
|  19-12-2008, 10:40 | #4 | |
| Moderatore Iscritto dal: Nov 2006 
					Messaggi: 21833
				 | Quote: 
 allora metti i controlli nell'evento validated (o un suo equivalente) l'oggetto datetime permette di gestire nativamente ore minuti e secondi. se necessario cmq io porterei tutto in secondi e farei divisione e modulo per 86400 il risultato della divisione lo metterei come incremento dei giorni da una data simbolica di partenza (così la usi per i confronti sui giorni di funzionamento) e il resto è subito convertito nei campi ore minuti e secondi. non so è più facile farlo che spiegarlo   
				__________________ "WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 | |
|   |   | 
|  19-12-2008, 11:36 | #5 | 
| Senior Member Iscritto dal: May 2004 Città: Londra (Torino) 
					Messaggi: 3692
				 | 
		Stai usando la classe sbagliata. La classe DateTime serve per gestire Istanti, date assolute. E' evidente che 27:15:12 non e' una data assoluta, quanto piu' un delta, una differenza, un periodo. La classe per gestire tali informazioni e' la TimeSpan. Puoi infatti scrivere Codice: // Dato l'intervallo 35:12:14 TimeSpan ts = new TimeSpan(35,12,14); Codice: // Controlli iniziali...
string[] hms = input.Split(new char[]{':'});
if (hsm.Length!=3) throw new Exception(qualcosa)
// altri controlli
TimeSpan ts = new TimeSpan(hms[0], hms[1], hms[2]);
				__________________ Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. | 
|   |   | 
|  19-12-2008, 12:17 | #6 | |
| Senior Member Iscritto dal: Dec 2004 
					Messaggi: 3210
				 | Quote: 
 Come ti è già stato suggerito, in .NET esiste un tipo molto più adatto a gestire durate temporali anzichè istanti puntiformi : il TimeSpan. Tra i vari vantaggi che offre ( e te ne do una dimostrazione proprio qui ), la possibilità di sommare intervalli temporali semplicemente, come si sommassero numeri. Nello specifico, in risposta al tuo quesito ( Somma di n TextBox, che possono rappresentare anche differenze orarie > 24h... ). la risolverei così : -> Funzioni a livello di Form : Codice:    Private Function stringaTS(ByVal TS As TimeSpan) As String
        Dim hh As String = CStr(TS.Days * 24 + TS.Hours)
        Dim mm As String = CStr(TS.Minutes)
        Dim ss As String = CStr(TS.Seconds)
        stringaTS = hh.PadLeft(2, "0") & ":" & mm.PadLeft(2, "0") & ":" & ss.PadLeft(2, "0")
    End Function
    Private Function stringaPerTS(ByVal arg As String) As String
        Dim args() As String = arg.Split(":")
        Dim h As Integer = CInt(args(0))
        Dim g As Integer = 0
        If h > 23 Then
            g = Int(h / 24)
            h = h - (24 * g)
        Else
            stringaPerTS = arg
            Exit Function
        End If
        stringaPerTS = CStr(g) & "." & CStr(h).PadLeft(2, "0") & Strings.Right(arg, 6)
    End FunctionCodice:        Dim sommaTS As New TimeSpan(0, 0, 0)
        Dim C As Control
        For Each C In Me.Controls
            If TypeOf (C) Is System.Windows.Forms.TextBox Then
                'Aggiungere eventuali controlli sulle textbox...
                '...
                'MsgBox(stringaPerTS(C.Text))
                Dim TS As New TimeSpan(0, 0, 0)
                TS = TS.Parse(stringaPerTS(C.Text))
                sommaTS = sommaTS + TS
            End If
        Next C
        MsgBox(stringaTS(sommaTS))Prova...   | |
|   |   | 
|  19-12-2008, 12:21 | #7 | 
| Senior Member Iscritto dal: Sep 2007 
					Messaggi: 309
				 | 
		@ Ifazz: grtazie, potrebbe essere una solzione, ma mi piace il codice il piu' pulito/breve possibile (ognnuno ha le sue manie he he). @gugoXX: che pirla che sono! Grazie! Do un'occhiata ai vari metodi etc di TimeSpan e mi metto all'opera. Mea culpa, in effetti con datetime ci sarei potuto impazzire, appena torno sul pc di sviluppo provo cosi'. @marcoGG: caspita... pure il codice gia' pronto! Grazie, mi confermi che sbagliavo ad usare DateTime. E' cposi' che mi piace, semplice, conciso e con nessuna o quasi eccezione da gestire (salvo che non inseriscano valori stringa e non mumerici ma lo grestisco facilmente con try/catch). Perfetto.  Grazie a tutti, appena ho finito vi faccio sapere com'e' andata. Ultima modifica di Diablo-IT : 19-12-2008 alle 12:25. | 
|   |   | 
|  19-12-2008, 13:21 | #8 | |
| Senior Member Iscritto dal: Dec 2004 
					Messaggi: 3210
				 | Quote: 
  ). Se ad esempio hai 3 TextBox con : 01:00:00 01:10:30 25:10:30 restituirà correttamente : 27:21:00 Ma anche se sfori con le ore ( ad esempio nella terza : 125:10:30 ) restituirà correttamente : 127:21:00.   | |
|   |   | 
|  19-12-2008, 17:43 | #9 | 
| Senior Member Iscritto dal: Sep 2007 
					Messaggi: 309
				 | 
		Innanzitutto ti ringrazio nuovamente, apprezzo molto chi sa le cose e soprattutto sa condividere la propria conoscenza. Ho fatto una prova e funziona, ma gia' che ci sono (ormai e' venerdi' e una "beta" la ho consegnata) riscrivo gran parte del codice un po meglio, creando una classe apposita in previsione di futuri upgrade (setup/opzioni etc), ora avendo fretta di far vedere qualcosa ho scritto quella parte del codice non molto object oriented e non mi piace. Ora ecco saltar fuori un'altro "problemino" importantissimo: la sicurezza! Di solito utilizzavo chiavi hardware, ma in questo caso (per svariati motivi) non mi e' possibile usare questa soluzione. Conoscete qualche algoritmo per poter creare chesso', un "codice richiesta attivazione" che verra' visualizzato in una textbox (nello splash screen) basato magari su nome utente/qualcosa dipendentedallamacchina, in modo che l'utente finale mi debba contattare dandomi quel codice per avere un secondo codice da inserire in una seconda textbox per attivare il software? In questo modo cosi' chi nonautorizzato non potra' utilizzarlo e potro' tener traccia delle varie attivazioni (escludo a priori sistemi di autenticazione tramite server web etc, deve funzionare anche offline). Corro a cercare sul magico google, ma se avete qualche idea interessante, sparate pure! | 
|   |   | 
|  20-12-2008, 12:15 | #10 | |
| Moderatore Iscritto dal: Nov 2006 
					Messaggi: 21833
				 | Quote: 
 usa il mac adress della scheda di rete e il nome utente per creare un seed poi passi per una funzione hash in modo da avere un resultato di lunghezza fissa quando l'utente ti contatta ti fai dare questo codice lo passi in un algoritmo rsa con una tua bella robusta chiave primaria e gli rimandi il risultato cifrato. il problema risulta che devi salvare nell'eseguibile o da qualche parte su disco la chiave quindi analizzando la memoria o disassemblando il codice potrebbbero ottenere la chiave 
				__________________ "WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 | |
|   |   | 
|  29-12-2008, 18:03 | #11 | 
| Senior Member Iscritto dal: Sep 2007 
					Messaggi: 309
				 | 
		Dopo qualche giorno di ferie rieccomi qua a bestemmiare col Pc.   Il codice funziona perfettamente. Per quanto riguarda la sicurezza/controllo licenze ho deciso di cambiare totalmente strada. Non so ancora bene nel dettaglio come fare (ho lavorato pochissimo fino ad ora su interfacce web) ma l'idea da realizzare e' quella di buttare la DLL sul web, crearmi una form web in ASP oppure PHP e non consegnare nessun software, ma soltanto nome utente e password per accedere alla pagina basandomi su un banale file .htaccess o simili. In questo modo nessun problema per gli aggiornamenti del software o paranoie per clienti che lo passano al collega, segretaria, concorrenza ecc. Ok, detto questo torno a studiare un po le webforms he he.   | 
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 06:11.









 
		 
		 
		 
		









 
  
 



 
                        
                        










