https://foro.gambas-es.org/viewtopic.php?f=1&t=52
-----------------------------------
soplo
Viernes, 18 Septiembre 2009, 21:16

Barras De Menús En Gambas
-----------------------------------
Para hacer un menú en un formulario gambas basta con hacer click con el botón derecho en el formulario y elegir menu editor

La pantalla que sale es muy similar a la que veíamos en VB, pero con una importante diferencia. La propiedad group que sirve para indicar el manejador de eventos permite que una opción del menú pueda tener el mismo evento que un botón del formulario.

Así por ejemplo si tenemos una opción Abrir y tenemos un botón o imagen que también sirva para abrir podemos poner a ambos el mismo group y solo tendremos que escribir un código para ambos casos.

Ejemplo de creación de un menú
[quote]1. En el formulario botón derecho y 'editor de menu'
2. Pulsar 'insertar' para añadir un elemento nuevo
     2.1 Nombre:  Fichero.  Título: &Fichero. 
3. Pulsar 'insertar' para añadir un elemento nuevo. Pulsar -> para insertar una entrada dentro de Fichero
     3.1 Nombre:  AbrirFichero. Grupo: Abrir. Título: &Abrir. Activar CTRL y elegir 'A'. Imagen: pinchar en seleccionar imagen, elegir stock y elegir icono open.
4. Pinchar en siguiente
5. Pulsar 'insertar' para añadir un elemento nuevo
     5.1 Nombre:  GrabarFichero. Grupo: Grabar. Título: &Grabar. Activar CTRL y elegir 'G'. Imagen: pinchar en seleccionar imagen, elegir stock y elegir icono save
6. Pinchar en siguiente
7. Pinchar en siguiente
8. Pulsar 'insertar' para añadir un elemento nuevo
     8.1 Nombre: barra.   Nada mas
9. Pinchar en siguiente
10. Pulsar 'insertar' para añadir un elemento nuevo
     10.1 Nombre:  Salir. Grupo: Salir. Título: &Salir. Activar CTRL y elegir 'X'. Imagen: pinchar en seleccionar imagen, elegir stock y elegir icono End
11. Pinchar en OK[/quote]

Con esto ya hemos creado un menu genérico.
Control A --> Abrir archivo. Control G --> grabar archivo. Control X --> salir.

Ahora crearemos la barra del menú.
[quote]1. Ponemos un contenedor en la zona en la que corresponda la barra. Si es una barra horizontal pensar en el HPanel o en el toolbar (con propiedad orientacion=horizontal). Si es una barra vertical pensar en VPanel o en el control toolbar (con propiedad orientacion=vertical).
2. Dentro del container insertar un toolbutton.
   2.1 Propiedad Group=Open. Picture=open. Tooltip="Abrir fichero"
3. Dentro del container insertar un toolbutton
   3.1 Propiedad Group=Grabar. Picture=save. Tooltip="Grabar fichero"
4. Dentro del container insertar un toolbutton
   4.1 Propiedad Group=Salir. Picture=End. Tooltip="Salir"[/quote]

Hay botones como el de la negrita que son ON o OFF. Estos toolbutton deberían tener activada la propiedad toogle y deberían tener un valor inicial en Value.
Hay botones como el de alineación que son de tipo radiobutton. Estos botones al acivarlos desactivan otros. Estos botones deberían tener activada la propiedad radio y tener un value inicial.

Por último programar eventos en sus manejadores
[code linenumbers=false]sub Abrir_Click
print "abrir"
end 
sub Grabar_click
print "grabar"
end 
sub Salir_click
print "salir"
end [/code]


-----------------------------------
soplo
Domingo, 18 Octobre 2009, 19:49

Re: Barras De Menús En Gambas
-----------------------------------
Acabo de probar como funcionan los popup menu.

Tan simple como esto.

En un formulario poner dos variables publicas
[code linenumbers=false syntax=gambas]Public BarraMenu as menu
Public ItemMenu as menu[/code]

Para crearlos (yo voy a hacerlo en form_open por comodidad)
[code linenumbers=false syntax=gambas]public form_open()

BarraMenus=new menu(me) '--> crear el menu

