Newsgroup: it.comp.lang.visual-basic
Titolo: Variabile tipo valore/riferimento

In VB.Net 2010 ho scritto un piccolo codice che si interfaccia alla COM di 
Microstation (programma cad).
1) Quando si apre la form1, viene inizializzata la variabile e assegnata il 
valore iniziale "A"
2) All'apertura della form1, alla variabile VARIABILE, vienne assegnato il 
valore "A"
3) Quando clicco sul pulsante, alla variabile VARIABILE viene
modificato il valore da "A" a "B"
4) Successivamente,  il codice "linka" sulla classe "ClassePippo"      ' 
Interfaccia
5) Apre un messaggio e visualizza il contenuto della variabile VARIABILE, 
cio� "A" , mentre io mi aspettavo il nuovo valore "B"
Come faccio, dalla classe ClassePippo a visualizzare il valore aggiornato 
della variabile VARIABILE?
Grazie
nero23
      'CODICE CLASSE "Form1"
Imports MicroStationDGN 'Programma Cad"
 Public Class Form1
    Public ustn As New MicroStationDGN.Application()
Public VARIABILE as String = "A"       ' valore iniziale della variabile
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button1.Click
         VARIABILE = "B"       'Cambio il valore della variabile da "A" a 
"B"
Dim modalHandler As New ClassePippo
        ustn.AddModalDialogEventsHandler(modalHandler)
        ustn.CadInputQueue.SendCommand("REFERENCE ATTACH ")
        ustn.RemoveModalDialogEventsHandler(modalHandler)
    End Sub
End Class
    ' CODICE CHE HO SCRITTO NELLA CLASSE "ClassePippo"
Imports MicroStationDGN
  Public Class ClassePippo
     Implements MicroStationDGN.IModalDialogEvents
    Private Sub IModalDialogEvents_OnDialogClosed(ByVal DialogBoxName As 
String, ByVal DialogResult As MsdDialogBoxResult)
     End Sub
    Private Sub IModalDialogEvents_OnDialogOpened(ByVal DialogBoxName As 
String, ByVal DialogResult As MsdDialogBoxResult)
     End Sub
    Private Sub OnDialogClosed(ByVal DialogBoxName As String, ByVal 
DialogResult As MsdDialogBoxResult) Implements 
MicroStationDGN.IModalDialogEvents.OnDialogClosed
    End Sub
    Private Sub OnDialogOpened(ByVal DialogBoxName As String, ByRef 
DialogResult As MsdDialogBoxResult) Implements 
MicroStationDGN.IModalDialogEvents.OnDialogOpened
   MessageBox.Show(VARIABILE) ' mostra "A"  anzich� "B"
 End Sub
 End Class

 [...]
 
Non mi stupisco che non funzioni, casomai mi stupisco che compili!
 
Sicuramente hai omesso del codice perchè altrimenti, visto che 
'VARIABILE' è definita internamente a Form1 e visto che a 'ClassePippo' 
non viene passato nè un riferimento all'oggetto Form nè alla variabile, 
il codice MessagBox.Show(VARIABILE) dovrebbe fallire perchè fa 
riferimento ad una variabile non dichiarata.
 
Non è che il codice in realtà è MessageBox.Show(Form1.VARIABILE) ?!?
 
Perchè in questo caso si spiega tutto e mi salgono già su per la gola le 
parolacce! >:(

 parolacce! >:(
 
 
 
 
Ho sbagliato io a riportare il codice nella newsgroup.
Nel progetto, il codice è quello riportato da te...
 
 
 
 
 
 

 Nel progetto, il codice è quello riportato da te...
 
Quello che succede è che stai facendo riferimento a due istanze diverse 
di Form1... una è quella che hai aperto (esplicitamente o magari con 
Application.Run(New Form1)), l'altra menzionata in ClassPiipo è invece 
l'istanza predefinita dell'applicazione.
 
Devi assicurarsi che il coedice faccia invece riferimento alla stessa 
istanza... secondo quello che devi fare, hai tanti modi, uno a caso è 
quello di aggiungere un oparametro al costruttore delle classe
 
Public Class ClassePippo
  Implements MicroStationDGN.IModalDialogEvents
 
  private mFormChiamante As Form
 
  Public Sub New (formChiamante As Form)
    mFormChiamante = formChiamante
  End Sub  
...
 
e quindi nel pulsante della form
 
Dim modalHandler As New ClassePippo(Me)
 
 
Le "parolacce" a cui accennavo non erano chiaramnente pensate per te, 
spero non abbia equivocato, ma per mamma MS:  mentre in principio 
avevano tolto di mezzo la faccenda dell'istanza predefinita di form 
'alla VB6', e quindi ogni finestra andava dichiarata e istanziata 
esplicitamente, come Dio comanda e come tutte le altre classi, a partire 
da VS 2005 ha pensato bene di reintrodurla, per nessun motivo pratico se 
non quello di accontentare una manica di piagnucoloni per cui fare un 
'New' era troppo complicato.
 
Il risultato sono casini di questo tipo, visto che poi è facilissimo 
fare confusione
 
Morale della favola, dimenticati che esistono le istanze predefinite 
delle form e usa sempre 'Dim' e 'New' quando devi creare le tue, 
passando casomai i firerimenti in giro quando servono.

 'New' era troppo complicato.
 
 
Questo casino, in C# non si presenta, dato che vanno tutte istanziate.
Ciao e grazie
nero23

 Ciao e grazie
 
Lo stesso succedeva nelle prime due versioni di 
VB.NET
; poi hanno 
pensato bene di reintrodurle.
 
Fai finta non ci siano, istanzia normalmente (che per inciso rende pure 
più facile tradurre il codice da o verso C# quando serve) e vivi felice.
 
Ciao
 

 più facile tradurre il codice da o verso C# quando serve) e vivi felice.
 
 
Infatti. Quando ho tradotto il codice da 
vb.net
 a c#, ho dovuto inserire la 
parte  di codice preposto a istanziare le form...
ciao
 

FUNZIONAAAAA
 
Grazie 1001
 
nero23