Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Riferimento ad una form
Forum - C# / VB.NET - Riferimento ad una form

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Alfonso (Normal User)
Rookie


Messaggi: 37
Iscritto: 16/05/2009

Segnala al moderatore
Postato alle 14:56
Sabato, 16/05/2009
Ciao a tutti.
Sono un principiante per quanto riguarda visual basic 2008 Express

In vb6 ho due form: Form1 e Form2

Nella Form1 ho una label (Label1.Caption="Alfonso") e un button che premuto richiama la seconda form passando come parametro Me

Private Sub Command1_Click()

    Form2.mostra Me

End Sub

Nella Form2 ho una casella testo Text1 e la sub routine

Public Sub mostra(fr As Form)

    Text1.Text = fr.Label1.Caption
    Me.Show

End Sub

Premendo il tasto si apre la form2 e la casella di testo = Alfonso

Naturalmente in vb8 il tutto non funziona

Nella form2

Public Sub mostra(ByRef fr As System.Windows.Forms.Form)

   Dim chiamante As System.Windows.Forms.Form
   chiamante = fr
   'UPGRADE_ISSUE: Impossibile risolvere Control Label1 poiché si trova all'interno dello spazio dei nomi generico Form  
    Text1.Text = chiamante.label1.text
    Me.Show()

End Sub

L'aiuto in linea consiglia di usare CType ..... ma non riesco nell'impresa.

Grazie per i consigli

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 17:56
Sabato, 16/05/2009
Codice sorgente - presumibilmente VB.NET

  1. Public Sub mostra(ByRef fr As Form1)
  2.     Text1.Text = fr.label1.text
  3.     Me.Show()
  4. End Sub


Il tipo "Form" indica un generico form (vuoto). Il tipo "Form1" indica una finestra come quella che tu hai disegnato nel designer. "Form1" contiene il membro pubblico Label1, perchè è definito nel suo codice (Form1.Designer.vb). "Form" non contiene quel membro, poiché rappresenta il generale concetto di form.

PM Quote
Avatar
Alfonso (Normal User)
Rookie


Messaggi: 37
Iscritto: 16/05/2009

Segnala al moderatore
Postato alle 18:40
Sabato, 16/05/2009
Non posso riferirmi alla Form1 perchè la Form2  deve essere richiamabile da qualsiasi altra eventuale form presente nel progetto, form3 o form4 ecc.

Grazie

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 18:26
Domenica, 17/05/2009
Questo, però, non l'avevi detto. Se supponiamo che ogni form abbia il controllo label1, allora potresti usare:
Codice sorgente - presumibilmente Plain Text

  1. fr.Controls("label1").Text


per ottenere il contenuto della label.

PM Quote
Avatar
Alfonso (Normal User)
Rookie


Messaggi: 37
Iscritto: 16/05/2009

Segnala al moderatore
Postato alle 19:34
Domenica, 17/05/2009
Ottimo!
Di una semplicità disarmante.

Grazie Totem

PM Quote
Avatar
Alfonso (Normal User)
Rookie


Messaggi: 37
Iscritto: 16/05/2009

Segnala al moderatore
Postato alle 16:50
Lunedì, 18/05/2009
Pensavo che la parola magica Controls risolvesse i miei problemi ma continuando con lo sviluppo del progetto non riesco a trovare nell'help in linea altre paroline magiche per altri eventi.

---------------- Nella form1 ora ho anche una variabile pubblica e una function

Friend Class Form1
    Inherits System.Windows.Forms.Form

    Public Acceso As Boolean = False


    Public Function Salva(ByVal Tipo As String) As Boolean

        Salva = False
        Select Case Tipo
            Case "A"
                '....
                Salva = True
            Case "B"
                '....
        End Select

    End Function

    Private Sub Command1_Click(ByVal eventSender As System.Object, ByVal eventArgs As    System.EventArgs) Handles Command1.Click
        
        Form2.mostra(Me)

    End Sub

End Class

------------------ Nella form2

Friend Class Form2
    Inherits System.Windows.Forms.Form

    Dim Formchiamante As Form

    Public Sub mostra(ByRef fr As Form)

        Formchiamante = fr
        Me.Show()
        Procedi()

    End Sub

    Private Sub Procedi()

        Dim SalvataggioOK As Boolean

        ' la soluzione per i controlli presenti nella formchiamante
        Text1.Text = Formchiamante.Controls("label1").Text


        ' la parte che da errore

        ' richiama la function del form chiamante
        SalvataggioOK = Formchiamante.Salva("A")

        ' setta la variabile pubblica del form chiamante
        Formchiamante.Acceso = SalvataggioOK


    End Sub

