
Alfonso (Normal User)
Rookie
    
Messaggi: 37
Iscritto: 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
|
|

Il Totem (Admin)
Guru^2
    
Messaggi: 3635
Iscritto: 24/01/2006
|
Codice sorgente - presumibilmente VB.NET |
Public Sub mostra(ByRef fr As Form1) Text1.Text = fr.label1.text Me.Show() 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.
|
|

Alfonso (Normal User)
Rookie
    
Messaggi: 37
Iscritto: 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
|
|

Il Totem (Admin)
Guru^2
    
Messaggi: 3635
Iscritto: 24/01/2006
|
Questo, però, non l'avevi detto. Se supponiamo che ogni form abbia il controllo label1, allora potresti usare:
Codice sorgente - presumibilmente Plain Text |
fr.Controls("label1").Text
|
per ottenere il contenuto della label.
|
|

Alfonso (Normal User)
Rookie
    
Messaggi: 37
Iscritto: 16/05/2009
|
Ottimo!
Di una semplicità disarmante.
Grazie Totem
|
|

Alfonso (Normal User)
Rookie
    
Messaggi: 37
Iscritto: 16/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
|
|

Il Totem (Admin)
Guru^2
    
Messaggi: 3635
Iscritto: 24/01/2006
|
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.
|
|

Alfonso (Normal User)
Rookie
    
Messaggi: 37
Iscritto: 16/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à
|
|

Il Totem (Admin)
Guru^2
    
Messaggi: 3635
Iscritto: 24/01/2006
|
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 |
Class Form2
Implements IForm
'...
|
E il codice sarà:
Codice sorgente - presumibilmente VB.NET |
Sub mostra(ByVal F As IForm) S.Salva("a") S.Variabile = True '... 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. |
|