Newsgroup: it.comp.lang.visual-basic
Titolo: Menu Popup

Ciao a tutti...
Ho un bel problema da risolvere, e anche abbastanza difficile
da spiegare...   ci provo.
Ho una applicazione con un form principale, che chiamero'
Form1.   Su questo form e' presente un controllo TreeView.
Cliccando col tasto destro su un nodo appare un menu
Popup che permette alcune scelte.   Fra queste, una voce
'proprieta' che causa il caricamento di un secondo form,
che deve necessariamente essere chiamato in modale,
per motivi che non sto qui a spiegare.
Osservo intanto che dall'evento MouseDown sul TreeView
viene chiamato il menu Popup_0, da questo la voce
Popup_0Proprieta, e dal corrispondente evento Click
avviene la chiamata Form2.Show vbModal.
Quindi quando il Form2 e' visibile e attivo, in realta' la
routine Popup_0Proprieta_Click non e' ancora terminata,
e il menu Popup_0, sebbene non piu' visibile, e' ancora
aperto.   Fin qui poco importa, ma...
Sul Form2 chiamato ho altri controlli, e ho bisogno di far
apparire un altro menu popup su questo, sempre con la
tecnica del tasto destro del mouse.   Non appare un bel
niente, ma in compenso, quasi per dispetto, nonostante
la classica procedura di disabilitazione dei textbox, al
posto del mio popup, appare quella fetecchia di popup
standard....  (Il mio no, ma quello si, eh ?)
Sull'help mi si dice che una chiamata al metodo
PopupMenu viene ignorata se e' contemporaneamente
aperto un altro popup, quindi il Popup_2 del Form2 non
appare perche' in realta' e' ancora aperto Popup_0.
Il Form2, se richiamato con altri metodi, funziona in modo
perfetto.
Ho provato davvero di tutto, prima di disturbarvi, ma non
ci riesco proprio....
avete idee ?
Grazie a tutti!
--
Frogman
indirizzo e-mail corretto: 
be...@reboot.to
--------------------------------------------------------
Non fate i bambini in provetta.
Fateli nella zuppiera che ce ne stanno di piu'.
--------------------------------------------------------

 che deve necessariamente essere chiamato in modale,
[...]
Sposta il menu sul form2.

 ha scritto nel messaggio news:8si7o4$knk14$1...@ID-51240.news.cis.dfn.de...

Form1 e Form2 hanno ognuno il loro menu popup.  Ho provato
anche ad unificarli, richiamando lo stesso menu da entrambi, ma
non funzia lo stesso.


 non funzia lo stesso.
Cosa vuol dire "hanno ognuno il loro menu popup" ?.
La questione è che non puoi richiamare due volte un menu
che fa riferimento allo stesso parent.
Se il menu popup di Form1 appartiene al form stesso e lo
stesso vale per Form2, allora il menu di Form2 può apparire
anche se la routine collegata al primo menu non è terminata.

 anche se la routine collegata al primo menu non č terminata.
Il problema e' che non e' cosi', purtroppo.  Form1 ha il menu
Popup_0 e Form2 ha il menu Popup_2.  Sono indipendenti,
ma finche' Popup_0 non e' chiuso, non parte Popup_2 sul
Form2.
Comunque nel frattempo una soluzione l'ho trovata.  Fa schifo
ma intanto posso andare avanti.  Se mi avanza tempo vedro'
di trovare una soluzione piu' pulita.
Ho fatto cosi':   L'evento Popup_0Proprieta del Form1 setta
una flag e basta.    Nell'evento MouseMove di TreeView1 sul
Form1  (che viene acceso alla chiusura di Popup_0 visto
che il puntatore del mouse si trova li) analizzo la flag e chiamo
Form2.    E tutto funziona perfettamente.
La soluzione mi fa proprio girare le budella per non dire altro,
ma meglio che niente.
Grazie, ciao


 anche se la routine collegata al primo menu non č terminata.
Aspetta, ho messo un esempio qui:
 
http://www.reboot.to/varie/prova.zip
se hai voglia e tempo, o se qualcun altro vuol cimentarsi,
butta un occhio:  sono poche istruzioni, ma il concetto che
voglio esprimere lo rende bene, meglio delle parole.
Ciao


 che deve necessariamente essere chiamato in modale,



 Il problema e' che non e' cosi', purtroppo.
[...]
Hai ragione. Ho dimenticato che l'ambiente è VB.
Nel caso di un form modale, il thread è sempre lo stesso,
quindi niente menu.
Una soluzione quindi potrebbe essere quella di creare un
thread separato che consenta di concludere la routine
corrente. Purtroppo da un thread creato tramite CreateThread()
non è possibile instanziare degli oggetti. Sarebbe necessario
quindi servirsi di una classe e utilizzare la funzione
CoMarshalInterThreadInterfaceInStream () prima di usare
CreateThread(). La cosa diventa un po' troppo complessa se
lo scopo è di mostrare semplicemente un menu, potrebbe però
essere interessante.
Altra soluzione:
potresti utilizzare un oggetto Timer per creare il thread separato,
impostare l'intervallo ad un valore basso, diciamo 10, e richiamare
il secondo form modale.
Oppure:
un'altra soluzione (se per te è importante che Form2 sia modale
solo rispetto a Form1) è utilizzare la funzione SetParent() oppure
SetWindowLong() per far risultare Form2 sempre in primo piano
rispetto a Form1. E' sufficiente che Form1, prima che venga caricato
Form2, venga disabilitato (ossia Form1.Enabled = False).
Ottieni un form modale solo per quanto riguarda Form1, mentre
il resto dell'applicazione è accessibile.
Se ti interessa una di questi metodi, fatti sentire.

 wrote:
Non č possibile visualizzae un popup menů su un form apero come modale: portalo in primo piano e
nascondi quello sotto...
Ciao,
Moreno
#sirri#@#morenosoft#.com
(togliete "#" dall'indirizzo)
Moreno Sirri VB Site - 
http://www.morenosoft.com/MSVBSite/
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
---------------------------------------------------------------------------

 ma meglio che niente.
Purtroppo credo che al momento ci sia poco di meglio; caricando il form in
maniera modale, effettivamente blocchi il codice dell'evento Click e come hai
gia' letto sulla guida e' quello il problema.
Se puo' esserti di aiuto il sistema che uso io e' quello di mettere un timer
sulla form con un itervallo relativamente basso (diciamo mezzo secondo o meno) e
disabilitato; l'evento Timer contiene un codice del tipo:
Private Sub Timer1_Timer()
'disabilitiamolo subito, il codice va
'eseguito solo una volta per ogni Click di menu'
Timer1.Enabled = False
Select Case Timer1.Tag
Case ""
    Exit Sub
Case mnuUno.Name
    Form2.Show vbModal
Case mnuDue.Name
    Form3.Show vbModal
    'e cosi' via...
End Select
Timer1.Tag = ""
End Sub
i click delle varie voci popup invece:
Private Sub mnuUno_Click()
Timer1.Tag = mnuUno.Name
Timer1.Enabled = True
End Sub
anche questo fa un po' girare le budella, ha il piccolo vantaggio di poter
essere usato genericamente per tutti i popup di un form e non legato solo a
quello del TreeView
Ciao
--
Luca Dormio
luca....@tin.it
luca....@sig-la.com