Newsgroup: it.comp.dotnet
Titolo: Creare form (e controlli) a runtime

Dunque ... ho le vertigini per quanto è dinamico 
VB.NET
 
rispetto al VB6.
Ma, si sa, più uno lo nutri, più appetito je viene.
Allora avevo la necessità di invocare una specie di 
miniwizard (MODAL non MODELESS) associato alla pressione di 
un bottone da parte di un form chiamante.
Ho creato via codice (ragazzi che potenza !) un form, l'ho 
riempito di text box e bottoni (con nome stringa), collegati 
a variabili shared withevents, e poi ho scritto a mano il 
gestore di eventi.
Ma mi sono accorto che poi il mio form creato da zero, al 
pari delle variabili di tipo classe e structure che di norma 
possono essere dichiarate nelle istanze a compile-time, con 
Dim etc, aveva la necessità di ospitare dentro almeno un 
oggetto contenitore di tipo non nativo.
Mi son reso conto di non saperlo dichiarare (non esiste 
alcun ambito nell'editor associato a quel generico form, che 
non ha nome, ma è As windows.forms.
Per adesso ho messo una pezza poco elegante, agganciando 
alla proprietà TAG (che ha tipo oggetto generico) la mia 
variabile di classe tipizzata. (con ciò mi son giocato 
l'associazione anticipata e il controllo at compile time 
ovviamente).
Sempre a mano, nel gestore di eventi del bottone creato del 
form creato, faccio un altrettanto bruttino CType della 
property generica TAG (l'unico gancio che ho escogitato) al 
tipo classe agganciato altrove.
E' chiaro che è fragilina sta roba. Se ci agganciassi altro 
per errore, sarebbe un crash.
Allora domanda : si possono associare, con tanto della loro 
tipizzazione anticipata, variabili arbitrarie (locali o 
globali, fate voi) alla variabile di istanza di un form 
creato dinamicamente ?
Non ho veramente idea se chiedo una cosa strana, ovvia, o 
demenziale.
Grazie in anticipo ai gurus :)
ciao
Soviet

 demenziale.
Ti confesso che non mi e' facile capire di cosa stai parlando... fra
l'altro assumo che la tecnologia e' WinForms, ma sarebbe bene che tu
fossi esplicito nei tuoi quesiti sia sulla tecnollgia a cui ti
riferisci sia qual e' la versione del framework. Cio' premesso:
Se intendi che il form e' creato completamente via codice, la prima
cosa che mi verrebbe da suggerirti e' di avere invece un form a design-
time a cui solo i controlli sono aggiunti a run-time. In questo modo
hai il contesto in cui scrivere tutto il codice che vuoi...
-LV

 -LV

 Intendo essenzialmente variabili (dati) e non tanto metodi.
Direi proprio di no (a meno di non impelagarti in cose molto piu'
complesse tipo la generazione dinamica di assembly...). D'altra parte,
per esempio, nello stesso contesto in cui crei il form in questione
puoi avere proprieta' o comunque membri che siano pubblici e quindi
accessibili dal form appena creato. Nota che questi non devono essere
necessariamente statici: puoi usare uno degli overload di Show o
ShowModal che ti consentono di passare un riferimento all'owner...
Comunque non uso WinForms da parecchio e da ancora meno mi e' capitato
di creare form e controlli dinamicamente: ci potrebbero essere
approcci migliori, o piu' snelli, o semplicemente meglio tagliati
sulle tue specifiche esigenza... La regola generale pero' e' sempre la
stessa: keep it simple (as simple as possible).
In bocca al lupo,
-LV

 ShowModal che ti consentono di passare un riferimento all'owner...
Ecco : mi hai dato un altro spunto grandioso.
PErché possedere dati, se fosse possibile INTERROGARE dati 
presenti nel form chiamante ?
Dopotutto questi diamine di dati, mi servono solo da 
caricare dal chiamante e scaricarli (optavo per delle 
reference confidando, blandamente, che non facesse una copia 
fisica, ma se potesse attingere all'istanza genuina del 
chiamante, che ha tutti i dati da copiare, sarebbe tanto 
meglio ancora). Indagherò !
ciao e grassie
Soviet


 Il 17/03/2011 20:12, LudovicoVan ha scritto:
Riciao ... uhm
Sono inciampato in un'altro problema (ho seguito il tuo 
consiglio di mettere le variabili dentro un form creato a 
design time).
Ora il mio problema nasce dal fatto che devo invocarlo MODAL 
(e non modeless) e non si ritorna da ShowDialog sin quando 
non chiudo il form stesso.
Per quanto riguarda passare gli oggetti AL form dinamico, no 
problem
La routine in cui lo CREO, nascosto, prima di usare 
showdialog, copia le variabili nel chiamante nelle reference 
del dato form dinamico (riempito a runtime).
Quando però ritorno da ShowDialog, chiudendo il form 
malefico, non riesco in nessun modo a ricopiare i dati 
elaborati nelle reference del form padre. Tutti i 
riferimenti si resettano a NOTHING quando il modal cessa di 
esistere.
Nell'evento form_closing ho tentato di settare e.cancel=true
e barare, scrivendo me.hide (insomma volevo che il modal si 
nascondesse ma non morisse ... ma non ritorna. Tenta di 
nuovo da solo di fare closing, e dopo avere rifatto 
e.cancel=true, da solo, muore ugualmente e si scarica ... e 
annulla tutte le sue reference create con NEW e assegnate 
alla variabile creata dentro il form padre, variabile che si 
vanifica al ritorno)
Non ci sto a capire più una mazza. Ma come cavolo faccio a 
controllare il life time, se non con new ?
Io voglio riuscire a copiare le variabili del figlio dentro 
il padre ... copiare, non solo agganciare un riferimento. 
Pensavo che con new funzionasse, che istanziasse veri dati 
... ma sembra di no, muoiono col morire dello scope.
boh
scusa se tedio con questi problemucci :(
ciao
Soviet

 esistere.
Potresti mostrare qualche riga di codice? Mi aspetteri che proprio
nello handler del close "copi" quello che eventualmente c'e' da
"copiare", ma e' difficile aiutarti se continui a non dare nessun
elemento concreto: di *cosa* e' che stai parlando e che dovresti
copiare (per lo meno, quali *tipi* di dati, ecc.) e cosa e' che hai
provato che non ti rida'?
Intanto ti consiglierei di leggere qualcosa su value types vs
reference types, ma piu' che altro perche' e' da sapere e perche' mi
costringi ad andare totalmente a naso...
-LV

 -LV

 Ora ho allocato tutto nel padre e funge
spiegati meglio perchè questa cosa è sbagliata upfront :-)
.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

 sin quando non lo ammazzo io.
In generale, i reference type vanno nel cosiddetto heap (vs. stack) e
vengono eliminati via garbage collection, indeterministicamente,
quando il reference count (il numero di referenze esistenti) va a
zero.  Di nuovo, ti tocca guardare un po' di documentazione, in questo
caso sul memory management in .Net: il "metodo induttivo" e' garanzia
certa che fra 10 dieci anni stai ancora a fare scommesse...
-LV