Newsgroup: it.comp.lang.visual-basic
Titolo: [vb.net] Richiamare array definita in un modulo, dove sto sbagliando?

Ho un modulo così definito:
Module Matrice_CV
    Public ArrTxt(1) As TextBox
    Sub Matrix()
        ArrTxt(0) = MioForm.comune
        ArrTxt(1) = MioForm.lavori
    End Sub
End ModuleDal Form "MioForm" voglio richiamare quell'array ed uso una cosa 
tipo:
ArrTxt(0).Text = "Milano"
ArrTxt(1).Text = "Costrizione"Ma i relativi TextBox (comune e lavori) non 
vengono riempiti.
Dove sbaglio? 

ZupSap ha scritto:

A parte che non mi sembra il massimo come approccio, ma il metodo 
Matrix() lo hai richiamato prima di fare le assegnazioni?
         Matrix()
         ArrTxt(0).Text = "Milano"
         ArrTxt(1).Text = "Costrizione"
-- 
news:it-alt.comp.software.openoffice : Il newsgroup dedicato a
OpenOffice.org, la suite open source di applicazioni per ufficio.
Scarica "OpenOffice.org 3.0 Soluzioni a raccolta", molto più di semplici 
FAQ! 
http://it.openoffice.org/doc/manuali/

 Matrix() lo hai richiamato prima di fare le assegnazioni?
