Newsgroup: it.comp.lang.visual-basic
Titolo: Form Form2

Ho posizionato un pulsante sulla Form1 e ho scritto il codice riportato
sotto.
Cliccando sul pulsante, si apre la Form2. Ricliccando una seconda volta, si
apre una seconda Form2 pur non avendo chiuso la prima Form2.
Lo stesso codice su VB.Net, mi apre solo una Form2.
Io voglio lo stesso funzionamento di Vb.net, come posso fare?
Voglio evitare di aprire tante finestre quanto sono i clic sul pulsante.
Grazie nero2
private void button1_Click(object sender, EventArgs e)
{
Form Form2 = new Form2();
Form2.Show();
}

 }
teribbbbile porcata di VB.Net :-) e delle default instance.
nel tuo caso derivante dal pessimo naming delle varibili :-)
La variabile Form2 si chiama come la classe Form2, casing compreso, e 
mentre il compilatore C# la interpreta in un modo il compilatore VB.Net 
proprio perchï¿œ c'ï¿œ il supporto per le default instance (porcata) la 
interpreta diversamente producendo un effetto che non dovrebbe 
produrre. Il comportamente giusto, visto il codice che scrivi, ï¿œ quello 
di C#, se vuoi una default instance, che sarebbe meglio definire un 
singleton devi, in C#, fartelo a mano:
Form2 myInstance = null;
private void button1_Click(object sender, EventArgs e)
{
   if( this.myInstance == null )
   {
       this.myInstance = new Form2();
   }
   this.myInstance.Show();
}
.m
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com
blog @ 
http://milestone.topics.it
whynot [ at ] topics [ dot ] it

Quindi, il "comportamento" giusto è quello di C#.
Da ora in poi, inserirò il tuo codice per aprire una form.
Grazie
ciao
nero23 

teribbbbile porcata di VB.Net :-) e delle default instance.
*****************
+1^oo
---------------------------
Mauro Gamberini
Microsoft MVP - Excel
http://www.riolab.org/
http://www.maurogsc.eu/

 }
Mi da un problema quando clicca per la seconda volta sul pulsante dopo aver 
chiuso la form  ' myInstance ' .
Mi dice:
Impossibile accedere a un oggetto eliminato.
Ciao
nero23 

 }
Ovviamente, nell'evento Close e/o Unload aggiungo:
Form2Aperto = False

 nel tuo caso derivante dal pessimo naming delle varibili :-)
Sto convertendo un progetto da VB.net a C# e, ad essere sincero, trovo C# 
molto più complicato.
Molti consigliano  C#, personalmente non capisco perchè 
VB.NET
 viene visto 
come la cenerentola della programmazione...
Ciao
Nero.23

 molto più complicato.
in che cosa? sono identici :-)


 Impossibile accedere a un oggetto eliminato.
ovvio, devi gestire il comportamento che vuoi in fase di "chiusura", 
visto che vuoi riciclare la form.
Che cosa vuoi fare? nascondere (e quindi mantenere lo stato) e buttare 
via?


 via?
Quindi, al primo clic creo la form (con new...), successivamente, anzichè 
chiudere la form, gioco sulla sua visibilità.
Ho capito bene?
Grazie 

 in che cosa? sono identici :-)
Perchï¿œ il "metodo VB.net"  (>>  "default instance (porcata) " )  viene 
considerato una "porcata" se poi ti semplifica di molto il codice?
In quele caso ï¿œ necessario il "comportamento" di C# e con 
VB.NET
 non 
potresti fare perchï¿œ genera "default instance"?
Ciao
nero23

 > molto pi complicato.
Beh Mauro che facciamo....guerra di religione?
Meglio Playstation o Xbox e via dicendo?(io sono eretico ho la wii)
Diciamo che in C# fai più fatica a fare un programma perchè devi
scrivere più linee di codice...però ti costringe ad essere più "chiaro
concettualmente" di VB.
Caro NERO23 aspetta di arrivare alle lambda expression e vedrai che
"bello"!!!

 Grazie


 fare perchè genera "default instance"?
Nello specifico è il tuo codice che ti "frega" principalmente perchè 
usi un naming, come ti ho già detto, delle variabili pessimo che nello 
specifico ti porta a quei due diversi comportamenti, ma è una 
coincidenza generata da te non è un comportamento che avresti sempre.


 Beh Mauro che facciamo....guerra di religione?
a dire il vero io ho detto che sono identici :-)
Io pr tradizione preferisco la sintassi di C#ma è mero gisto personale 
derivante da anni di uso di linguaggi simil-c


 un male.
"Everything should be made as simple as possible, but not simpler."
Albert Einstein
ciao
stefano

 generata da te non è un comportamento che avresti sempre.
Tu come avresti fatto?
Ciao
nero23 

 considerato una "porcata" se poi ti semplifica di molto il codice?
Perchè era una mezza porcata anche ai tempi di VB6!!... se avevi un
progetto MDI, oppure pilotavi le form non direttamente ma tramite
classi multiuse, la "scorciatoia" della default instance già non
funzionava, e andava usato un codice esattamente identico a quello che
hanno suggerito per 
VB.NET
 (e funzionava alla grande anche in VB6).