itemmenu=new(menu(BarraMenus) as "PrimerItem" '---> crear el primer item
ItemMenu.text="Primera opción"

itemmenu=new(menu(BarraMenus) as "SegundoItem" '---> crear el segundo item
ItemMenu.text="Segunda opción"

itemmenu=new(menu(BarraMenus) as "TercerItem" '---> crear el tercer item
ItemMenu.text="Tercera opción"

...
end [/code]

Ahora programar lo que harán las opciones del menu
[code linenumbers=false syntax=gambas]public sub PrimerItem_click()
message.info("primera opción")
end sub

public sub SegundoItem_click()
message.info("Segunda opción")
end sub

public sub TercerItem_click()
message.info("Tercera opción")
end sub[/code]

Ahora ponemos dos objetos en el formulario, los que querais. Yo pongo dos botones por comodidad buton1 y buton2

Por último asociar ese menú popup ya funcional a los dos botones. Quieo que el menu salga en la posición x e y de cada control.

[code linenumbers=false syntax=gambas]Public sub Buton1_MouseDown()
if mouse.right then
   BarraMenus.popup(last.x, last.y)
endif

Public sub Buton2_MouseDown()
if mouse.right then
   BarraMenus.popup(last.x, last.y)
endif
[/code]

Como veis las dos rutinas hacen lo mismo. Podría haber hecho una rutina común para ambas, pero me ha parecido mejor por claridad dejarlas separadas para que se vea el funcionamiento del menú popup.

¡Que simple!
 :mryellow:


-----------------------------------
jguardon
Domingo, 18 Octobre 2009, 21:14

Re: Barras De Menús En Gambas
-----------------------------------
Para hacer que un menú emergente aparezca (popup), es mejor usar el evento _Menu del control en donde quieres que aparezca.

Por ejemplo:

[code linenumbers=false syntax=gambas]Private sub Form1_Menu()

    mimenu.popup()

End[/code]

Esto hará que al pulsar el botón derecho del ratón sobre el formulario, aparezca el menú bajo el cursor. Para hacer que aparezca desde un TrayIcon, echa un vistazo a este código: http://bashare.googlecode.com/files/BaShare-gambas-src-0.4.2.tar.gz , una útil aplicación que implementa todo esto.


-----------------------------------
shordi
Viernes, 23 Octobre 2009, 12:07

Re: Barras De Menús En Gambas
-----------------------------------
¿Hay alguna manera de referenciar un menú por su nombre?
Algo que no sea  me.menus[0].children[1] y cosas así.
Es que al insertar una opción más se descabalga todo el código.


-----------------------------------
fabianfv
Viernes, 23 Octobre 2009, 18:07

Re: Barras De Menús En Gambas
-----------------------------------
[quote]¿Hay alguna manera de referenciar un menú por su nombre?
Algo que no sea  me.menus[0].children[1] y cosas así.
Es que al insertar una opción más se descabalga todo el código.[/quote]

¿Cuál es concretamente el problema que mencionas?

Un menú se construye por medios de objetos menu, también las opciones de un menú o submenú son objetos menú; por ejemplo, una opción en un submenú tiene como contenedor a otro objeto menú creado previamente. Cada objeto menú lleva un nombre, por lo tanto puedes referenciar cada objeto menu por su nombre.

Supongamos que creas un menu archivo con esta forma con el editor de menús:

Archivo (mnuArchivo)
...Nuevo (mnuArchivoNuevo)
...Abrir (mnuArchivoAbrir)
...Cerrar (mnuArchivoCerrar)
...Salir ((mnuArchivoSalir)

La forma de referenciar el menú es:

[code linenumbers=false syntax=gambas]
me.mnuArchivo.Visible = TRUE
me.mnuArchivoNuevo.Checked = FALSE
[/code]

Los objetos menu no exponen su contenedor, por eso en ellos la propiedad parent no existe. En consecuencia no puedes escribir algo como:

[code linenumbers=false syntax=gambas]
mnuArchivoCerrar.Parent
[/code]

Si los creas por código, en vez de escribir:

[code linenumbers=false syntax=gambas]
BarraMenus=new menu(me) '--> crear el menu

itemmenu=new(menu(BarraMenus) as "PrimerItem" '---> crear el primer item
ItemMenu.text="Primera opción"

itemmenu=new(menu(BarraMenus) as "SegundoItem" '---> crear el segundo item
ItemMenu.text="Segunda opción"

itemmenu=new(menu(BarraMenus) as "TercerItem" '---> crear el tercer item
ItemMenu.text="Tercera opción"
[/code]

Puedes escribir algo como:

[code linenumbers=false syntax=gambas]

PUBLIC SUB CreaMenu()
DIM mnu, mnuOpt AS Menu

  mnu = NEW Menu(ME)
  mnu.Name = "mnuArchivo"
  mnu.Text = "Archivo"

  mnuOpt = NEW Menu(mnu) AS "mnuArchivoNuevo"
  mnuOpt.Name = "mnuArchivoNuevo"
  mnuOpt.Text = "Nuevo"

  mnuOpt = NEW Menu(mnu) AS "mnuArchivoAbrir"
  mnuOpt.Name = "mnuArchivoAbrir"
  mnuOpt.Text = "Abrir"

  mnuOpt = NEW Menu(mnu) AS "mnuArchivoCerrar"
  mnuOpt.Name = "mnuArchivoCerrar"
  mnuOpt.Text = "Cerrar"

  mnuOpt = NEW Menu(mnu) AS "mnuArchivoSalir"
  mnuOpt.Name = "mnuArchivoSalir"
  mnuOpt.Text = "Salir"

END

PUBLIC SUB mnuArchivoSalir_Click()
  ME.Close
END
[/code]

Espero te sirva. Saludos.


-----------------------------------
shordi
Viernes, 23 Octobre 2009, 22:36

Re: Barras De Menús En Gambas
-----------------------------------
Perfecto, gracias. El problema no existía, es que yo me empeñaba en buscar los menú a partir de la colección Menus. Ni siquiera había intentado referenciarlos directamente. Me he roto los cuennos buscando formas de retorcer cosas como Menu.Children[0], y engendros por el estilo... 
¿Cómo era el refran? "Un tonto sigue un camino. El camino se acaba y el tonto sigue"... o algo así. Pues eso.
Gracias de nuevo.


