Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Creare un Menu dentro un OCX...Si può?

Ciao a tutti..
Oggi, dopo aver implementato un Ocx/Toolbar per gestire le mie Form,
mi č venuta un'idea (una ogni tanto :))) : Se creo (con l'editor di menu di
vb) nell'ocx i menu a tendina, poi non dovrň farli nelle form..
Invece scopro che  l'editor di menu negli Ocx non visualizza nulla, quindi
anche se trascino l'ocx nella form non avrň nessun Menu..
C'č qualche modo per includere in un Ocx anche dei menu..
Altrimenti esiste un controllo (Molto Leggero) da poter includere nell'ocx?
Grazie
Ciao
oZ

 C'č qualche modo per includere in un Ocx anche dei menu..
Siccome un OCX non č una form, non ci puoi inserire dei menu. Puoi perň
creare i menu a runtime sulla form che lo contiene usando l'API CreateMenu
(sul container dell'OCX) e popolare il menu appena creato con la
InsertMenuItem.
Se inserisci tutte le sub degli eventi del menu direttamente nel tuo OCX,
poi puoi gestire i menu della form tramite l'istruzione WithEvents.
Non č una cosa banalissima, ma credo che con un po' di sbattimento di cranio
contro il muro si possa fare. :-)
Ciao
*Roby*

 poi puoi gestire i menu della form tramite l'istruzione WithEvents.
Questa nn l'ho capita, dopo che ho creato il menu sulla Form, come faccio
ad intercettare la pressione della voce di menu?
Un ocx non è già di per se withEvents?
Infatti vedo già gli eventi che mi sono dichiarato nell'ocx...
Mettiamo di aver creato il menu salva nella form
nell'Ocx ho un metodo pubblico (a cui passo un enum di tutte le operazioni
che può fare es. Salva, Modifica, Annulla, Elimina,...)  e n° eventi che
vengono scaturiti..
Adesso alla pressione del Salva nella form devo fare una chiamata all'ocx
ocx.Azione (DIA_Salva)
Ma dove metto il codice della chiamata se il menu è stato creato a Run-Time?
Ciao e grazie
oZ

 Ma dove metto il codice della chiamata se il menu è stato creato a
Run-Time?
Nell'OCX crei la seguente sub:
Private Sub MnuFile_Click(Index As Integer)
   ' qui dentro ci puoi mettere il tuo codice, oppure un raiseevent
End Sub
Il problema come ti dicevo è che devi partire dal controllo e non dal suo
handle. Forse un modo c'è, ma al momento ho un brutto raffreddore e  non lo
vedo. ;-)
Ciao
*Roby*
P.S.
Forse qualche cosa mi è venuto in mente. Si potrebbe ciclare su tutti gli
oggetti della form per trovare l'oggetto di tipo menu. Un po'
"spaghetti-code", ma dovrebbe andare.

 spiegato meglio di quanto possa fare io.
Intendevo che se creo un ocx e lo trascino su un form non devo dichiararlo
come Withevents, mi compare già nella lista degli oggetti che espongono
eventi, mentre per le classi devo dichiararle come withevents...
Vediamo se ci sono quasi arrivato...
Creo il menu a RunTime nella Form, ho l'handle del Menu.
Dichiaro un variabile WithEvents di tipo Menu.
Dim WithEvents MnuMenu As Menu
Adesso devo fare una cosa del tipo
set  MnuMenu = MenudellaForm (di cui ho l'handle)...
Giusto??
Soluzioni :
1) Esiste l'api che mi ritorna un oggetto passandogli l'handle,
2) Scorro i controls della form, quando trovo il menu faccio il Cast (si
chiama così?) tra i due oggetti, quindi quando preme il Menu nella form
vengono eseguite le routine dentro l'Ocx..
Cosa dici?
Ciao
oZ
P.s   6 un grande!!!!!!!!

 P.s   6 un grande!!!!!!!!
Io ti ho solo dato una dritta. Se riesci a far funzionare il tutto, ti
rigiro volentieri il complimento. Magari alla fine potresti mettere il
sorgente del risultato sul sito comune....
Ciao
*Roby*

 sorgente del risultato sul sito comune....
Mi rispondo da solo. Esiste già un progetto per creare Menu a runtime nel
sito comune. Lo trovi qui:
http://www.it-lang-vb.net/download.asp?file=Archivio/Sorgenti/crtmenu.zip&ID
=406
E' ben scritto, ma poco comentato. Nel vbp contiene un riferimento a
Microsoft Office 9.0 Object Library, che però è inutile, ma basta ignorarlo
e funziona tutto ugualmente.
Ciao
*Roby*