Pagina 3 di 3 primaprima 1 2 3
Visualizzazione dei risultati da 21 a 30 su 30
  1. #21
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Originariamente inviato da GhostFire
    Scusa ma perchè hai istanziato il Form1?
    Perché questo è ciò che si fa quando si programma ad oggetti.

    Originariamente inviato da GhostFire
    in VB basta semplicemente inserire Form1.Show()
    Sì, ed è una cosa aberrante, introdotta da Microsoft affinché gli sviluppatori VB6 continuino a trattare VB.NET allo stesso modo, senza comprendere come funziona la programmazione ad oggetti, e quindi autolimitandosi, introducendo poi altri problemi.

    Originariamente inviato da GhostFire
    cambiando questo dovresti aver risolto...a me in questo modo funziona.
    "Funziona" non è necessariamente sinonimo di correttezza.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  2. #22
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    455
    Originariamente inviato da alka
    Perché questo è ciò che si fa quando si programma ad oggetti.


    Sì, ed è una cosa aberrante, introdotta da Microsoft affinché gli sviluppatori VB6 continuino a trattare VB.NET allo stesso modo, senza comprendere come funziona la programmazione ad oggetti, e quindi autolimitandosi, introducendo poi altri problemi.



    "Funziona" non è necessariamente sinonimo di correttezza.
    Allora in questo caso...

    ecco la soluzione che penso sia corretta, visto che istanzia il form.

    Allora:

    Nel MdiChild dichiari una variabile pubblica del Form1:

    codice:
    Public NewForm1 as new Form1()
    nel tasto File\Nuovo metti questo:

    codice:
        Private Sub ShowNewForm(ByVal sender As Object, ByVal e As EventArgs) Handles NewToolStripMenuItem.Click, NewToolStripButton.Click, NewWindowToolStripMenuItem.Click
    
            Dim frm As New Form()
            frm = NewForm1
    
            frm.Show()
    
        End Sub
    dopo nel form Popup sul pulsante metti questo:

    codice:
        Private Sub cmdInviaDati_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdInviaDati.Click
            MDIParent1.NewForm1.txtProfessionista.Text = Me.txtNominativo.Text
            Me.Close()
        End Sub
    La mia conclusione è:

    Dovevi accedere ai controlli tramite istanza e non tramite il Form1 di base.

  3. #23
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Originariamente inviato da GhostFire
    codice:
        Private Sub ShowNewForm(ByVal sender As Object, ByVal e As EventArgs) Handles NewToolStripMenuItem.Click, NewToolStripButton.Click, NewWindowToolStripMenuItem.Click
    
            Dim frm As New Form()
            frm = NewForm1
    
            frm.Show()
    
        End Sub
    Il codice sopra è sbagliato: non ha senso fare New per creare un oggetto, assegnarlo a una variabile (frm) e poi sovrascrivere il valore con NewForm1.

    Meglio dichiarare semplicemente il Form secondario così:
    codice:
    Public SecondFormInstance As SecondForm
    dove SecondForm è il nome del Form, cioè della sua classe, e SecondFormInstance è il nome della variabile che conterrà il suo riferimento quando la finestra verrà effettivamente creata.

    Nel pulsante di visualizzazione della finestra, per crearla e mostrarla è sufficiente scrivere
    codice:
        Private Sub ShowNewForm(ByVal sender As Object, ByVal e As EventArgs) Handles NewToolStripMenuItem.Click, NewToolStripButton.Click, NewWindowToolStripMenuItem.Click
    
            ' Creo il Form se non è stato ancora istanziato
            If SecondFormInstance Is Nothing Then
                  SecondFormInstance = New SecondForm()
            End If
    
            ' Visualizzo il Form
            SecondFormInstance.Show()
    
        End Sub
    Ogni volta che si deve fare riferimento alla finestra o ai suoi membri (es. controlli visuali), occorre farlo attraverso il campo pubblico che contiene il riferimento, cioè SecondFormInstance.

    In merito a questa implementazione:
    codice:
        Private Sub cmdInviaDati_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdInviaDati.Click
            MDIParent1.NewForm1.txtProfessionista.Text = Me.txtNominativo.Text
            Me.Close()
        End Sub
    è più corretto passare alla finestra secondaria un riferimento a quella chiamante, piuttosto che interagire l'una con l'altra e viceversa tramite membri pubblici: più vi sono elementi accessibili all'esterno, più si riduce l'incapsulazione e si aumentano le possibilità di errori logici.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  4. #24
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    354
    Rieccomi, tornato dopo le ferie.

    allora, grazie per il codice alka, ma purtroppo non ne vuole sapere

    o meglio, ho provato a mettere:

    codice:
    Public SecondFormInstance As SecondForm
    però mi dice errore "La classe MDIParent1.SecondForm non può essere indicizzata percè non contine proprietà predefinite."

    se invece la giro in:

    codice:
    Public SecondFormInstance As New SecondForm
    mi toglie l'errore...ma comunque, facendo girare il programmino non mi va a passare i dati dal SecondFormIstance su Form1...

  5. #25
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Originariamente inviato da Folcus
    ho provato a mettere:
    codice:
    Public SecondFormInstance As SecondForm
    però mi dice errore "La classe MDIParent1.SecondForm non può essere indicizzata percè non contine proprietà predefinite."
    Hai "provato a mettere"... dove?
    E l'errore ti appare... dove?

    Posta uno stralcio di codice completo, altrimenti è impossibile capire quale sia lo scenario attuale in cui si verifica il problema.


    Originariamente inviato da Folcus
    se invece la giro in:
    codice:
    Public SecondFormInstance As New SecondForm
    mi toglie l'errore...ma comunque, facendo girare il programmino non mi va a passare i dati dal SecondFormIstance su Form1...
    La prima cosa che devi senz'altro cominciare a fare è
    1) evitare di andare per tentativi a casaccio,
    2) documentarti sul significato di quello che scrivi.

    In caso contrario, è impossibile darti suggerimenti validi che siano utilizzabili sempre, o risolvere il tuo problema senza scriverti caso per caso la totalità del codice necessario.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  6. #26
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    354
    Allora, rieccomi. Vedo di illustrare meglio e col codice.

    Descrizione e Numero di Form presenti:

    1- Form Padre, chiamado MDIParent1.vb, da dove parte il programma
    2- Form Figlio, chiamato Form1.vb, dal quale richiamo il form 3
    3- Form PopUp, chiamato PopUp.vb, sul quale scrivo in una textbox e trasferisco il dato al Form1

    il problema riscontrato è:

    se faccio partire il programma da Form1, apro il PopUp e trasferisco i dati tutto va bene.
    se invece parto dal MDIParent1, apro Form1, apro PopUp e trasferisco i dati non va a buon fine.

    Codice presente su MDIPartent1:

    codice:
    Imports System.Windows.Forms
    
    Public Class MDIParent1
    
    Private Sub ShowNewForm(ByVal sender As Object, ByVal e As EventArgs) Handles NewToolStripMenuItem.Click, NewToolStripButton.Click, NewWindowToolStripMenuItem.Click
    
    Dim NewForm1 As New Form1()
    NewForm1.Show()
    
    End Sub
    
       
    Private Sub ExitToolsStripMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles ExitToolStripMenuItem.Click
    
    Me.Close()
    
    End Sub
    
    End Class
    Elementi presenti sul Form1 [una textbox e un pulsante]
    Codice presente su Form1:

    codice:
    Public Class Form1
    Public SecondFormInstance As PopUp
    
    Private Sub cmdSelezionaDB_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSelezionaDB.Click
            
    If SecondFormInstance Is Nothing Then
    SecondFormInstance = New PopUp()
    End If
    
    ' Visualizzo il Form
    SecondFormInstance.Show()
    
    End Sub
    End Class
    Elementi presenti su PopUp [una textbox e un pulsante]
    Codice presente su PopUp:

    codice:
    Public Class PopUp
    
    Private Sub cmdInviaDati_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdInviaDati.Click
    
    MDIParent1.NewForm1.txtProfessionista.Text = Me.txtNominativo.Text
            
    Me.Close()
    
    End Sub
    End Class

    Così facendo però mi porta l'errore (in fase d'esecuzione): "Riferimento a un oggetto non impostato su un'istanza di oggetto.", indicando proprio "MDIParent1.NewForm1.txtProfessionista.Text = Me.txtNominativo.Text".


    Come detto prima, se faccio partire il programma da Form1 e apro subito il PopUp, scrivo nella textbox e trasferisco i dati con "Form1.txtProfessionista.Text = Me.txtNominativo.Text", tutto va perfettamente bene.

    Dov'è che sbaglio?

  7. #27
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Mi pare che il problema è ovvio: tu dichiari

    Dim NewForm1 As New Form1()

    all'interno di una routine privata ShowNewForm(...)

    per cui NewForm1 NON è visibile al form PopUp.


  8. #28
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    354
    Quindi dovrei rendere la routine pubblica o dichiarare in altro punto NewForm1?

  9. #29

  10. #30
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    354
    Per la cronaca, ci sono riuscito.

    ora funziona.
    ho solo dovuto modificare il riferimento

    MDIParent1.NewForm1.txtProfessionista.Text = Me.txtNominativo.Text

    con

    MDIParent1.MDIParent1.NewForm1.txtProfessionista.T ext = Me.txtNominativo.Text

    altrimenti mi andava a dire che non era un membro valido.

    son contento che dopo tanto esaminare e sbatterci la testa siamo arrivati ad una conclusione positiva.
    grazie a tutti quelli che m'hanno aiutato!

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.