Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Per Il Totem: richiesta di aiuto
Forum - C# / VB.NET - Per Il Totem: richiesta di aiuto

Avatar
alpi39 (Normal User)
Pro


Messaggi: 63
Iscritto: 07/03/2008

Segnala al moderatore
Postato alle 17:41
Giovedì, 24/07/2008
Ciao Totem.
Ho provato ad utilizzare il codice che tu mi hai postato nel Topic "2 domande apparentemente facili ma per me difficili" per costruire il mio Calendario, ma data la mia scarsa conoscenza del Visual Basic .NET, non sono stao in grado di farne un buon uso.
Questo Calendario che vorrei programmare lo vorrei realizzare per mio figlio che vive e lavora a Roma (io, ti ricordo che vivo in Brasile) presso una Casa Editrice e dovrebbe servire a distribuire (nell’arco dell’anno) tutte le fasi di lavorazione dei giornali che la Casa produce.
Questo Calendario dovrebbe, per prima cosa, registrare una cartella con il nome dell’anno da programmare e, all’interno di questa, 12 cartelle ognuna con il nome di un Mese all’interno delle quali tante cartelle quanti sono i giorni di ogni mese contenente ciascuna un file di testo dove saranno registrate le fasi di lavorazione che sono previste per quel giorno.
So che è un’impresa molto ardua per me che sono alle prime armi con il VB.NET ma ho provato a scrivere questo codice che ti invio, perché mi da un errore alla riga che ti segnalo. Errore che non so risolvere e mi rivolgo a te che sono certo vorrai aiutarmi.
Ti anticipo i miei doverosi ringraziamenti.

