Newsgroup: it.comp.lang.visual-basic
Titolo: Trovare la form principale dell'applicazione

Ciao,
eccoci con una domandina sfiziosa.
E' possibile, in un qualunque momento, conoscere (immagino tramite 
reflection) quale e' la form principale dell'applicazione, ammesso che 
l'oggetto di avvio sia appunto una form?
Questa cosa dovrebbe funzionare anche se la richiesta della form viene fatta 
da un assembly diverso dal principale, tipo dll referenziata ecc.
C'e' un modo?
 

Ciao vbMizio,

Windows Forms?
WPF?
 
.m
 
-- 
blog @ //
milestone.topics.it
 
 
 

WPF?
....
Perche' anche un progetto WPF puo' avere una Form principale? Non lo sapevo.
Cmq WinForm, VB 2008
Grazie 
 

Ciao vbMizio,
 
You wrote on 08/05/2012 :

WPF: Application.Current.MainWindow
Windows Forms: ApplicationContext.MainWindow, però devi avviare 
l'applicazione passandogli tu l'istanza dell'ApplicationContext a cui 
assegni la MainWindow


Windows Forms: ApplicationContext.MainWindow, però devi avviare
l'applicazione passandogli tu l'istanza dell'ApplicationContext a cui
assegni la MainWindow
....
'annaggia, non e' esattamente quello che mi aspettavo.
In realta', in quello che ho in mente, mi serve sapere la form principale di 
una applicazione, in un metodo dichiarato in una dll referenziata dal 
progetto stesso, quindi il mio metodo non puo' sapere se l'applicazione ha 
passato o meno un ApplicationContext.
 

 passato o meno un ApplicationContext.
 
Visto che dici che la DLL è referenziata dai progetti che la sfruttano, non è più semplice tagliare la testa al toro e ribaltare la faccenda, così diventa anche più generica?
Fai passare dall'applicazione chiamante, in fase di startup o quando credi, un riferimento alla form che vuoi rendere accessibile alla DLL (quindi My.Application.ApplicationContext.MainForm per chi lo ha, o un'altra form a piacere per i progetti che non hanno una "main" vera e propria)

Ciao vbMizio,

non mi viene in mente nessuna soluzione sensata, mi puzza però che tu 
abbia bisogno di conoscere da una dll referenziata la strututra visuale 
dell'applicazione.
Puoi dettagliare di più il tuo scopo?


Puoi dettagliare di più il tuo scopo?
...
In realta' e' piu' una cosa a scopo didattico che mi e' venuta in mente, 
provo comunque a spiegarmi meglio.
Per evitare di scrivere numerose volte lo stesso codice, mi sono costruito 
una dll (servono anche a questo, no? :-) ) dove raggruppo vari metodi di 
utilita', tra cui, ad esempio, un metodo che apre una OpenFileDialog.
Al metodo ShowDialog di OpenFileDialog, si puo' passare un oggetto Form che 
sara' l'Owner dell' OpenFileDialog stesso. Se non gli si passa nulla, di 
default viene "presa" la form attiva in quel momento (giusto, vero?). E se 
volessi invece che il proprietario dell'OpenFileDialog sia la form 
principale?
Sarebbe a questo punto utile avere  un modo, dalla dll referenziata, per 
poter stabilire chi e' questa form, cosi' da poterla passare come argomento 
al metodo ShowDialog.
Utilita' di tutto questo?
Boh, al momento non mi viene in mente molto, ma fa sempre bene conoscere 
qualche trucchetto che magari puo' tornare utile in futuro :-)
 

 qualche trucchetto che magari puo' tornare utile in futuro :-)
 
Sempre :-).
 
Bye, G.

diventa anche piů generica?
...
Si, potenzialmente potrei, volevo solo evitare di doverlo fare a mano :-)
Piu' che altro per rendere "uniformi" le applicazioni che utilizzano questa 
dll con meno codice e meno possibilita' di dimenticanze possibili.
 

Passarla come parametro non si può fare, oppure pare brutto ?
...
La seconda che hai detto :-)
Certo che si puo' passare come parametro, ma cosi' son capaci tutti! :-P 
 

 dll con meno codice e meno possibilita' di dimenticanze possibili.
 
Beh, alla fine, la chiamata a uno dei tuoi metodi di utilità la dovrai sempre fare "a mano" no? una volta che stabilisci che ha un parametro form, o quello che ti pare, in ingresso, non puoi dimenticartelo nemmeno volendo, e le righe di codice sono sempre quelle...
 
La comodità di scoprire automaticamente quale sia la main form la vedo abbastanza limitata rispetto all'alternativa banale del parametro (e anche se facciamo finta esistesse un sistema semplice via Reflection, sarebbe lo stesso uno spreco di CPU in proporzione)
 
Io poi, in generale, son sempre dell'idea che una class library dovrebbe conoscere il meno possibile dei suoi chiamanti.

conoscere il meno possibile dei suoi chiamanti.
...
In generale, si, ma puo' capitare che serva anche dirgli "chi" la sta 
chiamando.