La cosa che fa veramente imbufalire è che, proprio perchè quello era
il comportamento ideale già allora, non solo nella prima release, ma
anche nel successivo VS 2003 'sta roba della default instance non era
stata giustamente supportata.... tanto hanno piagnucolato i
programmatori VB6 (quelli con meno di due neuroni ovviamente, perchè
gli altri o già sapevano come si faceva o, dopo oltre 5 anni, comunque
avevano imparato la nuova sintassi) che MS ha calato le brache e l'ha
riaggiunta in VS 2005, col risultato di creare di nuovo questo tipo di
confusione...

 nero23
.m


In questo modo, VB.Net  utilizza più risorse rispetto a C#?
Ciao 

 Ciao


 dubito molto l'IL generato mi sa proprio che è identico.
Quando la Form2 occupa  memoria?
 Con C# viene creato solo dopo aver cliccato sul pulsante. E con VB.net 
(dato che non viene istanziato con new...)?
nero23

 nero23
Chiariamo....come ti ha detto il nostro MVP...al 99% il codice sarà
pressochè identico!
Aggiungo....
COME per il Java...MA PIU' del Java...avere un "processore virtuale"
ti svincola del linguaggio!
Conosci bene C C++ Ruby  e la programmazione ad oggetti? C# è li per
renderti la cosa indolore
Sei abituato a Cobol o Prolog?...c'è F#...ma anche un Cobol.NET(non
gratis)( 
http://www.netcobol.com/products/Fujitsu-NetCOBOL-for-.NET/overview
)
Sei abituato a non perdere tempo prima di arrivare ad una demo? VB.net
è li per te....
Tutti questi "modi" di scrivere vengono poi tradotti in codice pseudo
macchina per la "virtual machine"...spesso in maniera assolutamente
identica!
Quindi un C# non ha di più o di meno del VB.net....ha un modo diverso
di scrivere le cose!
Come  ha detto il nostro MVP più volte...lui ama il c# perchè proviene
dal mondo C!
io senza il
With NostroDatasetFattureAcquisto
   .ScorporoProdotti
etc etc
end with
....non posso stare
la prima volta che ho dovuto riscriverlo in c# mi faceva male la mano!
e sostituirlo con
c.qualcosa
c.qualcosaltro
c.qualcosaltroancora
mi ha scocciato terribilmente perchè a me purtroppo tocca spesso
emttere mano al codice....
però a quelli in c# scoccia alquanto...te l'hanno detto sopra le
default instance.
Se si potesse fare un mix del buono (sbagliato termine...del
COMODO...) di C# e VB.net...vorrebbe fuori un linguaggio definitivo
(F# mi sembra un po troppo strano anche se un progetto di test ce l'ho
fatto ed è formidabile!)

Temo che non mi è chiaro ancora qualcosa (scusatemi...)
Istanziare una form (..= new Form2) significa occupare memoria? Oppure 
occupo memoria solo dopo la  "Form2.Show()"?

 occupo memoria solo dopo la  "Form2.Show()"?
Istanziare...alias creare...alias creare l'oggetto in memoria!
Mostrarlo è un altra cosa....può non coincidere: un server potrebbe
non avere una interfaccia grafica....mysql per dirne uno!

< Istanziare...alias creare...alias creare l'oggetto in memoria!
< Mostrarlo è un altra cosa....può non coincidere: un server potrebbe
< non avere una interfaccia grafica....mysql per dirne uno!
Se con VB.net la Form2 viene istanziata automaticamente (default instance) 
quando avvio la Form1, e con C# viene istanziata solo quando viene premuto 
il bottone presente sulla Form1, questo significa che il programma scitto 
con VB.net impegna memoria per la Form2 anche se questa non è stata aperta? 

 quando avvio la Form1
No, non funziona così... semplicemente la **variabile** Form2, il cui
nome coincide con la **classe** Form2, viene dichiarata implicitamente
da VB.NET... e non quando avvii Form1 o qualsiasi altra cosa, ma
semplicemente quando ti riferisci al nome 'Form2' per la prima volta.

semplicemente quando ti riferisci al nome 'Form2' per la prima volta.
Quindi,  "l'operazione"    "...= new Form2", anche in VB.net viene eseguita 
solo quando viene premunto il pulsante, con la sola differenza, che in C# lo 
devi scrivere personalmente nel codice all'interno del pulsante,  in VB 
viene scritto dal sistema. In poche parole, in VB.Net,  "...=new Form2" c'č 
ma non si vede.
Ho capito bene? 

 Ho capito bene?
Sostanzialmente si, ed è per quello che è stata una fesseria da parte
di MS riaggungerlo, visto che in pratica ti risparmia una riga di
codice stupida, mentre, non avendo il controllo diretto di quella
variabile, perdi un sacco di effetti secondari: invocare un
costruttore personalizzato, intervallare codice tra la creazione e la
visualizzazione, visualizzare più istanze della stessa finestra,
ecc... tutte cose per le quali ti serve la sintassi esplicita
...e allora tanto vale usare sempre quella!

Ora mi è tutto chiaro. L'istanza viene creata solo quando viene pigiato il 
pulsante, sia con C# e con Vb.net.
Grazie 10000
nero23