Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Con la prima rete 5G Standalone attiva in Italia, WINDTRE compie un passo decisivo verso un modello di connettività intelligente che abilita scenari avanzati per imprese e pubbliche amministrazioni, trasformando la rete da infrastruttura a piattaforma per servizi a valore aggiunto
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro punta a diventare uno dei riferimenti assoluti nel segmento dei camera phone di fascia alta. Con un teleobiettivo Hasselblad da 200 MP, una batteria al silicio-carbonio da 7500 mAh e un display da 6,78 pollici con cornici ultra ridotte, il nuovo flagship non teme confronti con la concorrenza, e non solo nel comparto fotografico mobile. La dotazione tecnica include il processore MediaTek Dimensity 9500, certificazione IP69 e un sistema di ricarica rapida a 80W
DJI Romo, il robot aspirapolvere tutto trasparente
DJI Romo, il robot aspirapolvere tutto trasparente
Anche DJI entra nel panorama delle aziende che propongono una soluzione per la pulizia di casa, facendo leva sulla propria esperienza legata alla mappatura degli ambienti e all'evitamento di ostacoli maturata nel mondo dei droni. Romo è un robot preciso ed efficace, dal design decisamente originale e unico ma che richiede per questo un costo d'acquisto molto elevato
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 18-12-2008, 22:19   #1
Diablo-IT
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))
Ho diverse textbox come questa qua sopra, e con queste textbox devo:
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!
Diablo-IT è offline   Rispondi citando il messaggio o parte di esso
Old 19-12-2008, 01:19   #2
FixFixFix
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
FixFixFix è offline   Rispondi citando il messaggio o parte di esso
Old 19-12-2008, 03:16   #3
Diablo-IT
Senior Member
 
Iscritto dal: Sep 2007
Messaggi: 309
Quote:
Originariamente inviato da FixFixFix Guarda i messaggi
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
Innanzitutto grazie per il reply.
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.
Diablo-IT è offline   Rispondi citando il messaggio o parte di esso
Old 19-12-2008, 10:40   #4
!fazz
Moderatore
 
L'Avatar di !fazz
 
Iscritto dal: Nov 2006
Messaggi: 21833
Quote:
Originariamente inviato da Diablo-IT Guarda i messaggi
Innanzitutto grazie per il reply.
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.
premetto che lavoro con c# ma essendo .net la soluzione dovrebbe essere simile
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
!fazz è offline   Rispondi citando il messaggio o parte di esso
Old 19-12-2008, 11:36   #5
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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);
Quindi per risolvere il tuo problema io farei qualcosa tipo

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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 19-12-2008, 12:17   #6
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da Diablo-IT Guarda i messaggi
...
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))
...
Il primo errore che fai è proprio usare DateTime.
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 Function
-> Codice che esegue la somma di tutte le TextBox :

Codice:
       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))
Con questo metodo non vai mai in errore, in quanto la Function "stringaPerTS" accomoda l'argomento dato in pasto al metodo .Parse !

Prova...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 19-12-2008, 12:21   #7
Diablo-IT
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.
Diablo-IT è offline   Rispondi citando il messaggio o parte di esso
Old 19-12-2008, 13:21   #8
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da Diablo-IT Guarda i messaggi
@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.
Già, ovviamente rimane solo da gestire l'input nelle TextBox, che deve essere corretto ( se ci scrivi "patate", "carote" ecc... non funzionerà ).

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.
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 19-12-2008, 17:43   #9
Diablo-IT
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!
Diablo-IT è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2008, 12:15   #10
!fazz
Moderatore
 
L'Avatar di !fazz
 
Iscritto dal: Nov 2006
Messaggi: 21833
Quote:
Originariamente inviato da Diablo-IT Guarda i messaggi
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!
Se non hai bisogno di un elevatissima sicurezza
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
!fazz è offline   Rispondi citando il messaggio o parte di esso
Old 29-12-2008, 18:03   #11
Diablo-IT
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.
Diablo-IT è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi Wind Tre 'accende' il 5G Standalone in Italia: s...
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh OPPO Find X9 Pro: il camera phone con teleobiett...
DJI Romo, il robot aspirapolvere tutto trasparente DJI Romo, il robot aspirapolvere tutto trasparen...
DJI Osmo Nano: la piccola fotocamera alla prova sul campo DJI Osmo Nano: la piccola fotocamera alla prova ...
FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
Addio console: Just Dance Now trasforma ...
Driver Radeon Adrenalin 25.10: perch&egr...
Oltre le GPU: NVIDIA annuncia NVQLink, ...
Samsung lancia il Team Galaxy Italia per...
Magic Leap: indistinguibili dai normali ...
Aruba Cloud: trasparenza sui costi e str...
Quando il cloud si blocca e resti al fre...
Integrare per competere, la sfida digita...
Leggenda del rally e modernità: S...
La Python Software Foundation rinuncia a...
Full HD e QLED, è in offerta un TV da 32...
Honda ha rilasciato un nuovo video sul p...
Resident Evil Requiem: arriva su Switch ...
Marshall Acton III in promo su Amazon in...
2 portatili che costano poco ma vanno be...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 06:11.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v