Visualizzazione Stampabile
-
[.net] apertura e chiusura dei form
Mi sto imbattendo in problemi di una banalità ancestrale ma che mi stanno creando diversi grattacapi.
Ho un'applicazione che cliccando su di un pulsante mi apre 2 form in 2 monitor separati con il seguente codice
Codice:
Dim screen As Screen
If screen.AllScreens.Count = 1 Then
Browser_monitor_unico.Show()
ElseIf screen.AllScreens.Count = 2 Then
screen = screen.AllScreens(1)
ricette.StartPosition = FormStartPosition.Manual
ricette.Location = screen.Bounds.Location
Browser.Show()
ricette.Show()
Else
MsgBox("Il numero massimo di monitor supportati dall'applicazione è 2.")
End If
dubbio 1: nella maschera browser ci sono dei pulsanti che chiudono il form e ritornano alla maschera principale (in ricette invece non c'è nessun pulsante di chiusura). Nell'evento click di questi devo mettere ricette.close() oppure c'è un metodo più "elegante" per legare i 2 form e gestire l'evento di chiusura?
dubbio2: come potete vedere dal codice se il programma trova un solo monitor lancia un'altra form. Sia in Browser che in Browser_monitor_unico c'è un pulsante che lancia una finestra di dialogo. Ecco quando io clicco sul tasto OK della finestra di dialogo vorrei che mi si chiudesse lei e che si chiudesse il form che l'ha lanciata. Come si fa? Io adesso ho fatto il brutale e ho messo
Me.close()
browser.close()
browser_monitor_unico.close()
ricette.close()
così chiude tutto senza farsi problemi :asd:
Certo funziona ma anche qua vorrei sapere se c'è qualcosa di più elegante.
Grazie :D
-
Riferimento: [.net] apertura e chiusura dei form
Citazione:
Originariamente Scritto da
Frykky
Mi sto imbattendo in problemi di una banalità ancestrale ma che mi stanno creando diversi grattacapi.
dubbio 1: nella maschera browser ci sono dei pulsanti che chiudono il form e ritornano alla maschera principale (in ricette invece non c'è nessun pulsante di chiusura). Nell'evento click di questi devo mettere ricette.close() oppure c'è un metodo più "elegante" per legare i 2 form e gestire l'evento di chiusura?
dubbio2: come potete vedere dal codice se il programma trova un solo monitor lancia un'altra form. Sia in Browser che in Browser_monitor_unico c'è un pulsante che lancia una finestra di dialogo. Ecco quando io clicco sul tasto OK della finestra di dialogo vorrei che mi si chiudesse lei e che si chiudesse il form che l'ha lanciata. Come si fa? Io adesso ho fatto il brutale e ho messo
Me.close()
browser.close()
browser_monitor_unico.close()
ricette.close()
così chiude tutto senza farsi problemi :asd:
Certo funziona ma anche qua vorrei sapere se c'è qualcosa di più elegante.
Grazie :D
Dunque, se ho capito bene come interagiscono le varie finestre, potresti centralizzare il codice dalla finestra principale, mantenendo un riferimento a quelle secondarie
Ad esempio
Codice:
Public Class MainForm
Private WithEvents Browser As BrowserForm
Private WithEvents Ricette As RicetteForm
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Browser = New BrowserForm
Browser.Show()
Ricette = New RicetteForm
Ricette.Show()
End Sub
Private Sub Browser_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Browser.FormClosed
Ricette.Close()
End Sub
End Class
'WithEvents' fa si che tu possa intercettare gli eventi delle altre finestre anche nel codice della Main; a questo punto non hai più bisogno di sparpagliare il codice nei vari bottoni di chiusura, ma decidi solo da qui come devono incastrarsi i 'Close' in cascata.
Il caso "browser unico o browser" lo gestisci facilmente con lo stesso criterio, anche se meglio ancora sarebbe che uno dei due browser ereditasse dall'altro, in modo da mantenere un unico riferimento a quella form e rendere trasparente per il resto del codice il fatto che sia aperto quello unico o quello multi-monitor.
Quest'ultima cosa ti aiuterebbe anche a risolvere la questione della finestra di dialogo aperta da entrambi
-
Riferimento: [.net] apertura e chiusura dei form
problema 1 risolto.
Sull'ereditare la classe Browser in Browser_monitor_unico invece ho qualche problema (i 2 form non sono proprio identici, oltre ad un webbrowser c'è altra roba).
Facciamo un esempiuccio? :D
-
Riferimento: [.net] apertura e chiusura dei form
Citazione:
Originariamente Scritto da
Frykky
Sull'ereditare la classe Browser in Browser_monitor_unico invece ho qualche problema (i 2 form non sono proprio identici, oltre ad un webbrowser c'è altra roba).
Beh, non c'è dubbio, altrimenti non avrebbe nemmeno senso ereditare, useresti due istanze della stessa...
Citazione:
Facciamo un esempiuccio? :D
Tipo? tutto quello che ti serve per ereditare un form dall'altro è l'istruzione 'Inherits NomeAltroForm', esattamente come per le classi normali
Detto questo, altri esempi più significativi, senza conoscere nel dettaglio le finestre in questione è difficile fartene....
L'idea generale è che se il tuo programma deve sempre avere una finestra 'browser' disponibile, ma questa cambia a seconda dei monitor installati, puoi individuare un set di funzionalità minime comuni (per esempio il controllo webbrowser, per l'appunto, e anche il codice per la famosa apertura di un altro dialog, che dicevi esiste in entrambe), creare una form 'browserbase' che le includa, e poi derivare le due 'Browser_multi_monitor' e 'Browser_monitor_unico'
A quel punto potrai fare una cosa del genere:
Codice:
'Scope a livello di MainForm o intera applicazione, secondo necessità
Private Browser As BrowserBase
'...
'In fase di inizializzazione
If screen.AllScreens.Count = 1 Then
Browser = New Browser_monitor_unico
ElseIf screen.AllScreens.Count = 2 Then
Browser = New Browser_multi_monitor
Else
'...
End If
e da li in poi scrivere codice neutro che ragioni sempre in termini di 'BrowserBase'
Facendo così, per esempio, potresti anche rivedere interamente la logica di 'ricette' e spostare tutto il codice che visualizza quella form in 'Browser_multi_monitor', in modo che, di nuovo, anche quella parte risulti trasparente allla logica del codice della finestra principale
-
Riferimento: [.net] apertura e chiusura dei form
Vedi il problema è uno: che all'università e nella teoria si fanno sempre esempi inutili tipo "classe rettangolo eredita da classe poligono" poi quando si arriva a fare le cose concrete non sempre è facile applicare le nozioni.
Soprattutto se uno è uno zuccone come me.
Te mi hai detto "fai una classe BrowserBase coi suoi metodi che poi verranno ereditati ed eventualmente riscritti dalle 2 classi Browser_multi_monitor e Browser_monitor_unico"
"Figata, non ci avevo pensato :D" mi sono detto.
Dopo ore che non riesco a buttar giù nulla di concreto sono di nuovo da te con la coda fra le gambe a chiedere aiuto soprattutto perchè un conto è eriditare la classe "uomo" dalla classe "mammiferi" mentre un altro è dover lavorare con la casella di testo xxx e con il pulsante yyy.
Ah, altra cosa: io ero sempre stato abituato a ragionare in Java e non in vb.net ed inoltre in java non ho praticamente mai usato le interfaccie grafiche.
Allora sto benedetto form è abbastanza semplice
Ha un controllo webbrowser con i pulsanti per andare avanti/indietro/refresh/vai alla url/stampa.
C'è un Filesystemwatcher, ci sono delle txt da riempire e altri 5 pulsanti che fondamentalmente scrivono delle cose sulla banca dati.
Browser_monitor_unico ha una interfaccia a schede (una è quella col webbrowser, l'altra è quella "ricette" dove c'è una picturebox, un paio di tasti e un altro webbrowser) e un backgroundworker, altrimenti ci sono 2 form distinti "Browser_multi_monitor"(col webbrowser ma senza interfaccia a schede) e "ricette" che ha il backgroundworker
Esempio di codice di un tasto
Codice:
Private Sub cmdClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdClose.Click
Dim result As DialogResult = MessageBox.Show("Sei sicuro di voler chiudere correttamente la chiamata?", "Warning", MessageBoxButtons.YesNo)
If (result = DialogResult.Yes) Then
GL_sSessione.PStato = "CL"
Try
GL_sSessione.Update_Sessione()
GL_sSessione.Inserisci_Comando(GL_sSessione.PChiave, "CLS", DBNull.Value, DBNull.Value)
Catch ex As Exception
MsgBox("Si è verificato un errore durante la chiusura della sessione. Controllare la connessione sql. Grazie.")
Exit Sub
End Try
MsgBox("La chiamata n°" & GL_sSessione.PChiave & " è stata chiusa con successo")
Me.Close()
Menu_Iniziale.Show()
End If
End Sub
dove GL_sSessione è un oggetto della Classe Sessione dove sono memorizzate varie informazioni come la data, l'oggetto etc... che poi sono le cose da scrivere nelle varie txt di cui sopra.
Comincio: Provo a fare una nuova windows form (chiamiamola prova) che erediti da Browser_monitor_unico
Codice:
Public Class Prova
Inherits Browser_monitor_unico
End Class
Errore.
La classe base 'Browser_monitor_unico' specificata per la classe 'Prova' non può essere differente dalla classe base 'System.Windows.Forms.Form' di uno degli altri tipi parziali.
Applico la correzione "Cambiare la classe Prova per ereditare da Browser_monitor_unico"
Se provo ad andare nella progettazione mi da mille mila errori tra i quali il più frequente è "Riferimento a un oggetto non impostato su un'istanza di oggetto" e nello stack chiamate si fa riferimento alla seguente riga
txtSessione.Text = GL_sSessione.PChiave
dove GL_sSessione.PChiave è il metodo della classe Sessione che mi restituisce il valore "chiave"
GL_sSessione è dichiarata in un modulo chiamato "Costanti" ed è instanziata nella prima maschera dove l'utente fa login con il seguente codice
GL_sUser = New Utente(dr("Centro"), dr("Utente"), dr("Livello"), dr("Locale"))
dove dr è il dataread che va a leggere la tabella degli utenti.
:uhm:
-
Riferimento: [.net] apertura e chiusura dei form
Citazione:
Originariamente Scritto da
Frykky
Vedi il problema è uno: che all'università e nella teoria si fanno sempre esempi inutili tipo "classe rettangolo eredita da classe poligono" poi quando si arriva a fare le cose concrete non sempre è facile applicare le nozioni.
Soprattutto se uno è uno zuccone come me.
Te mi hai detto "fai una classe BrowserBase coi suoi metodi che poi verranno ereditati ed eventualmente riscritti dalle 2 classi Browser_multi_monitor e Browser_monitor_unico"
"Figata, non ci avevo pensato :D" mi sono detto.
Dopo ore che non riesco a buttar giù nulla di concreto sono di nuovo da te con la coda fra le gambe a chiedere aiuto soprattutto perchè un conto è eriditare la classe "uomo" dalla classe "mammiferi" mentre un altro è dover lavorare con la casella di testo xxx e con il pulsante yyy.
Purtroppo è una di quelle cose che spiegare così su sul forum, senza potertelo fare vedere con Visual Studio davanti e senza "botta e risposta" immediato, ci si mette un secolo e ci si confondono le idee, ma non è poi tanto più complicato di "mammifero->uomo"
Citazione:
Comincio: Provo a fare una nuova windows form (chiamiamola prova) che erediti da Browser_monitor_unico
Codice:
Public Class Prova
Inherits Browser_monitor_unico
End Class
Errore.
La classe base 'Browser_monitor_unico' specificata per la classe 'Prova' non può essere differente dalla classe base 'System.Windows.Forms.Form' di uno degli altri tipi parziali.
Non è il modo corretto quando lo applichi ad una form piuttosto che a classi tradizionali; le prime volte ti conviene lasciar fare al wizard di visual studio così puoi vedere bene che tipo di codice genera.... vai quindi nel menù 'Project->Add Windows Form' e nella sezione 'Windows Forms' della finestra dei template scegli 'Inherited Form' e dopo la finestra da cui derivare... vedrai che ti genera tutto il blocco di codice necessario a cominciare
-
Riferimento: [.net] apertura e chiusura dei form
benissimo non ho quel template.
e googlando un po' ho visto che in tanti hanno il mio problema ma il drammatico è che non ho trovato soluzioni.
Ti faccio sapere
-
Riferimento: [.net] apertura e chiusura dei form
Citazione:
Originariamente Scritto da
Frykky
Allora sto benedetto form è abbastanza semplice
Ha un controllo webbrowser con i pulsanti per andare avanti/indietro/refresh/vai alla url/stampa.
C'è un Filesystemwatcher, ci sono delle txt da riempire e altri 5 pulsanti che fondamentalmente scrivono delle cose sulla banca dati.
Browser_monitor_unico ha una interfaccia a schede (una è quella col webbrowser, l'altra è quella "ricette" dove c'è una picturebox, un paio di tasti e un altro webbrowser) e un backgroundworker, altrimenti ci sono 2 form distinti "Browser_multi_monitor"(col webbrowser ma senza interfaccia a schede) e "ricette" che ha il backgroundworker
Se l'applicazione è strutturata così, potresti anche dare un'occhiata ad un altro tipo di approccio, che non richiede ereditarietà, ma ti permette di avere una sola copia delle form e sfruttarle in entrambi i casi.
Puoi farlo sfruttando la caratteristica delle Windows Form che permette di poterle aprire come figlie di un contenitore, il che ti mette in grado di fare tutta una serie di trucchetti simpatici....
Anche qui è più facile vederlo che non spiegarlo a parole, per cui prova a scaricare questo piccolo esempio (fatto con VS 2008 Dev Edition, ma dovrebbe andare anche su un semplice VB 2008 Express):
http://www.megaupload.com/?d=6V3B2SIN
Il codice è piuttosto breve e semplice, il succo è tutto nei due pulsanti di mainForm e in ContainerUnicoForm_Load()... chiaramente è solo un punto di partenza
-
Riferimento: [.net] apertura e chiusura dei form
Citazione:
Originariamente Scritto da
Frykky
benissimo non ho quel template.
e googlando un po' ho visto che in tanti hanno il mio problema ma il drammatico è che non ho trovato soluzioni.
Ti faccio sapere
Senza template dovresti riuscirci a mano così:
- fai una finestra vuota
- scegli l'opzione per mostrare i file nascosti del progetto
- apri il file <nome form nuova>.designer.vb
- sostituisci il codice esistente con quello che segue
Codice:
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class <NOME FORM NUOVA>
Inherits <NOME FORM BASE>
'Form overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
components = New System.ComponentModel.Container
End Sub
End Class
questo codice è neutro e dovrebbe andare bene come partenza ogni volta che vuoi derivare una form, con l'unica accortezza di modificare i due nomi in grassetto di volta in volta.
-
Riferimento: [.net] apertura e chiusura dei form
No, continuo ad avere il solito errore
http://img534.imageshack.us/img534/7950/erroref.th.jpg
la riga 25 te la riscrivo è
Codice:
txtSessione.Text = GL_sSessione.PChiave
Ripeto quel GL_Sessione è dichiarato nel modulo "Costanti" in questo modo
Public GL_sSessione As Sessione
dichiarato in questo modo per renderlo globale a tutti i form.
Ma sono sicuro che è una porcata che mi porto dietro da vb6 e che possiamo sicuramente eliminare in modo più elegante :asd:
-
Riferimento: [.net] apertura e chiusura dei form
Citazione:
Originariamente Scritto da
Frykky
No, continuo ad avere il solito errore
la riga 25 te la riscrivo è
Codice:
txtSessione.Text = GL_sSessione.PChiave
Ripeto quel GL_Sessione è dichiarato nel
modulo "Costanti" in questo modo
Public GL_sSessione As Sessione
dichiarato in questo modo per renderlo globale a tutti i form.
Ma sono sicuro che è una porcata che mi porto dietro da vb6 e che possiamo sicuramente eliminare in modo più elegante :asd:
Quando cominci ad usare l'ereditarietà tra form, devi sempre tenere presente questo: l'evento Load di una form base può essere scatenato anche a programma fermo se entri nel design visuale della finestra figlia
Nel tuo caso vedi che hai una variabile dichiarata ma non ancora inizializzata (immagino lo farai nella Sub Main o nel Load della form principale) che viene chiamata inaspettatamente proprio per quel motivo.
La soluzione (che puoi applicare a tappeto senza controindicazioni a tutte le form, che potenzialmente potrebbero essere derivate un domani) è di racchiudere tutto il codice degli eventi Form_load con:
If Not Me.DesignMode Then
'tutto il resto
End If
-
Riferimento: [.net] apertura e chiusura dei form
sei il numero uno.
ho fatto la classe browserbase e la classe browsermonitorunico che eredita da browserbase.
Browsermonitordoppio credo che non la farò dato che mi va bene quella "base". Tanto grazie a te sono sempre in tempo a cambiare senza dover faticare troppo :rullezza:
ora torniamo a noi e al nostro problema di partenza. Dal Form "annulla" qual'è l'istruzione per chiudere il "browser" corretto?
Perchè io ho provato a mettere nella classe browserbase un
Codice:
Private Sub Annulla_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Annulla.FormClosed
Me.Close()
End Sub
come avevamo fatto con l'altra ma mi da errore "Errore durante la creazione dell'handle della finestra."
Forse mi ero dimenticato di dirti che Annulla è una Finestra di dialogo? :look:
-
Riferimento: [.net] apertura e chiusura dei form
Citazione:
Originariamente Scritto da
Frykky
ora torniamo a noi e al nostro problema di partenza. Dal Form "annulla" qual'è l'istruzione per chiudere il "browser" corretto?
Perchè io ho provato a mettere nella classe browserbase un
Codice:
Private Sub Annulla_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Annulla.FormClosed
Me.Close()
End Sub
come avevamo fatto con l'altra ma mi da errore "Errore durante la creazione dell'handle della finestra."
Forse mi ero dimenticato di dirti che Annulla è una Finestra di dialogo? :look:
Devi fare il contarrio... è Annulla che deve conoscere il browser corretto da chiudere, quindi il codice va inserito solo li
Ad esempio puoi aggiungere un costruttore aggiuntivo alla finestra al quale passerai un riferimento a BrowserBase (che quindi può rappresentare l'uno o l'altro, essendo "imparentati")
Codice:
'Nella form Annulla
Private browserCorrente As BrowserBase
Public Sub New (browser As BrowserBase)
Me.New()
browserCorrente = browser
End Sub
Private Sub Annulla_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Annulla.FormClosed
browserCorrente.Close()
End Sub
questa finestra verrà quindi invocata a seconda dei casi con
Dim a As New FormAnnulla(browserBase)
oppure
Dim a As New FormAnnulla(browserUnico)
e quindi il normale
a.ShowDialog()
-
Riferimento: [.net] apertura e chiusura dei form
Non mi ero fatto sentire ma ovviamente funziona eh!
L'unica cosa è che ho dovuto cambiare "
Handles Annulla.FormClosed" in "Handles Me.FormClosed" ;)
Se ho altri dubbi posso scocciarti ancora?
-
Riferimento: [.net] apertura e chiusura dei form
Per esempio, nell'ambito dell'ottimizzazione del mio codice, non posso non notare che il famoso browser_monitor_unico non è altro che browserbase+una nuova tab nel tab control che contiene paro paro "ricette".
E' possibile anche in questo caso fare qualcosa? altrimenti ad ogni modifica mi trovo a dover riscrivere lo stesso codice 2 volte!
e poi un'altra cosa:
all'uscita del browserbase io vorrei cancellare dei file ma ricevo sempre l'eccezione IOException perchè il file risulta aperto. Ho provato a fare
Codice:
Me.Dispose()
Me.Close
oppure in
Codice:
Private Sub Browser_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs)
Handles Browser.FormClosed
fare
Codice:
Browser.Dispose()
Browser = Nothing
ma nulla
-
Riferimento: [.net] apertura e chiusura dei form
Citazione:
Originariamente Scritto da
Frykky
Per esempio, nell'ambito dell'ottimizzazione del mio codice, non posso non notare che il famoso browser_monitor_unico non è altro che browserbase+una nuova tab nel tab control che contiene paro paro "ricette".
E' possibile anche in questo caso fare qualcosa? altrimenti ad ogni modifica mi trovo a dover riscrivere lo stesso codice 2 volte!
Vedi l'esempio da scaricare più sopra
Citazione:
e poi un'altra cosa:
all'uscita del browserbase io vorrei cancellare dei file ma ricevo sempre l'eccezione IOException perchè il file risulta aperto. Ho provato a fare
...
Tu stai provando a rilasciare le risorse dell'oggetto form ma è il file da cancellare che risulta impegnato... vai a rivedere il codice dove crei/apri questo file e assicurati di averlo chiuso correttamente.
Se poi il file in questione può anche essere aperto dall'utente al di fuori del tuo programma (che ne so, è un txt o una immagine o qualcos'altro associato a software installati) allora devi sempre prevedere la possibilità che sia in uso e che tu non ci possa fare niente... ovvero devi gestire l'eccezione con un blocco try...catch
-
Riferimento: [.net] apertura e chiusura dei form
Mica l'avevo visto il post con l'esempio scusami :facepalm:
E' super mega bellissimissimo perfettissimo http://im0.freeforumzone.it/up/0/36/4286744.gif
Ora cerco di chiudere tutto correttamente e ti dico :rullezza:
-
Riferimento: [.net] apertura e chiusura dei form
ho un'altro problema abbastanza grosso:
ho sviluppato questa applicazione con vista che ha la cartella programmi in "program files".
L'applicazione a volte lancia altri programmi e io facevo
Process.Start("C:\Program files\.....")
sono andato a installarla su un pc con XP e mi ha dato mille errori perchè su XP la cartella Programmi è in C:\Programmi.
Allora ho modificato il codice in
Process.Start(Environment.GetFolderPath(Environmen t.SpecialFolder.ProgramFiles) & "\.....")
e funziona.
Ora ho un problema ancora più grosso. L'applicazione utilizza una libreria che risiede, guardacaso :asd:, nella cartella programmi. Se compilo l'applicazione su vista e la installo su XP non funziona perchè non trova il riferimento.
Come si può ovviare a questo problema?
-
Riferimento: [.net] apertura e chiusura dei form
ok ho capito che basta distribuire la dll e tutto torna magicamente a funzionare :ok:
Mi rimane il problema dell'impossibilità di cancellare quel dannato file.
Prima mettevo questo codice
Codice:
Try
Dim i = 0
Dim DirectoryInfoMyFolderImg As New DirectoryInfo(MyFolderImg)
While i < DirectoryInfoMyFolderImg.GetFiles(GL_sSessione.PChiave & "*.jpg").Length
My.Computer.FileSystem.DeleteFile(DirectoryInfoMyFolderImg.GetFiles(GL_sSessione.PChiave & "*.jpg")(i).FullName)
i = i + 1
End While
Catch ex As Exception
End Try
in Private Sub Browser_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles FormSessione.FormClosed
ma nulla. Pensavo che fosse perchè il form non era ancora del tutto chiuso quindi l'ho messo nell'evento Activated del form iniziale.
Ma ancora nulla.......
-
Riferimento: [.net] apertura e chiusura dei form
Citazione:
Originariamente Scritto da
Frykky
Mi rimane il problema dell'impossibilità di cancellare quel dannato file.
Intanto, puoi semplificare il codice di cancellazione così:
Codice:
Try
Dim DirectoryInfoMyFolderImg As New DirectoryInfo(MyFolderImg)
For Each fi As IO.FileInfo In DirectoryInfoMyFolderImg.GetFiles(GL_sSessione.PChiave & "*.jpg")
fi.Delete()
Next
Catch ex As Exception
Debug.Print(ex.Message)
End Try
Detto questo, se l'errore che hai è di "acceso negato" o simili, come dicevo in un altro messaggio, il problema sarà a monte: La questione non è dove metti il codice di cancellazione, ma il fatto che da qualche altra parte nel codice evidentemente questa immagine viene creata/aperta in qualche modo e le risorse non rilasciate
Prima verifica che le hai rilasciate correttamente l'immagine, poi la cancelli
-
Riferimento: [.net] apertura e chiusura dei form
-
Riferimento: [.net] apertura e chiusura dei form
Larsen scusami tanto ma non so più dove sbattere la testa :bua:
All'apertura di "Ricette" parte un BackgrounWorker che scarica via ftp delle immagini, le mette in un arrayList e poi le passa al picturebox.
All'uscita del form ho provato a scrivere tutte queste istruzioni
Codice:
Ricette.PictureBox.Dispose()
Ricette.PictureBox = Nothing
Ricette.ImgArray.Clear()
Ricette.ImgArray = Nothing
Ricette.Dispose()
Ricette.Close()
Ricette = Nothing
l'ultima prova che ho fatto è stata mettere nella sub "BkgWrk_RunWorkerCompleted"
Codice:
BkgWrk.CancelAsync()
Niente.
Continuo a ricevere "Il processo non può accedere al file '5_1.jpg' perché è in uso da un altro processo."
:frigna:
-
Riferimento: [.net] apertura e chiusura dei form
Citazione:
Originariamente Scritto da
Frykky
Larsen scusami tanto ma non so più dove sbattere la testa :bua:
All'apertura di "Ricette" parte un BackgrounWorker che scarica via ftp delle immagini, le mette in un arrayList e poi le passa al picturebox.
All'uscita del form ho provato a scrivere tutte queste istruzioni
Codice:
Ricette.PictureBox.Dispose()
Ricette.PictureBox = Nothing
Ricette.ImgArray.Clear()
Ricette.ImgArray = Nothing
Ricette.Dispose()
Ricette.Close()
Ricette = Nothing
Continuo a ricevere "Il processo non può accedere al file '5_1.jpg' perché è in uso da un altro processo."
:frigna:
Dunque, ne' il PictureBox ne' l'ArrayList possono tenere bloccati i file (l'array list immagino contenga solo i percorsi degli stessi, mentre il PictureBox carica l'immagine in memoria ma non tiene mai bloccato il file sottostante)
Quindi il sospettato principale è il codice che fa lo scaricamento FTP, e potrebbe essere li il problema; non so esattamente che sistema hai usato, ma controlla per esempio se ci sono oggetto Stream non chiusi...
-
Riferimento: [.net] apertura e chiusura dei form
Ci rinuncio.
Le ho provate di tutte e funziona random.
Ho provato a spostare il codice su di un pulsante ed ha funzionato solo la prima volta.
Una volta non ha funzionato, ho lasciato passare qualche secondo e poi è andato.
Altre N mi ha dato errore.
Ho provato a mettere il codice sul tasto di uscita dal programma e nulla.
Vorrà dire che l'utente se le cancellerà a mano eh cribbio
-
Riferimento: [.net] apertura e chiusura dei form
Sempre nell'ambito dell'otimizzazione del mio codice (:rullezza:) ho tolto l'opzione "Option Strict -> OFF".
102 errori :asd:
Ho corretto tutti i Cast da Object a String utilizzando il tostring.
Adesso mi rimangono 28 errori molto simili ovvero Cast da Object a Short/Date/Boolean etc..
Questo perchè il mio programma fa una query sul server e crea un oggetto della classe facendo (esempio)
Codice:
GL_sUser = New Utenti(dr("Centro").ToString, dr("Utente").ToString, dr("Livello"), dr("Locale"))
Ora Locale vuole un valore booleano. L'IDE mi suggerisce di scrivere
Codice:
CBool(dr("Locale"))
e di conseguenza CShort, Cdate etc....
ma volevo sapere se è corretto :)
Altra cosa.
E' possibile parametrizzare l'arraylist a "Image"?
Mi sa di no vero?