Newsgroup: it.comp.lang.visual-basic
Titolo: Come Funziona MoveFirst in VbNet

Ciao a tutti,
sono appena passato a VBNet da VB6.
La maggior parte dei problemi li sto risolvendo anche leggendo i vecchi post
di questo NG, ma il seguente non l'ho trovato:
Eccezione non gestita di tipo "System.NullReferenceException" in
WindowsApplication4.exe
Informazioni aggiuntive: Riferimento a un oggetto non impostato su
un'istanza di oggetto.
Praticamento mi trovo ad avere due form con il seguente codice:
*****FORM1 (di avvio):
Public WithEvents connConnection As ADODB.Connection
Public WithEvents rsRecordSet As ADODB.Recordset
Public WithEvents rsTemp As ADODB.Recordset
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
...
strProvider = "Provider= Microsoft.Jet.OLEDB.4.0;"
strDataSource = Application.StartupPath
strDataBaseName = "c:\database.mdb;"
strDataSource = "Data Source=" & strDataBaseName
strConnect = strProvider & strDataSource
connConnection = New ADODB.Connection
connConnection.CursorLocation = ADODB.CursorLocationEnum.adUseClient
connConnection.Open(strConnect)
rsRecordSet = New ADODB.Recordset
rsRecordSet.CursorType = ADODB.CursorTypeEnum.adOpenStatic
rsRecordSet.CursorLocation = ADODB.CursorLocationEnum.adUseClient
rsRecordSet.LockType = ADODB.LockTypeEnum.adLockPessimistic
rsRecordSet.let_Source("Select * From AnagraficaClienti ORDER BY NumCliente
ASC")
rsRecordSet.let_ActiveConnection(connConnection)
rsRecordSet.Open()
...
End Sub
*****FORM2:
Dim Form1 as New Form1
Form1.rsRecordSet.MoveFirst() '***** Qui mi da l'errore sopra indicato.
Cosa vuol dire: Riferimento a un oggetto non impostato su un'istanza di
oggetto??
Spero in un vostro aiuto.
Ringrazio tutti in anticipo.
Emiliano

 di oggetto??
vuol dire che rsrecordset non è ancora istanziato.
prova a verificare se l'evento load si verifica quando dimensioni
dim form1 as form1 (che è una cosa brutta che più brutta è difficile...)
sappi comunque che se fai così non stai lavorando col la "form1" già aperta,
ma ne apri una nuova, è questo quello che volevi ottenere?
--
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 Form1.rsRecordSet.MoveFirst() '***** Qui mi da l'errore sopra indicato.
Ave
giuseppeD


Ciao Giuseppe,
ho provato a sostituire
"Dim Forme1 As New Form1" con "Dim Fr As Form1"
ed anche a inserila sotto "Public Class Form2" ma continua a darmi sempre lo
stesso errore!
Da cosa può dipendere?
Ti ringrazio
Emiliano

 ma ne apri una nuova, è questo quello che volevi ottenere?
Ciao Sergio,
Grazie, ma purtroppo non funziona lo stesso.
La Form1 è già visualizzata, da questa premo un bottone per visualizzare
anche la Form2.
Dalla Form2 premo un altro bottone il quale esegue:
Dim frm as new Form1
frm.rsRecordSet.MoveFirst()
oppure
Dim frm as Form1
frm.rsRecordSet.MoveFirst()
ma in entrambi i casi mi da l'errore:
Eccezione non gestita di tipo "System.NullReferenceException" in
WindowsApplication4.exe
Informazioni aggiuntive: Riferimento a un oggetto non impostato su
un'istanza di oggetto.
Proprio non capisco cosa voglia dire e come risolverlo...
Spero tu mi possa aiutare dopo questo chiarimento...
Ciao
Emiliano

 frm.rsRecordSet.MoveFirst()
emiliano...
quel frm non punta alla form che hai aperto.
è una nuova istanza della classe form1.
è come se tu avessi due macchine... due panda, per esempio... sono uguali,
in tutto e per tutto, ma se accendi la prima... la seconda non si accende.


 in tutto e per tutto, ma se accendi la prima... la seconda non si accende.
Il tuo esempio è molto chiaro ma non funziona nemmeno scrivendo
Dim frm as Form1
cioè senza il "New".
Come devo fare in VB6 era tutto più semplice...
a parte questo problema anche altre procedure erano molto più semplici e
richiedevano meno codice con VB6 invece di VBNet, secondo me hanno solo
peggiorato le cose...bah forse mi sbaglio.
Ciao
Emiliano

 stesso errore!
Prova come segue.
In Form2, come variabile globale
public f1 as form1
In form1
dim ff as new form2
ff.f1=me
ff.show
a questo punto, da form 2, dovresti intervenire nelle variabili di form1.
Ave
giuseppeD


Ciao Giuseppe,
adesso funziona bene.
Grazie infinite...
Ciao
Emiliano

 ff.show
Scusami, ma vorrei solo una conferma:
se io ho un programma con 100 Form ognuna delle quali va a pescarsi dati
presenti in tutte le altre Form devo scrivere su ogni Form:
Public FormData1 As Form1
Public FormData2 As Form2
Public FormData3 As Form3
Public FormData4 As Form4
Public FormData As Form5
Public FormData5 As Form6
Public FormData6 As Form7
Public FormData7 As Form8
...
ecc. ecc.
Mi sa tanto da pazzesco: in VB6 era sufficiente scrivere
DatodellaForm2 = Form2.Text1.text
Adesso per la stessa operazione occorre scrivere ben 3-4 righe di codice!
Ciao
Emiliano

 Adesso per la stessa operazione occorre scrivere ben 3-4 righe di codice!
In VB6 molte attività sono eseguite per default.
In 
VB.NET
, programma completamente ad oggetti, necessita eseguire a manina.
Per dialogare tra le varie form è necessario scrivere un pochino di codice
in più, meno dall'indicato da te.
Una delle vie è scrivere una procedura che verifica  se la maschera
fornitrice di dati è nothing o dispose.
Se non si trova nella situazione, vuol dire che è attiva, quindi non occorre
istanziarla.
Ave
giuseppeD


Ciao Giuseppe,
dopo varie ricerche sono capitato nella seguente soluzione che però non
funziona:
http://www.ugidotnet.org/3010.blog
  "Implementare il pattern Singleton per
una WindowsForm"
nel senso che non dà nessun errore ma scrivendo all'interno del Form2:
MsgBox(Form8.InstanceObject.Text2.Text) mi emette una stringa vuota invece
in Text2 del Form8 c'è scritto  "45".
P.S. Il form8 è aperto quindi visualizzato a schermo.
Dove sbaglio?
In particolare non capisco il punto 4: io ho scritto
instance = Me
subito dopo il codice:
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
instance = Me
Ciao
Emiliano

 ha scritto nel messaggio
news:DhMzb.49544$AX1.1...@news1.tin.it...

instance=Me
va inserito:
Public Sub New()
MyBase.New()
'Chiamata richiesta da Progettazione Windows Form.
InitializeComponent()
'Aggiungere le eventuali istruzioni di inizializzazione dopo la chiamata a
InitializeComponent()
instance = Me
Ave
giuseppeD

 instance = Me
Il risultato non cambia la stringa emessa da
MsgBox(Form8.InstanceObject.Text2.Text)
è sempre vuota! non so più cosa fare... sono fermo da due giorni!
Provo a ricapitolare:
le form in questione sono la Form3 e la Form8.
La Form3 deve prendere dei valori inseriti nella Forma8; con VB6 avrei
scritto dentro la Form3:
MsgBox Form8.Text2.Text
In VBnet ho invece scritto all'interno della Form8:
Private Shared instance As Form8
Public Shared Function InstanceObject() As Form8
    If (instance Is Nothing) Then
        instance = New Form8
    End If
    Return instance
End Function
#Region " Codice generato da Progettazione Windows Form "
Public Sub New()
     MyBase.New()
     'Chiamata richiesta da Progettazione Windows Form.
     InitializeComponent()
     instance = Me
     'Aggiungere le eventuali istruzioni di inizializzazione dopo la
chiamata a InitializeComponent()
End Sub
Poi associato all'interno della Form3 a un bottone ho scritto:
MsgBox(Form8.InstanceObject.Text2.Text)
Il risultato è una stringa vuota invece di ciò che è scritto all'interno del
Text2.Text del Form8
Spero vivamente che tu possa aiutarmi perchè non so più dove sbattere la
testa.
Ancora grazie.
Ciao
Emiliano

 ha scritto nel messaggio
news:UoOzb.156551$hV.56...@news2.tin.it...


 Lo rintracciata facendo un trova su tutto il codice.
La ho rintracciata o l'ho rintracciata !
Dieci minuti dietro la lavagna ^__^
Ave
giuseppeD

 ha scritto nel messaggio
news:l0Pzb.156742$hV.56...@news2.tin.it...

:-)) hai ragione ma ti assicuro che è stata la fretta. Di solito non sbaglio
il verbo essere e avere :-))
Comunque tra le due preferisco l'ho rintracciata :-)).
Emiliano