End Class

Qual'è la parolina magica per richiamare la function e settare la variabile?

Grazie

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 18:06
Lunedì, 18/05/2009
Beh, qui andiamo un po' più sul complesso. Ti assicuro che fare quello che chiedi è possibilissimo, ma bisogna fare un giro di codice abbastanza laborioso, che coinvolge anche la reflection. Ora mi chiedo cosa tu stia cercando di fare, poiché credo che ci sia sicuramente un approccio più semplice al tuo problema.

PM Quote
Avatar
Alfonso (Normal User)
Rookie


Messaggi: 37
Iscritto: 16/05/2009

Segnala al moderatore
Postato alle 18:42
Martedì, 19/05/2009
In Vb6 una delle prime cose che ho imparato è come gestire delle caselle di testo (solo testo, solo numeri, ecc) facendo riferimento ad una classe clsTextBoxes che costruisce una collection di clsTextBox per gestire ogni controllo della formchiamante.
Sono sicuro di non dover riportare il codice di queste due classi perchè è un <classico>.

Con il tempo ho aggiunto nella clsTextBox la possibilità di lanciare una sub di salvataggio, di dare indicazioni all'utente in due caselle messaggio della form chiamante ,di richiamare con F1 l'help della casella testo gestita.

Questa classe nel mio quesito è la form2.

La clsTextBox non può esporre eventi vedibili da form1 ma visto che accetta il riferimento al form chiamante non avevo problemi.

In vb8 il tutto non funziona o meglio non funzionava.

Oggi ho modificato la clsTextBox (form2) in modo che possa essere chiamata direttamente dalla form1 o form3 per ogni casella testo da gestire (non come una collection come prima in vb6)

*******************

Friend Class clsTextBox

    Private WithEvents m_txtTextBox As System.Windows.Forms.TextBox
    Public Event Salva(ByVal Tx As String)

*******************

A questo punto gli eventi sono gestibili nel form chiamante

    Dim WithEvents m_TextBox As New clsTextBox

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

   form_load

      m_TextBox = New clsTextBox
      m_TextBox.Box = text1

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

    Private Sub m_TextBoxes_EventSalva(ByVal Tipo As String) Handles m_TextBox.Salva
    .....

*************

Per quanto riguarda le variabili pubbliche di form1, form3, ecc (in attesa di scoprire qualcosa di più professionale) le sostituisco con delle label che da form2 sono gestibili perfettamente con il tuo suggerimento

    formchiamante.Controls("label").text = .....

Ma non c'è una parolina tipo Variables ?

    formchiamante.Variables("DaSalvare") = True


A risentirci

P.S.
non ho fatto in tempo a scrivere il mio romanzino che sono stato buttato fuori dal reply.
Ho capito che o si hanno le idee molto chiare o è meglio romanzare a parte e procedere a un copia e incolla.

Cordialità

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 20:25
Giovedì, 21/05/2009
Rileggendo il topic mi è sorto un dubbio. Tutti i form che sono passati come parametro al metodo mostra sono diversi e progettati indipendentemente nell'editor? Se lo sono, ed espongono sempre gli stessi metodi e gli stessi controlli, perchè non crei un'interfaccia che possa essere implementata da questi?
http://totem.altervista.org/guida/versione2/A36.php
Usando un'interfaccia non c'è il problema dell'ereditarietà, che può influire negativamente sul designer (praticamente l'unico caso in cui l'ereditarietà può essere dannosa), ma se ne possono usare gli stessi principi. Se Form2, Form3, Form4, ..., FormN hanno tutti gli stessi membri, implementaranno tutti questa interfaccia, ad esempio IForm:
Codice sorgente - presumibilmente C# / VB.NET

  1. Class Form2
  2.   Implements IForm
  3.   '...


E il codice sarà:
Codice sorgente - presumibilmente VB.NET

  1. Sub mostra(ByVal F As IForm)
  2.   S.Salva("a")
  3.   S.Variabile = True
  4.   '...
  5. End Sub



La collezione Controls esiste perchè contiene i controlli del form, i quali sono sempre aggiunti dinamicamente: dichiarare un controllo come membro della classe derivata da form, infatti, non basta a farlo apparire nella visualizzazione. Le variabili, invece, sono puro codice, sono membri effettivi della classe ed esistono solo nel suo contesto: essendo determinate prima dell'esecuzione, sono a tutti gli effetti statiche. Ecco perchè non può esistere una collezione Variables analoga a Controls. Le si può ottenere con la reflection (e solo quelle con scope pubblico o friend), ma credo che la soluzione basata sulle interfacce risolverà il tuo problema.

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo