Oppure

Loading
16/05/09 12:56
Alfonso
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
aaa
16/05/09 15:56
Il Totem
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.
aaa
16/05/09 16:40
Alfonso
Non posso riferirmi alla Form1 perchè la Form2 deve essere richiamabile da qualsiasi altra eventuale form presente nel progetto, form3 o form4 ecc.

Grazie
aaa
17/05/09 16:26
Il Totem
Questo, però, non l'avevi detto. Se supponiamo che ogni form abbia il controllo label1, allora potresti usare:
fr.Controls("label1").Text

per ottenere il contenuto della label.
aaa
17/05/09 17:34
Alfonso
Ottimo!
Di una semplicità disarmante.

Grazie Totem
aaa
18/05/09 14:50
Alfonso
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
aaa
18/05/09 16:06
Il Totem
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.
aaa
19/05/09 16:42
Alfonso
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à
aaa