Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [VB.Net] Ciclo While d'appoggio e passare dati tra Form

    Spiego brevemente la situazione,
    Ho creato un tasto che mi crei il backup di un file (C:\prova.txt)
    il codice che uso è questo:
    codice:
    File.Copy("c:\prova.txt", "c:\prova.txt" " & TimeOfDay & ".bak")
    Cosi facendo il programma alla pressione del tasto mi Copia il file "prova.txt" ed aggiunge come suffisso la data di creazione, quindi il file finale sarà:
    prova.txthh.mm.ss.bak
    Fin qui ci siamo, tutto perfetto...

    Ora presumendo che prema in un secondo lo stesso tasto più volte il programma, OVVIAMENTE, darà errore perché il file che vuole andare a creare già esiste in quanto l'ora i minuti ed i secondi sono gli stessi.

    Arrivo al dunque, io so che esiste il "try catch" per la gestione degli errore (Lo usavo in Python) però siccome non ho idea di come si usi in VB ho fatto quanto segue:
    codice:
    Dim x As Integer
    
    Dim direct As String = "c:\prova.txt"
            If IO.File.Exists(direct & TimeOfDay & ".bak")=True Then
                While File.Exists(direct & TimeOfDay & ".bak") = True
                    x = x + 1
                End While
                File.Copy("c:\prova.txt", "c:\prova.txt" " & TimeOfDay & ".bak" & timeofday & x)
            Else
                File.Copy("c:\prova.txt", "c:\prova.txt" " & TimeOfDay & ".bak" & timeofday)
            End If
    Quindi in teoria quello che ho fatto è:

    Se "c:\prova.txtORA.bak" esiste, inizia il ciclo... altrimenti scrivi il file "c:\prova.txtORA.bak"
    CICLO: Finché "c:\prova.txtORA.bakx" esiste, aumenta di 1 il valore di x



    Però anche se il codice (LOGICAMENTE non fa una piega) quando provo a cliccare due volte in un secondo sul bottone per creare il backup lo stesso mi da errore (credo che non entri proprio nel ciclo...

    Cosa dovrei controllare??

    Potrebbe essere perchè in direct in realtà uso (System.Environmen...)??
    Il codice esatto che uso è simile a questo:
    codice:
    Dim direct As String = "System.Environment.GetFolderPath(Environment.SpecialFolder.Windows) & ""prova.txt""")




    NB: I codici li ho scritti direttamente nel topic quindi potrebbe esserci qualche errore di sintassi/battitura (Preciso che in M.Studio non ho errori)



    PS: Il titolo è "...e passare dati tra Form" perché questo sarà il secondo passaggio!

  2. #2
    ADD:


    Ecco, come volevasi dimostrare il problema è proprio nella variante:
    codice:
    Dim direct As String = "System.Environment.GetFolderPath(Environment.SpecialFolder.Windows) & ""prova.txt""")
    infatti se metto.... funziona:
    codice:
    Dim direct As String = "c:\windows\prova.txt"
    Almeno nel IF riesco ad entrare... quindi, anche se non ho provato dovrebbe funzionare tutto...

    Come posso mettere Environment.SpecialFolder.Windows senza avere problemi?? (Forse la variante non deve essere string!?!?)

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    1) cosa è una variante ?

    2) perché hai inserito le virgolette in "System...

    3) perché non usi semplicemente un Try..catch come avevi detto ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Originariamente inviato da oregon
    2) perché hai inserito le virgolette in "System...
    Dovevo metterlo senza virgolette?
    3) perché non usi semplicemente un Try..catch come avevi detto ?
    Come detto "In VB.Net non so come si usa il Try Catch"...
    Però rettifico che ho controllato e si usa esattamente come in Python, quindi ho trasformato il codice in modo da usare il try...

    Adesso il codice è qualcosa del genere:
    codice:
    Dim x As Integer
    Dim direct As String = "System.Environment.GetFolderPath(Environment.SpecialFolder.Windows) & ""\prova.txt"""
    
    Try
    	IO.File.Copy(direct, direct & ".bak" & TimeOfDay)
    Catch file As IOException
    	While IO.File.Exists(direct & ".bak" & TimeOfDay & x) = True
    		x = x + 1
    	End While
    	File.Copy(direct, direct & ".bak" & TimeOfDay & x)
    End Try

    E funziona... cioè se clicco velocemente riesco a creare un file .bakX
    però se clicco nuovamente mi da errore perchè il file già esiste


    EDIT: Perfetto, sono riuscito a correggerlo ed il codice finito è quello che ho postato in questo commento (Il problema era nella "directory") <<
    Ora posso cliccare anche 20 volte in un secondo ed avrò 20 file....


    Ora passo al punto 2. cioè creare un secondo form per il ripristino del backup..

  5. #5
    Ecco appunto... non riesco a passare i dati da un form all'altro...

    EDIT:
    Vedo che se indico il "form" ad ogni riferimento riesco a far comunicare entrambi i form tra di loro...

    Cioè se nel form1 metto un bottone con i seguenti comandi:
    codice:
    textbox1.test = "Prova"
    form2.show()
    form2.textbox1.text = me.textbox1.text
    Insomma vedo aprirmi il form2 con la textbox1 che ha lo stesso testo della textbox1 del primo form...

    ora mi chiedo solo se sia questa la modalità giusta!


    Comunque quello che voglio realizzare ora è fare un elenco di file (Quelli che ho backuppato in precedenza) e metterli creare una lista in un secondo form cosi da poter selezionare il file che voglio ripristinare tramite "Radiobutton"


    Riguardo il caricate dei file di backup riesco a farlo tranquillamente in quanto ho provato a metterli tutti in una listbox del form1, e me li carica tutti perfettamente

  6. #6

    Moderazione

    Mi pare che tu stia facendo un gran paciugo, sia a livello di codice che di organizzazione dei thread.
    Ad ogni problema corrisponde un thread. Questo (che provvederò a rinominare) rimane dedicato alla questione del file di backup, mentre per il passaggio dati tra form aprine uno separato.

    Quanto al codice, in ogni caso questo
    codice:
    Dim direct As String = "System.Environment.GetFolderPath(Environment.SpecialFolder.Windows) & ""\prova.txt"""
    non ha senso - se metti del testo tra virgolette questo viene interpretato, appunto, come testo, per cui "direct" assumerà come valore «System.Environment.GetFolderPath(Environment.Spec ialFolder.Windows) & "\prova.txt"»; quello che volevi fare probabilmente è:
    codice:
    Dim direct As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Windows) & "\prova.txt"
    che farà sì che direct assuma un valore del tipo «c:\Windows\prova.txt»; comunque non ha molto senso (un programma normale non ha i permessi per scrivere nella cartella di Windows, ed è giusto che sia così), ma almeno dal punto di vista del linguaggio è corretto.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7

    Re: Moderazione

    Originariamente inviato da MItaly
    Mi pare che tu stia facendo un gran paciugo, sia a livello di codice che di organizzazione dei thread.
    Ad ogni problema corrisponde un thread. Questo (che provvederò a rinominare) rimane dedicato alla questione del file di backup, mentre per il passaggio dati tra form aprine uno separato.

    Quanto al codice, in ogni caso questo
    codice:
    Dim direct As String = "System.Environment.GetFolderPath(Environment.SpecialFolder.Windows) & ""\prova.txt"""
    non ha senso - se metti del testo tra virgolette questo viene interpretato, appunto, come testo, per cui "direct" assumerà come valore «System.Environment.GetFolderPath(Environment.Spec ialFolder.Windows) & "\prova.txt"»; quello che volevi fare probabilmente è:
    codice:
    Dim direct As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Windows) & "\prova.txt"
    che farà sì che direct assuma un valore del tipo «c:\Windows\prova.txt»; comunque non ha molto senso (un programma normale non ha i permessi per scrivere nella cartella di Windows, ed è giusto che sia così), ma almeno dal punto di vista del linguaggio è corretto.



    Uhmm... dove iniziare...

    Sicuro che non è un problema creare 10 mila topic diversi un due giorni?

    Si, mi sono reso conto d'aver sbagliato alla grande per quanto riguarda le virgolette
    (In ogni caso ho risolto semplicemente togliendole ed aggiustando il percorso, cioè mancava una slash)

    Anche per quanto riguarda i diritti d'amministratore ho modificato "app.manifest" inserendo:
    codice:
    <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
    <-- È la cosa giusta da fare?
    Ed ho dato per scontato che il programma ogni qualvolta lo Avvierò tramite "Avvia come Amministratore"

    Secondo te sbaglio qualcos'altro nel codice (cioè dovrei ottimizzare
    Riguardo i thread ancora non ci sono arrivato, appena arrivo studiarli ovviamente ripasserò i vari punti un cui sarà opportuno inserirli...

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Non intendeva i thread come pensi tu ... intendeva le "discussioni" nel forum ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Originariamente inviato da oregon
    Non intendeva i thread come pensi tu ... intendeva le "discussioni" nel forum ...
    OMG!!
    Siccome ho letto e poi ho risposto a tutto "In una botta" mi sono confuso
    Scusatemi!


    Comunque ho iniziato due o tre giorni fa a programmare in VB.Net ed ho fatto grandi passi... Grazieeeeeee

  10. #10

    Re: Re: Moderazione

    Originariamente inviato da shuttle15
    <-- È la cosa giusta da fare?
    Ed ho dato per scontato che il programma ogni qualvolta lo Avvierò tramite "Avvia come Amministratore"
    Questa è una pessima idea. La cosa giusta sarebbe che il tuo programma non scrivesse nella directory di Windows, ma nelle apposite directory riservate ai dati dell'applicazione.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.