Si, ho un semplice button (per testare) che associato al suo click ha 
soltanto
Matrix()
ArrTxt(0).Text = "Milano"
ArrTxt(1).Text = "Costrizione"
ma i 2 textbox rimangono inesorabilmente vuoti. :-( 

 ArrTxt(1).Text = "Costrizione"
Io ho provato su un progetto nuovo, e a me funziona. Probabilmente il 
problema sta da un'altra parte.


 problema sta da un'altra parte.
Ho provato in un form nuovo nello stesso progetto e NON FUNZIONA ma...
...Hai ragione su un progetto nuovo funziona! :-(
E adesso dove lo cerco l'errore?

 problema sta da un'altra parte.
Ho scoperto che il problema potesse essere legato al menustrip inserito nel 
form di avvio.
Ho ridotto tutto all'osso ma il problema non scompare. :-(
Nello specifico, ora il codice è composto soltanto da:
1 - form di avvio con questo codice:
Public Class Avvio
Private Sub NuovoToolStripMenuItem_Click(ByVal sender As System.Object, 
ByVal e As System.EventArgs) Handles NuovoToolStripMenuItem.Click
Dim childForm As New Test()
childForm.MdiParent = Me
childForm.Show()
NuovoToolStripMenuItem.Enabled = False
End Sub
End Class
2 - un form Test.vb  con 2 textbox ("comune" e "lavori") e con un button. 
Tutto il codice di questo form è:
Public Class Test
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button1.Click
Matrix_test()
ArrTxt_test(0).Text = "Milano"
ArrTxt_test(1).Text = "Costrizione"
End Sub
End Class
3 - un modulo Matrice_CV_test.vb con questo codice:
Module Matrice_CV_test
Public ArrTxt_test(1) As TextBox
Sub Matrix_test()
ArrTxt_test(0) = Test.comune
ArrTxt_test(1) = Test.lavori
End Sub
End Module
Dove può essere l'errore?


Scusate in anticipo la lunghezza.
Questo è un classico rompicapo derivato dalle vecchie abitudini con
VB6, mi pare che non molto tempo fa avevo postato un messaggio simile,
su come VB6 mischiava le carte tra i concetti di "tipo" e "istanza" in
relazione alle form, e qui si ripropone di nuovo.
Dunque, il problema è proprio nel modulo Matrice_CV:
La prima domanda da farsi è: la funzione Matrix() sta facendo
riferimento ad una istanza di MioForm che nessuno ha creato...
"MioForm" è un nome di tipo, non di variabile, non è nemmeno
dichiarata da nessuna parte nel codice, come mai il programma sta
compilando lo stesso?
Andando a spulciare il codice generato con un disassembler (io ho
usato Reflector), si trova la risposta; la routine risulta tradotta
così:
Public Shared Sub Matrix()
    Matrice_CV.ArrTxt(0) = MyProject.Forms.MioForm.comune
    Matrice_CV.ArrTxt(1) = MyProject.Forms.MioForm.lavori
End Sub
che roba è MyProject.Forms?
è una classe generata al volo dal compilatore che contiene, tra le
altre, una property per ciascuna Form definita nell'applicazione, e
guarda caso, usa come nome di proprietà il nome stesso della classe:
    Public Property MioForm As MioForm
    Public Property Form2 As Form2
    'ecc. ecc.
a questo punto (transitando da altra roba strana tipo
ThreadSafeObjectProvider che lasciamo perdere), quello che succede è
che, facendo riferimento a "MioForm" come fosse una variabile
esplicita, in realtà la classe MyProject.Forms ne crea un istanza al
volo, ricalcando così quello che in VB6 era il comportamento normale.
Fin qui abbiamo capito come mai il codice compila anche se non
dovrebbe, perchè però funziona su un progetto nuovo e su quello giusto
no?
Il ragionamento da seguire è lo stesso: se MioForm è una istanza di
form creata automaticamente, come fa a corrispondere all'istanza che
ho deciso di visualizzare?
Normalmente infatti *NON PUO'*  corrispondere, ed è per questo che il
codice di Matrix() è sbagliato, i due TextBox che stiamo modificando
non sono gli stessi perchè abbiamo *DUE* istanze di form attive,
quella visibile e quella istanziata di nascosto.
il motivo, del tutto fortuito, per cui funziona in un progetto nuovo è
che, nelle proprietà di progetto, è stata impostata come form di avvio
MioForm, e in questo caso il compilatore utilizza proprio la stessa
istanza automatica di MyProject.Forms
Sicuramente nel progetto reale la form di avvio è un'altra e MioForm
viene creato in maniera esplicita, come giusto, e questo fa si che non
coincida con quella della funzione Matrix()
Sorvolando sul fatto che anche secondo me si può fare molto meglio in
maniera tutta diversa, la correzione è semplice: dobbiamo assicurarci
di lavorare sempre sull'istanza corretta, evitando interventi
"nascosti" e passando come parametro la form che ci interessa
Module Matrice_CV
   Public ArrTxt(1) As TextBox
   Sub Matrix(ByVal f As MioForm)
      ArrTxt(0) = f.comune
      ArrTxt(1) = f.lavori
   End Sub
End Module
Public Class MioForm
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) _
   Handles Button1.Click
      Matrix(Me)
      ArrTxt(0).Text = "Milano"
      ArrTxt(1).Text = "Costrizione"
   End Sub
End Class

 ha scritto nel messaggio 
news:1f5f52c6-75ca-483a-add1-
<Scusate in anticipo la lunghezza.
<
[cuttone]
<
<
Semplicemente P E R F E T T O!
Spiegazione dettagliatissima e soluzione funzionante.
G R A Z I E.

 ha scritto nel messaggio 
news:1f5f52c6-75ca-483a-add1-
<Questo è un classico rompicapo derivato dalle vecchie abitudini con
<VB6, mi pare che non molto tempo fa avevo postato un messaggio simile,
<su come VB6 mischiava le carte tra i concetti di "tipo" e "istanza" in
<relazione alle form, e qui si ripropone di nuovo.
Credo di avere lo stesso problema in un altro caso.
Stavolta non richiamo un modulo ma da un button dello stesso form figlio di 
cui sopra (il form precedentemente chiamato Test da cui richiamavo il 
modulo) apro un altro form (form2).
Da form2 alla chiusura vorrei passare dei valori da scrivere in alcune 
textbox del form "figlio" che l'ha generato ed opero un:
Test.TextBox1.Text = "valore che voglio passare".
Ovviamente non va.
Altrettanto ovviamente, se tolgo il form Avvio... tutto torna a funzionare.
Immagino che la spiegazione sia simile a quella che mi hai dato per il 
modulo ma non so come applicare in questo caso...

 Credo di avere lo stesso problema in un altro caso.
Come non detto... non so cosa sia... ma non è lo stesso tipo di problema... 
:-( 

 :-(
Togliti da ogni problema: quando vuoi aprire una form non usare le
variabile automatiche ma sempre la sintassi:
Dim f As Form123 = New Form123
f.Show()
'ecc...
ovvero crea sempre tu la variabile esplicita e fai riferimento a
questa; se hai bisogno di utilizzarla anche altrove, passala sempre
come parametro.