Newsgroup: it.comp.lang.visual-basic
Titolo: [vb.net] Modificare form da altro form

Ho un form2 da cui, una volta cliccato su un bottone, deve farmi 
eseguire un'operazione sul form1.
Io pensavo che fosse sufficiente dimensionare una variabile:
Dim f1 as form1
e poi fargli eseguire:
f1.(1° mia operazione)
f1.(2° mia operazione)
ma mi dà errore (NullReferenceException... Riferimento a un oggetto non 
impostato su un'istanza di oggetto).
Cosa sbaglio?
Christian

dovrebbe funzionare semplicemente facendo fl.(1° la mia operazione)
ecc ecc

 Cosa sbaglio?
Beh, l'errore mi pare piuttosto chiaro: stai usando una variabile che č 
null.
Magari istanziando il form va meglio ;)
f1 = new Form1()
Ciao
-- 
Free .Net Reporting Tool - 
http://www.neodatatype.net
 

 dovrebbe funzionare semplicemente facendo fl.(1=B0 la mia operazione)
A me risulta cosě il tuo messaggio, potresti ripeterlo per favore, 
magari omettendo caratteri particolari?
Christian

 f1 = new Form1()
Eggià, hai ragione, ma forse intendevi "As" al posto di "=".
Il problema è che in questo modo mi dà un errore strano. Mi spiego.
Sul form1 ho inserito del codice in un button con i comandi per caricare 
una listview (presente sempre sul form1), e la carica correttamente:
listview1.Items.Clear()
listview1.Items.AddRange(lv)
Se scrivo il codice per inviare gli stessi comandi dal form2:
Dim f1 As New form1
f1.listview1.Items.Clear()
f1.listview1.Items.AddRange(lv)
non mi carica i dati nella listview.
Inoltre se clicco sul button del form1 mi dà il seguente errore: 
"System.ArgumentException... Impossibile aggiungere o inserire 
l'elemento '0' in più di una posizione. Rimuoverlo prima dalla posizione 
corrente oppure duplicarlo".
Lo stesso errore mi viene dato quando dò per due volte il comando dal 
form2.
Ovviamente disabilitando le tre righe aggiunte nel form2 tutto funziona 
perfettamente.
Non ho idea da dove iniziare per cercare l'errore, qualsiasi aiuto è ben 
accetto.
Christian

 accetto.
cerca di capire la differenza che passa fra classe ed istanza.
-- 
ciao, hal

 cerca di capire la differenza che passa fra classe ed istanza.
La classe è facile: crea oggetti simili a quelli già presenti in vb, con 
la possibilità di impostare proprietà, metodi, eventi ecc.
L'istanza è un pò più difficile per me, ma credo che sia simile alla 
classe, più orientato verso i processi.
Come sono andato?    ;-)
Christian

 Come sono andato?    ;-)
ti riconosco l'onore delle armi per averci provato ;-)
provo a sintetizzare.
la classe e` la definizione astratta di un oggetto, con la sua
organizzazione di dati, ad esempio definisco la classe Persona
indicando che dispone di un attributo Nome.
l'istanza e` un oggetto concreto  del tipo  complesso definito
con la classe, ad esempio Christian e` un'istanza di Persona.
tecnicamente, l'istanza viene creata invocando il costruttore
della classe con la parola chiave New.
sulla base di questo, Form e` una classe Form1 e` un'istanza
di classe Form. 
a complicare le cose, pero`, ci si e` messa la presunta 
retrocompatibilita` di 
vb.net
 che si e` inventato l'istanza
predefinita (porcata pazzesca dal punto di vista OOP, imho).
in pratica 
vb.net
 si crea un'istanza predefinita di Form1 che
puoi usare senza far tante storie, col risultato che in punto
del codice hai magari creato un'istanza di Form1 e da un'
altra parte accedi invece all'istanza predefinita di Form1,
che, pero`, e` un'istanza diversa, cioe` un oggetto concreto
diverso (altri dati allocati ad un diverso indirizzo di memoria,
per intenderci), col risultato di ricavare situazioni "strane".
se non ho frainteso lo scambio di messaggi all'inizio di questo
thread, nel tuo codice non fai riferimento sempre alla stessa
istanza, ma ad istanze diverse.
nel caso io non abbia capito, riposta la parte di codice 
interessata.
-- 
ciao, hal

 interessata.
