Pag 1 di 2 12 UltimaUltima
Risultati da 1 a 25 di 31
  1. #1
    Shogun Assoluto L'avatar di Frykky
    Data Registrazione
    07-10-01
    Località
    Firenze
    Messaggi
    49,744

    Predefinito [.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
    Certo funziona ma anche qua vorrei sapere se c'è qualcosa di più elegante.

    Grazie

  2. #2
    Il Nonno
    Data Registrazione
    29-07-02
    Messaggi
    4,733

    Predefinito Riferimento: [.net] apertura e chiusura dei form

    Citazione Originariamente Scritto da Frykky Visualizza Messaggio
    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
    Certo funziona ma anche qua vorrei sapere se c'è qualcosa di più elegante.

    Grazie
    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

  3. #3
    Shogun Assoluto L'avatar di Frykky
    Data Registrazione
    07-10-01
    Località
    Firenze
    Messaggi
    49,744

    Predefinito 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?
    Ultima modifica di Frykky; 22-03-10 alle 14:58:51

  4. #4
    Il Nonno
    Data Registrazione
    29-07-02
    Messaggi
    4,733

    Predefinito Riferimento: [.net] apertura e chiusura dei form

    Citazione Originariamente Scritto da Frykky Visualizza Messaggio
    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...

    Facciamo un esempiuccio?
    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

  5. #5
    Shogun Assoluto L'avatar di Frykky
    Data Registrazione
    07-10-01
    Località
    Firenze
    Messaggi
    49,744

    Predefinito 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 " 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.

    Ultima modifica di Frykky; 24-03-10 alle 18:33:52

  6. #6
    Il Nonno
    Data Registrazione
    29-07-02
    Messaggi
    4,733

    Predefinito Riferimento: [.net] apertura e chiusura dei form

    Citazione Originariamente Scritto da Frykky Visualizza Messaggio
    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 " 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"

    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

  7. #7
    Shogun Assoluto L'avatar di Frykky
    Data Registrazione
    07-10-01
    Località
    Firenze
    Messaggi
    49,744

    Predefinito 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

  8. #8
    Il Nonno
    Data Registrazione
    29-07-02
    Messaggi
    4,733

    Predefinito Riferimento: [.net] apertura e chiusura dei form

    Citazione Originariamente Scritto da Frykky Visualizza Messaggio
    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

  9. #9
    Il Nonno
    Data Registrazione
    29-07-02
    Messaggi
    4,733

    Predefinito Riferimento: [.net] apertura e chiusura dei form

    Citazione Originariamente Scritto da Frykky Visualizza Messaggio
    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.
    Ultima modifica di LarsenB; 25-03-10 alle 15:04:40

  10. #10
    Shogun Assoluto L'avatar di Frykky
    Data Registrazione
    07-10-01
    Località
    Firenze
    Messaggi
    49,744

    Predefinito Riferimento: [.net] apertura e chiusura dei form

    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
    Ultima modifica di Frykky; 25-03-10 alle 18:39:53

  11. #11
    Il Nonno
    Data Registrazione
    29-07-02
    Messaggi
    4,733

    Predefinito Riferimento: [.net] apertura e chiusura dei form

    Citazione Originariamente Scritto da Frykky Visualizza Messaggio
    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
    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

  12. #12
    Shogun Assoluto L'avatar di Frykky
    Data Registrazione
    07-10-01
    Località
    Firenze
    Messaggi
    49,744

    Predefinito 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

    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?
    Ultima modifica di Frykky; 26-03-10 alle 18:23:48

  13. #13
    Il Nonno
    Data Registrazione
    29-07-02
    Messaggi
    4,733

    Predefinito Riferimento: [.net] apertura e chiusura dei form

    Citazione Originariamente Scritto da Frykky Visualizza Messaggio
    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?
    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()
    Ultima modifica di LarsenB; 26-03-10 alle 21:58:50

  14. #14
    Shogun Assoluto L'avatar di Frykky
    Data Registrazione
    07-10-01
    Località
    Firenze
    Messaggi
    49,744

    Predefinito 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?

  15. #15
    Shogun Assoluto L'avatar di Frykky
    Data Registrazione
    07-10-01
    Località
    Firenze
    Messaggi
    49,744

    Predefinito 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
    Ultima modifica di Frykky; 01-04-10 alle 19:12:06

  16. #16
    Il Nonno
    Data Registrazione
    29-07-02
    Messaggi
    4,733

    Predefinito Riferimento: [.net] apertura e chiusura dei form

    Citazione Originariamente Scritto da Frykky Visualizza Messaggio
    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

    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

  17. #17
    Shogun Assoluto L'avatar di Frykky
    Data Registrazione
    07-10-01
    Località
    Firenze
    Messaggi
    49,744

    Predefinito Riferimento: [.net] apertura e chiusura dei form

    Mica l'avevo visto il post con l'esempio scusami

    E' super mega bellissimissimo perfettissimo

    Ora cerco di chiudere tutto correttamente e ti dico

  18. #18
    Shogun Assoluto L'avatar di Frykky
    Data Registrazione
    07-10-01
    Località
    Firenze
    Messaggi
    49,744

    Predefinito 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 , 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?

  19. #19
    Shogun Assoluto L'avatar di Frykky
    Data Registrazione
    07-10-01
    Località
    Firenze
    Messaggi
    49,744

    Predefinito Riferimento: [.net] apertura e chiusura dei form

    ok ho capito che basta distribuire la dll e tutto torna magicamente a funzionare

    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.......

  20. #20
    Il Nonno
    Data Registrazione
    29-07-02
    Messaggi
    4,733

    Predefinito Riferimento: [.net] apertura e chiusura dei form

    Citazione Originariamente Scritto da Frykky Visualizza Messaggio
    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

  21. #21
    Shogun Assoluto L'avatar di Frykky
    Data Registrazione
    07-10-01
    Località
    Firenze
    Messaggi
    49,744

    Predefinito Riferimento: [.net] apertura e chiusura dei form

    ....
    Ultima modifica di Frykky; 08-04-10 alle 01:25:52

  22. #22
    Shogun Assoluto L'avatar di Frykky
    Data Registrazione
    07-10-01
    Località
    Firenze
    Messaggi
    49,744

    Predefinito Riferimento: [.net] apertura e chiusura dei form

    Larsen scusami tanto ma non so più dove sbattere la testa

    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."


  23. #23
    Il Nonno
    Data Registrazione
    29-07-02
    Messaggi
    4,733

    Predefinito Riferimento: [.net] apertura e chiusura dei form

    Citazione Originariamente Scritto da Frykky Visualizza Messaggio
    Larsen scusami tanto ma non so più dove sbattere la testa

    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."

    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...

  24. #24
    Shogun Assoluto L'avatar di Frykky
    Data Registrazione
    07-10-01
    Località
    Firenze
    Messaggi
    49,744

    Predefinito 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

  25. #25
    Shogun Assoluto L'avatar di Frykky
    Data Registrazione
    07-10-01
    Località
    Firenze
    Messaggi
    49,744

    Predefinito Riferimento: [.net] apertura e chiusura dei form

    Sempre nell'ambito dell'otimizzazione del mio codice () ho tolto l'opzione "Option Strict -> OFF".
    102 errori

    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?

Pag 1 di 2 12 UltimaUltima

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  • Il codice BB è Attivato
  • Le faccine sono Attivato
  • Il codice [IMG] è Attivato
  • Il codice HTML è Disattivato