Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    VB-NET Form figlie

    Ciao a tutti!
    Ho tre form figlie e passo da una all'altra normalmente. Il mio dilemma è perchè quando carico una Form mi si ripresenta nello stesso identico stato di quando l'avevo lasciata.
    Non c'è possibilità di azzerare le sue variabili o, meglio ancora, farla partire coi soli dati del FormLoad come alla sua prima apertura?

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    I tuoi Form sono definiti da una classe, che ne indica le caratteristiche (proprietà) e il comportamento (metodi).

    Quando intendi utilizzare un Form, devo creare un'istanza.

    Il tuo problema è che, evidentemente, stai utilizzando sempre la stessa istanza del Form che hai creato, mentre devi istanziarne una nuova (usando New) per ricrearla con le impostazioni predefinite, pur preservandone tutte le suddette caratteristiche (capacità) che sono definite dalla classe di cui l'istanza è una rappresentazione.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Puoi anche azzerare tutto rilasciando le risorse dopo che hai chiuso il form:

    codice:
    form.close
    form.dispose
    Quando la riaprirai sarà di nuovo la prima apertura.

  4. #4
    Le ho provate in tutte le salse! Magari è una stupidata ma non riesco a inserire Close e Dispose, mi dà sempre errore. Posto il codice, così mi dite dove cavolo sbaglio!
    Un grazie anticipato!

    Public Class Form1
    Public Forms(3) As Form
    Dim casuale, i As Integer
    Dim total_forms As Integer

    '------------------------------------------------------------------
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Forms(1) = Form2
    Forms(2) = Form3
    Forms(3) = Form4

    total_forms = 3

    For Me.i = 1 To total_forms
    Forms(Me.i).MdiParent = Me
    Forms(Me.i).Text = "Sono il FORM N. " & i.ToString
    Next

    Randomize()
    casuale = CInt(Int((total_forms * Rnd()) + 1))
    Forms(casuale).WindowState = FormWindowState.Maximized
    Forms(casuale).Show()

    End Sub

    '------------------------------------------------------------------
    Private Sub EsciToolStripMenuItem_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EsciToolStripMenuItem.Click
    End
    End Sub

    '------------------------------------------------------------------
    Private Sub CambiaFormToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CambiaFormToolStripMenuItem.Click
    Randomize()
    casuale = CInt(Int((total_forms * Rnd()) + 1))
    Forms(casuale).WindowState = FormWindowState.Maximized
    Forms(casuale).Show()

    For Me.i = 1 To total_forms
    If Me.i <> casuale Then
    'Forms(Me.i).Close()
    'Forms(Me.i).Dispose()
    End If
    Next
    End Sub
    End Class

    '------------------------------------------------------------------

    Public Class Form2

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Randomize()
    Dim numeroacaso As Int16 = CInt(Int((1000 * Rnd()) + 1))
    Label1.Text = numeroacaso.ToString
    End Sub
    End Class

    '------------------------------------------------------------------
    Public Class Form3

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Randomize()
    Dim numeroacaso As Int16 = CInt(Int((1000 * Rnd()) + 1))
    Label1.Text = numeroacaso.ToString
    End Sub
    End Class

    '------------------------------------------------------------------
    Public Class Form4

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Randomize()
    Dim numeroacaso As Int16 = CInt(Int((1000 * Rnd()) + 1))
    Label1.Text = numeroacaso.ToString
    End Sub
    End Class

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da sergiobarbi
    Le ho provate in tutte le salse! Magari è una stupidata ma non riesco a inserire Close e Dispose, mi dà sempre errore. Posto il codice, così mi dite dove cavolo sbaglio!
    Il tuo problema è che accedi ai Form usando lo stile VB6, che sconsiglio vivamente e - almeno in ambito .NET - è foriero di parecchi errori e "strane pratiche".

    Non usare il nome della classe come se fosse un'istanza.

    Per creare e utilizzare il Form, la scrittura formalmente corretta è simile a questa:

    codice:
    ' Campo che contiene i riferimenti ai Form correlati
    Public Forms(3) As Form
    ...
    
    ' Crea un'istanza del Form1
    Forms(1) = New Form1()
    ...
    
    ' Utilizza il riferimento per visualizzare la finestra
    Forms(1).Show()
    ...
    
    ' Chiude la finestra e rilascia le risorse allocate
    Forms(1).Close()
    Forms(1) = Nothing
    
    ' Crea una nuova istanza della finestra
    Forms(1) = New Form1()
    ...
    P.S.: usa il tag [CODE], come da Regolamento, per formattare il codice sorgente.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  6. #6
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Tra l'altro, in aggiunta a quanto indicato da alka.

    1) Attento che l'istruzione

    Public Forms(3) As Form

    crea 4 Form, perchè l'indice è base 0 quindi avrai: 0, 1, 2 e 3

    2)
    Ti consiglio vivamente di impostare come default su tutti i tuoi progetti
    Option Strict su ON
    per evitare errori del tipo:

    Dim numeroacaso As Int16 = CInt (Int((1000 * Rnd()) + 1))

    l'istruzione corretta è (ma avendo Option Strict su OFF non te lo segnala):
    Dim numeroacaso As Integer = CInt(Int((1000 * Rnd()) + 1))


  7. #7
    Grazie alka, grazie gibra!
    Nothing era quello che mi ci voleva. Adesso funziona. Approfitto comunque per chiedervi a caldo una precisazione.
    Io sono costretto a creare le istanze sempre in questo modo?

    Forms(1) = New Form2()
    Forms(2) = New Form3()
    Forms(3) = New Form4()

    Perchè così invece:
    Forms(1) = New Form2()
    Forms(2) = New Form2()
    Forms(3) = New Form2()

    mi esegue sempre le istruzioni del Form2 anche per i Forms(2) e Forms(3). Giusto?

    La mia domanda quindi è questa.
    Se io avessi parecchi Form devo elencarli tutti o c'è un modo più sbrigativo per creare le istanze Form (per es. un ciclo For-Next)???
    Grazie ancora e abbiate pazienza. Ciao
    sergio

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da sergiobarbi
    Se io avessi parecchi Form devo elencarli tutti o c'è un modo più sbrigativo per creare le istanze Form (per es. un ciclo For-Next)???
    Puoi usare anche un ciclo.

    Il nostro esempio non ne faceva uso in quanto, sebbene tu abbia memorizzato i riferimenti dei Form creati in un array, non era chiaro se il numero e il tipo di questi Form era conosciuto a priori, oppure se era indefinito e modificabile a runtime.

    Se il tuo programma prevede la creazione indiscriminata di tante copie dello stesso tipo di Form, allora puoi usare strutture dati appropriate per memorizzarne i riferimenti (ad esempio, una List(Of Form1), per dirne una), anche diverse da un semplice array.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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.