... questa parte invece è un pò più complicata, ma vediamo di applicarlo 
alla mia situazione, per chiarire il tutto.
La base di partenza è:
form1:
- è presente la listview;
- è presente un bottone che, cliccandoci sopra, esegue le seguenti righe 
di codice per aggiornare la listview:
listview1.Items.Clear()
listview1.Items.AddRange(lv)
form2:
- sono caricati i dati ed aggiornati i ListViewItem con i suoi SubItems 
con un evento.
Ora io vorrei togliere il bottone in form1 ed aggiornare la listview dal 
form2 al momento del caricamento dei dati, quindi, come corretto da 
Fabio, inserisco nell'evento di caricamento dati del form2:
Dim f1 As New form1
f1.listview1.Items.Clear()
f1.listview1.Items.AddRange(lv)
L'errore che ho indicato in un precedente messaggio appare quando 
inserisco due serie di dati dal form2 (e quindi fa girare due volte le 3 
righe di codice indicate qui sopra), oppure dà lo stesso errore quando 
inserisco un dato da form2 e clicco sul bottone di form1.
Se ho capito bene il tuo dubbio è che io abbia creato un'altra istanza 
del form1 da un'altra parte del codice. Se è così, ho controllato tutto 
il codice e non l'ho fatto, in caso contrario (ed in ogni caso) ti 
chiedo di indicarmi dov'è l'errore e come correggerlo.
Christian

 inserisco un dato da form2 e clicco sul bottone di form1.
Bisognerebbe capire cos'è lv.
Ma credo che tu lavorando su f1 in realtà lavori ogni volta su un'istanza 
nuova e invisibile di Form1.
Prova facendo
Dim f1 As New form1
f1.Show() ' Aggiungi questa riga
f1.listview1.Items.Clear()
f1.listview1.Items.AddRange(lv)
Ciao 

 f1.listview1.Items.AddRange(lv)
Così facendo apro ogni volta una nuova form1 in aggiunta a quella 
originaria che rimane aperta.
Ho provato ad eseguire tre prove:
1) cancello la nuova form1 ogni volta che faccio partire l'evento di 
caricamento dati in form2: in questo modo posso inserire tutti i dati 
che voglio e la nuova form1 mi presenta i dati corretti ed in ordine;
2) è il seguito dell'1), chiudo la form2, vado nella form1 vecchia e 
clicco sul bottone di form1: mi dà l'errore indicato in precedenza;
3) è un seguito alternativo ad 1), invece di chiudere la nuova form1, 
provo a caricare dati richiamando dalla nuova form1 la form2: in questo 
caso al successivo caricamento dati da form2 mi dà il solito errore.
Credo che siamo vicini alla soluzione...
Christian

 Credo che siamo vicini alla soluzione...
La soluzione risiede nel capire i concetti base della programmazione OOP e 
nell'imparare a usare il debug con i suoi breakpoints, watches, 
intellisense, immediate window ecc...
Ciao 

 sempleice ListBox può agganciarsi a Form2 a costo zero.
In effetti ho creato un form3 che carica dati visualizzandoli in una 
listbox che poi li visualizza su form2 tramite combobox, ma la faccio 
partire da form1, credo però che tu intendessi di farla partire da 
form2.
Christian

 Con la gomma?
Sorry, intendevo dire "chiudo".
Christian


No, non ci siamo proprio.
In Form2 definisci il tuo evento
Public Class MyEventArgs
    Inherits EventArgs
    Pblic Items() As Object ' ad es., per rimanere generici
End Class
' Seguiamo le convenioni!
Public Event LoadData(Byval Sender As Object, ByVal e As MyEventArgs)
Public Sub LaMiaSubCheCaricaIDati()
    Dim e As New MyEventArgs
    Redim e.Items(QuantiTeNeServono - 1)
    ' ... riempi gli items
    RaiseEvent LoadData(Me, e)
End Sub
Nella classe/form che usa Form2 (nel tuo caso Form1)
Se c'è una var globale di tipo Form2 puoi scegliere l'evento LoadData dal 
combo in alto a destra, altrimenti se la var è privata in un metodo:
Dim f As New Form2
' Assegna il gestore dell'evento
AddHandler f.LoadData, AddressOf MyLoadData
' Fa eseguire i calcoli a f
f.LaMiaSubCheCaricaIDati()
' Rimuove il gestore dell'evento
RemoveHandler f.LoadData, AddressOf MyLoadData
MyLoadData è una sub con la stessa firma dell'evento:
Private Sub LoadData(Byval Sender As Object, ByVal e As MyEventArgs)
    listView.Items.Clear();
    For Each (Object o In e.Items)
        listView.Items.Add(new ListViewItems(o.ToString()))
    Next
End Sub
Ciao

 End Sub
Stesso discorso di prima: dopo "o." l'intellisense non propone nulla, 
inoltre ci sono 7 istruzioni da scegliere e nessuna prevede "ToString".
Mi piace molto vedere nuovi modi o parzialmente nuovi di fare le cose, 
ma vorrei anche capire bene tutto, quindi ti prego di segnalarmi gli 
errori e, solo se hai tempo e se lo ritieni opportuno, anche qualche 
commento aggiuntivo che mi potrebbe essere utile, grazie.
Christian