Codice sorgente - presumibilmente VB.NET

  1. Imports System.IO
  2.  
  3. Public Class Form1
  4.  
  5.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  6.  
  7.         Dim AnnoDigitato As String = ""
  8.         Dim Anno As String = ""
  9.         Dim Mesi(12) As String
  10.         Dim Mese As String = ""
  11.         Dim Giorni(12) As Integer
  12.         Dim Giorno As String = ""
  13.  
  14.         'qui, raccoglie il dato scritto nella TextBox
  15.         'per stabilire di quale anno deve formare il Calendario(che NON è obbligatoriamente l'anno corrente)
  16.         AnnoDigitato = AnnoDigitato + Me.Controls("TextBox" & 1).Text
  17.  
  18.         'trasforma l'anno digitato nella TextBox (che è una stringa) in  un’altra stringa per la variabile anno
  19.         Anno = AnnoDigitato
  20.  
  21.         'qui evidenzia, con un messaggio l'anno che è stato digitato
  22.         Dim risp As Integer = MsgBox(L'anno del quale formare il calendario è il " & Anno)
  23.  
  24.         'Crea il percorso per arrivare alla Directory
  25.         'che chiamerà  con il nome dell'anno del quale formare il calendario
  26.         Dim Percorso As String = "C:\" & Anno
  27.  
  28.         'assegna i valori a Mesi e ad ogni Mese la quantità relativa di Giorni
  29.         For I = 1 To 12
  30.             If I = 1 Then Mesi(I) = "Gennaio" : Giorni(I) = 31
  31.             If I = 2 Then Mesi(I) = "Febbraio" : Giorni(I) = 28
  32.             If I = 3 Then Mesi(I) = "Marzo" : Giorni(I) = 31
  33.             If I = 4 Then Mesi(I) = "Aprile" : Giorni(I) = 30
  34.             If I = 5 Then Mesi(I) = "Maggio" : Giorni(I) = 31
  35.             If I = 6 Then Mesi(I) = "Giugno" : Giorni(I) = 30
  36.             If I = 7 Then Mesi(I) = "Luglio" : Giorni(I) = 31
  37.             If I = 8 Then Mesi(I) = "Agosto" : Giorni(I) = 31
  38.             If I = 9 Then Mesi(I) = "Settembre" : Giorni(I) = 30
  39.             If I = 10 Then Mesi(I) = "Ottobre" : Giorni(I) = 31
  40.             If I = 11 Then Mesi(I) = "Novembre" : Giorni(I) = 30
  41.             If I = 12 Then Mesi(I) = "Dicembre" : Giorni(I) = 31
  42.         Next
  43.  
  44.         'Controlla se l'anno digitato è un anno bisestile
  45.         'in caso positivo, aumenta di uno i giorni di Febbraio
  46.         If Int(Val(Anno / 4 * 4)) = Val(Anno) Then Mesi(2) = 29
  47.  
  48.         'Crea la stringa Mese
  49.         For I = 1 To 12
  50.             Mese = Mesi(I)
  51.             'Crea la stringa Giorno
  52.             For X = 1 To Giorni(I)
  53.                 Giorno = Str(X) & " " & Mese
  54.  
  55.                 'Crea il percorso che deve fare per creare le cartelle e sottocartelle
  56.                 'ognuna con il proprio nome
  57.                 Dim PercorsoFile As String = ""
  58.                 PercorsoFile = "C:\" & Anno \ Mese \ Giorno <--------Qui mi segnala l’errore, evidenziandomi la riga con un fondino giallo ed una finestra, con un filo indirizzato verso la riga dove è scritto: (in carattere grassetto)  InvalidCAstException non è stata gestita e, (in carattere normale) Cast non valido dalla stringa "Gennaio" al tipo 'Long'.
  59.  
  60.                                  System.IO.Directory.CreateDirectory(PercorsoFile)
  61.  
  62.                 'È possibile utilizzare Metodo My.Computer.FileSystem.WriteAllText per scrivere del testo all'interno dei file.
  63.                 'Se il file specificato non esiste, viene creato automaticamente.
  64.                 My.Computer.FileSystem.WriteAllText(PercorsoFile, Giorno, True)
  65.  
  66.             Next X
  67.  
  68.         Next I
  69.  
  70.         Close()
  71.  
  72.     End Sub
  73.  
  74. End Class

                                                                    
                                                                                        
                                                        

Ultima modifica effettuata da alpi39 il 24/07/2008 alle 18:12
PM Quote
Avatar
crash outside control (Normal User)
Expert


Messaggi: 217
Iscritto: 12/02/2008

Segnala al moderatore
Postato alle 19:09
Giovedì, 24/07/2008
Ciao, prova con:
Codice sorgente - presumibilmente C# / VB.NET

  1. 'Crea il percorso che deve fare per creare le cartelle e sottocartelle
  2.                 'ognuna con il proprio nome
  3.                 Dim PercorsoFile As String = ""
  4.                 PercorsoFile = "C:\" & Anno & "\" & Mese & "\" & Giorno



P.S. scusa se mi sono intromesso 8-|

Ultima modifica effettuata da crash outside control il 24/07/2008 alle 19:38
PM Quote
Avatar
alpi39 (Normal User)
Pro


Messaggi: 63
Iscritto: 07/03/2008

Segnala al moderatore
Postato alle 21:28
Giovedì, 24/07/2008
Postato originariamente da crash outside control:

Ciao, prova con:
Codice sorgente - presumibilmente C# / VB.NET

  1. 'Crea il percorso che deve fare per creare le cartelle e sottocartelle
  2.                 'ognuna con il proprio nome
  3.                 Dim PercorsoFile As String = ""
  4.                 PercorsoFile = "C:\" & Anno & "\" & Mese & "\" & Giorno
  5. P.S. scusa se mi sono intromesso 8-|


Ciao crash outside control e grazie per esserti "intromesso" perché la tua intromissione è riuscita a farmi andare avanti nel progetto. Purtoppo, però, si è ribloccato alla riga sucessiva che ti posto, segnalandomi l'errore con il solito fondino giallo e la solita finestra che recita:
(in carattere grassetto)
"unauthorizedAccessException non è stata gestita"
ed (in carattere normale)
"Accesso al percorso 'C:\2009\Gennaio\ 1 Gennaio' negato".
Debbo forse spiegarti che all'interno della cartella "1 Gennaio",dovrebbe essere inserito un file .txt con lo stesso titolo "1 Gennaio" e nel file, dovrebbe essere scritto (come prima riga), lo stesso "1 Gennaio".
Pensi di potermi ancora aiutare?
Codice sorgente - presumibilmente C# / VB.NET

  1. 'È possibile utilizzare Metodo My.Computer.FileSystem.WriteAllText per scrivere del testo all'interno dei file.
  2.                 'Se il file specificato non esiste, viene creato automaticamente.
  3.                 My.Computer.FileSystem.WriteAllText(PercorsoFile, Giorno, True)<------questa è la riga dove mi viene segnalato l'errore


Grazie nuovamente
alpi39 (Alberto)

Ultima modifica effettuata da alpi39 il 24/07/2008 alle 21:34
PM Quote
Avatar
crash outside control (Normal User)
Expert


Messaggi: 217
Iscritto: 12/02/2008

Segnala al moderatore
Postato alle 21:48
Giovedì, 24/07/2008
Prova con:
Codice sorgente - presumibilmente Plain Text

  1. My.Computer.FileSystem.WriteAllText(PercorsoFile & "\" & Giorno & ".txt", Giorno, True)


PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:13
Venerdì, 25/07/2008
Crash ha ragione. Nel metodo WriteAllText, tu non hai specificato il percorso del file, ma quello della CARTELLA.

Inoltre... trascurando tutte le piccole cose del tuo codice che si potrebbero correggere, io ti suggerirei un approccio più Object Oriented, visto che si programma di .net.
Questa soluzione spreca invero molte risorse, quando basterebbe una riga di codice per dichiarare un contenitore che possa gestire tutto autonomamente:
Codice sorgente - presumibilmente VB.NET

  1. Dim Lista As New Dictionary(Of Date, String)


Questo dizionario associa ad ogni chiave (di tipo Date), un valore (di tipo String). In questo modo basta aggiungere una chiave e il corrispondente impegno nella stringa per memorizzare tutto nel dizionario. Esempio:
Codice sorgente - presumibilmente C# / VB.NET

  1. Dim Data As Date = Date.Parse("18/01/2009")
  2. Lista.Add(Data, "Impegno per questa data")


E il salvataggio non è un problema. Infatti puoi inserire questa lista in My.Settings e l'applicazione si occuperà di salvare e caricare da sola l'oggetto ad ogni avvio/chiusura del programma. Non ti sembra più facile e meno oneroso?

PM Quote
Avatar
alpi39 (Normal User)
Pro


Messaggi: 63
Iscritto: 07/03/2008

Segnala al moderatore
Postato alle 12:25
Venerdì, 25/07/2008
Testo quotato

Postato originariamente da Il Totem:

Crash ha ragione. Nel metodo WriteAllText, tu non hai specificato il percorso del file, ma quello della CARTELLA.

Inoltre... trascurando tutte le piccole cose del tuo codice che si potrebbero correggere, io ti suggerirei un approccio più Object Oriented, visto che si programma di .net.
Questa soluzione spreca invero molte risorse, quando basterebbe una riga di codice per dichiarare un contenitore che possa gestire tutto autonomamente:
Codice sorgente - presumibilmente VB.NET

  1. Dim Lista As New Dictionary(Of Date, String)


Questo dizionario associa ad ogni chiave (di tipo Date), un valore (di tipo String). In questo modo basta aggiungere una chiave e il corrispondente impegno nella stringa per memorizzare tutto nel dizionario. Esempio:
Codice sorgente - presumibilmente C# / VB.NET

  1. Dim Data As Date = Date.Parse("18/01/2009")
  2. Lista.Add(Data, "Impegno per questa data")


E il salvataggio non è un problema. Infatti puoi inserire questa lista in My.Settings e l'applicazione si occuperà di salvare e caricare da sola l'oggetto ad ogni avvio/chiusura del programma. Non ti sembra più facile e meno oneroso?



Ciao Totem
Sono contento di leggerti e volevo prima di ogni cosa, ringraziare Crash per ciò che lui ha chiamato 'INTROMISSIONE", perché con la sua "intromissione", ho risolto i miei problemi che, la mia scarsa padronanza del linguaggio non mi faceva vedere.
Grazie infinite Crash.
Vedi Totem, i tuoi consigli sono sicuramente ottimi e migliorerebbero sicuramente il codice rendendolo più leggero e meno farraginoso, ma io, poichè conosco ben poco del VB.NET, mi rivolgo alle mie conoscenze del vecchio Basic cercando di adattarle a questo nuovo linguaggio e così come ha fatto Crash (che ha preso una parte del mio codice apportandovi le dovute correzioni) il programma funziona benissimo (grazie a lui).
Ciò che tu mi suggerisci di fare inviandomi righe di codice, io non saprei dove posizionarle.
Forse, dimentichi la mia incapacità e pensi di comunicare con uno esperto e bravo come te. Per questo io ti ringrazio, ma apprezzo di più la spiegazione che tu mi hai dato per le correzioni che mi ha indicato Crash, perché così ho capito dove erano gli errori ed un'alta volta saprò dove e come intervenire.
Rispettosamente ti ringrazio e sicuramente mi piacerà rileggerti ancora in un prosimo futuro.
alpi39 (Alberto)

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:23
Sabato, 26/07/2008
Certo lo capisco, ma non sarebbe male se facessi qualche passo in più in questo linguaggio. Ad ogni modo, i miei sono suggerimenti e non obblighi. Se preferisci continuare così, fai pure.

E, giusto per l'occasione, ricordo che questo è un forum e che se anche indirizzate le discussioni a me perchè sono il moderatore, non è detto che qualcuno prima di me le legga e, avendo il diritto di rispondere (e la soluzione al problema), risponda. Sebbene mi dispiacia dirlo, sarebbe meglio togliere clausole del tipo "Per totem" nel titolo della discussione, sostituiendole con qualcosa di più significativo.

PM Quote