




































Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Apuntes de Metodología y Tecnología de la Programación sobre Power Builder, Trabajando con una nueva ventana, otros íconos que se generan al tener abierta una ventana, Controles de ventana y sus prefijos.
Tipo: Apuntes
1 / 44
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!





































Curso de Programación VI (Power Builder)
( Apuntes de clase y F1 de la herramienta )
ULACIT ´
Creado: 18 de mayo de 2000
Modificado: 9 de Julio de 2000
Introducción
El uso de esta herramienta de desarrollo de software está destinada hacia el lenguaje de manipulación (DML) en cerca de un 80%. Por lo que su interacción con motores de bases de datos es muy extensa; principalmente a través del objeto Data Windows que posteriormente se discutirá ampliamente.
Un detalle importante en relación a los S I es que, siempre que se pueda las reglas del negocio deben estar presentes en la definición de los modelos de datos, para de esta manera hacer más ágiles las modificaciones que a futuro se le tengan que hacer a los S I de la organización.
Ahora bien, con relación a los motores de bases de datos, es importante destacar que un motor puede ser accesado desde una herramienta de diseño como lo es Power Builder de dos formas:
Driver nativos : aquí se necesita que tanto fabricante del DBMS como el desarrolador de la herramienta se pongan en contacto para incluir en la herramienta de desarrollo los drivers nativos del Sistema Gestor. Esto tiene la ventaja que entonces al sistema gestor le serán explotadas casi el 100% de sus vondades.
Driver ODBC: por otra parte, si no hay contacto entre los proveedores, se puede hacer uso del sistema Gestor mediante conexiones ODBC (Open Data Base Conection −Conexiones Abiertas de Base de Datos−), la deficencia aquí es que no se aprovecha el 100% tanto de la herraimienta de desarrollo como del sistema gestor.
Nativo
DDL
Driver SQL DML
DCL
ODBC
Toda aplicación en Powel Builder está respaldada en al menos una o más librerías (.pbl). por lo que se podría afirmar que una aplicación es en realidad un conjunto de una o más librerías.Menú inicial de la Herramienta
Incluye el conjunto de todas las demás opciones que podemos ver en la barra de menú
Power Builder a iniciar cada sesión abre por default la ultima aplición sobre la que se ha estado trabajando
Permite tomar una o varias librerías.
Aquí cabe el comentario que para el desarrollo de proyectos es posible (recomendado) guardar todos los objetos visuales(formularios, gráficos, ect) en un .pbl y todos lo objetos(código) no visuales en otro .pbl.
Es el famoso formulario, que premie entre otras cosas comenzar una aplicación.
Son objetos definidos por el usuario, pueden bien ser ventanas de tipo general, las cuales se puedan usar en distintas aplicaciones, etc.
En este punto hay que distinguir que los objetos definidos por el usuario pueden ser de dos tipos: 1) de clase y
Se usan principalmente para enlazar ventanas, y mantener la seguridad dentro de la aplicación.
Es decisión del desarrollador en qué momentos desea crear el menú de la aplicación lo cual lo puede hacer en el inicio o bien al final del desarrollo de la aplicación.
Objeto que permite definir variables de tipos de datos (el famoso Record de otras herramientas).
Existen dos tipo de estructuras:
Generales: Se definen desde el ícono de la barra de menú − sin tener ningún formulario abierto− , estárán disponibles para toda la aplicación; por ejemplo si crearamos una estructura en este punto estaría disponible para toda la aplicación
Locales: Se define desde el menú Declare (Declare | window structures) si se crea una estructura con un formulario abierto está estará disponible solo en el ámbito de ese formulario.
Las que se encuentran disponibles desde aquí son funciones que han sido definidas, como de alcance global (= public) por la aplicación que se tiene en uso.
Aquí nos encontramos con dos connotaciones el control Data Window y el objeto Data Window. El segundo será de gran uso para enlazar los requerimientos del control data Window, el cual se crea desde este ícono.
Es un formulario con diferentes leguetas que presenta todos los objetos definidos y creados en la aplicación actual.
Muestra las diferentes librerías de la aplicación.
Este objeto permite entre otras cosas exportar librerías de diferentes versiones, regenerar librerías, y ver y modificar ciertas propiedades de diferentes objetos.
Dentro de una misma librería se pueden tener varias aplicaciones.
Para librerías
Permite agregar objetos del tipo OLE
Permite correr toda la aplicación.
Permite depurar la aplición
Permite correr solo la ventana abierta. Si se tienes que hacer acceso a datos de algún modelo esta opción no estará disponible.
Más allá del menú inicial de la herramienta
Una ves que se tiene abierta la última aplicación sobre la cual se trabajó − el menú de trabajo se amplía − , y lo que se desea es crear una nueva aplicación, o bien abrir otra aplicación, se puede hacer esto desde el menú File, escogiendo New, o también sobre el ícono new de la barra de menú.
Lo primero que hace es pedir información sobre la librería que respaldará la aplicación, que por uso general se le da el mismo nombre que posteriormente se le dará a la aplicación.
Posteriormente pide la información requerida para la aplicación en cuestión:
Una vez que se ha clicado sobre el botón OK se genera un cuadro de diálogo que pregunta si se quiere
genrerar una plantilla base para la aplicaición que se está generando.
Si se responde que sí, se corre un wizard que generará tal plantilla misma que incluirá algunas ventanas básicas, un menú para la aplicación y un área de cominicación con sql (a traes de la variable SQLCA), el cuel posee el código necesario para conectar con cualquier motor de base de datos, pero por default pegará la ultima con la que se trabajó.
Tal vez aquí es importante destacar que en Power Builder, así como muchos otros lenguajes de 4GL, todo objeto tiene dos aspectos que destacar:
Si se pulsa sobre el ícono propiedades o con click derecho sobre el ratón, se puede ver en modo de lectura algunas de ellas las propiedades del objeto aplicación. Si se desea modifocar alguna que aparezca en modo de lectura se debe hacer dando click sobre el ícono Library el cual ya fue discutido en la sección anterior.
Algunas propiedades por destacar:
Aquí se musetra el conjunto de propiedades que se definieron al crear la aplicación más algunas otras que el mismo PB definió en el momento también de generar la aplicación en cuestión.
Icon : el seleccionado aquí será el que se muestre en el ejecutable de la aplicación, una vez que esta haya sido compilada. Los que trae por defecto Power Builder están ubicados en: Archivos de programa PowerSoft ArtGal
Variable Types: cada una de las variables aquí definidas cumle con una función específica y algunas trabajas tambien en conjunto:
SQLCA: (área de comunicación con SQL), Esta variables tienes todos los parámetros necesarios para conectarse con cualquier motor de base de datos.
Si solo se va a conectar con una base de datos en la aplicación no se hace necesario dedinir más variables Transaction.
E.g: connect using SQLCA
ODBC o no
Usuario
Password
Base de datos
Nombre de base de datos
Haciendo Aplicaciones Funcionales
El objeto Ventana:
Una forma de agregar una ventana a una aplicación es clicando sobre el ícono de Window que aparece en la barra de menú.
Presenta el cuadro de diálogo Select Window, del que se puede hacer varias cosas:
De las ventanas ya existentes se puede ver el comentario asignado a cada una de ellas en el área que el cuadro de diálogo preporciona para ello.
Se puede también heredar una ventana. En este punto es importante hacer notar que una cosa es la herencia y otra muy distinta el copiar una ventana; pues cuando se hereda y se hace un cambio en la ventana principal el mismo se reflejará en la ventana subordinada.
Trabajando con una nueva ventana
Si del cuadro de diálogo lo que se escogió fue crear una nueva ventana, la misma aparecerá sobre el área de trabajo de PB, no es necesario darle nombre en un inicio, pero si es recomendado salvarla de una vez para tener el objeto protegido por cualquier eventualidad que se pueda presentar.
Una ventana como cuaquier otro objeto dispone de una serie de propiedades de las cuales quizá la que merezca discutirse para no dejar espacio a la confución es la propiedad del tipo de ventana:
Main: primer ventana que interactua con el usuario, por fuerza debe llevar marco y título. Puede tambien poseer un menú, son del tipo MDI
MDI frame:
MDI frame Microhelp
Child: ventanas que no pueden salirse del marco de la MDI que la contiene. Si se cierra el padre se cierra el hijo también
Popup: para desplegar listas de valores. Son diferentes a los menú emergentes.. Este tipo de ventana si se puede salir del marco de la tipo MDI que le contiene y si se cierra el padre la Popup puede quedar abierta.
Dos detalles importantes a manera de comentario es que hay que tener mucho cuidado con el tamaño y color de las ventanas; hay que recordar que no todo el mundo dispone de monitores de 14' ó 16' en 256 ó 512 colores. Muchas veces nos encontraremos con monitores bastante más pequeños como los que poseen los agentes repartidores y que por lo general son de tipo monocramáticos.
En este sentido trabajar con colores bastante suaves y con una resolucion bastante baja. Lo anterior se puede controlar las propiedades de la ventana, las cuales se pueden observar clicando dos veces sobre la ventana. La propiedad que controla esto se localiza en la lengüeta llamada Position. Se podría tener un tamaño definido de
ventana (como un machote− con coordenadas y tamaño, además de colores amistosos − ) y luego solo copiarlo cada ves que se necesite un formulario.
Otra propiedad para destacar sobre las venatnas es Tool Bar; que se refiere a la ubicación dentro de la ventana de un menú que se tenga asociado a ella.
Las propiedades de una ventana las podemos ver clicando dos veces sobre la ventana, dando click derecho sobre la misma y escojiendo propiedades, en el menú Edit escojiendo propiedades, secogiendo el ícono de properties sobre la barra de menú, entre otros.
Por otra parte el objeto ventana también dispone de una serie de eventos a los que se les puede dar un código (= script ) funcional.
La forma de agregar código a una ventana es dar click derecho y escoger Script con el mouse, o bien en el menu Edit escoger Script, o bien escoger el ícono de script sobre la barra de menú, entre otras.
Algunos otros íconos que se generan al tener abierta una ventana
Los íconos que se describirán son los que se musetran cuado se tienes visible el formulario
Controles de ventana y sus prefijos
Control Prefijo Command Button Cb_ Picture Button Pb_ Check box Cbx_ Radio Button Rb_ Static Text St_ Picture P_ Group Box Gb_ Line Ln_ Oval Oval_ Rectangle R_
sucesos controles de cada réplica de un objeto pueden compartirse.
Para declarar una varialbe compartida se pulsa Declare | Shared Variables, y se detalla la varialbe compartida
Ambito global: la aplicación completa puede acceder a las varialbes globales. Estas variables nunca se salen de ámbito hasta que se cierra la aplicación.
No se deberías usar variables globales si se emplea otro tipo de variables, usándolas se viola el principio de encapsulación; en otras palabras, si se establece una variable global en un suceso, otro suceso la puede reinicializar sin que el primero se llegue a dar cuenta de ello.
Para declarar una variable global se pulsa Declre | Global variables y luego se detalla la misma.
La forma de declarar variables de tipo local en un determinado evento es el siguiente:
Tipo_de_dato nombre_variable{ [número de elementos] }
Cuando se abre la ventana de script sea de una ventana o de un objeto de ventana, aparte del área de trabajo, existen el la parte superior de la misma cinco cajas de pegado de listas, con las cuales se pueden pegar rápidamente variables y objetos de uso frecuente al codificar los scripts
Paste instance: esta caja despliega todas las declaraciones de variable de réplica. Con una doble pulsación sobre una variable de réplica se puede pegar en el script
Comentarios:
En PB existen dos formas de agregar comentrios a una aplicación.
Dentro del Script Painter, existen tres objetos que son muy funcionales a la hara de agregarcódigo a la aplicación; los describimos acontinunación:
Como se puede notar con estas herramientas practicamente podemos generar código PB sin conocer la estructura de su sintaxis!!!.
Algunos íconos útiles para este momento:
Creación de Funciones Definidas por el Programador
Power Builder ofrece al progamador la posibilidad de crear funciones definidas por el mismo. Para agregar una función definida por el usuario se escoje el menú DECLRE y ahí se escoje Windows functions lo que dará como resltado un cuadro de diálogo cuyo propósito es pegar una función definida por el usuario en el script del control que esté activo o bien agregar una nuevo función a nuestra aplicación; eventulamente se pueden elininar funciones ya previamente definidas.
Una ves que se haya escogido NEW de las opciones que preseta el cuadro de diálogo se debe dar la definición de la función tomando en cuenta lo siguiente:
Por otra parte desde el ícono FUNCTION también se pueden definir funciones (de tipo global); se hace de la misma forma que se hace desde el menú Declare. Un aspecto que es de notar en este punto es que todo objeto que aquí se envoque debe ser declarado (controles de ventana incluidos). En este mismo sentido si dentro de la funcion se usan algún control de ventana este se debe declarar como parámetro−. Las funciones declaradas
NOTA: si recien se ha cerrado el DSN, todavía no aparece ningún perfil en el DB Profile , puesto que ovbiamente no se he definido ninguno; pero en el Configure Data Base ya aparece en el DSN que se definió. También se puede destacar que si se borra en perfil el DSN aún permanece
Una vez que se ha determinado que existe el DSN al que se le quiere hacer el perfil se debe abrir el db Profile.
Los pasos para crear un perfil son los siguientes:
Uno de los parámetros más importantes para desarrollar perfiles, es el Catálogo de tablas de PB.
El catálogo de tablas, permite definir propiedad extendidas que entre otra cosa son para:
Combos : (el no aparezca en un combo Bach −que es lo que está almacenado en la db− sino que aparezca Bachiller por ejemplo)
El catálogo se crea bajo un Usuario común, por lo que se dispone para varios analistas. El catálogo está compuesto por 5 tablas que se definen bajo el usuario que trabaja sobre el catálogo, puediendo compartirse como ya se dijo.
En la lengüeta SYSTEM, definir la siguiente información: (es aquí donde se crea el catálogo de cuentas)
PB catalog table owner: el usuario −con derechos sobre la base de datos−, que será propietario del catálogo.
La ficha PREVIEW del cuadro Database Profile Setup muestra la sintaxis database Conection para establecer las propiedades de un objeto de transacción. Se puede usar este sintaxis en el script (por ejemplo en el script del suceso Open de la aplicación).
La primera vez que se conecta a la base de datos y se tiene acceso a crear datos, se crean las 5 tablas del catálogo
Cabe recordar que el dueño de las tablas que se crean en el catálogo es el Dueño del Catálogo definido desde del db Profile y por Default quedan en el DbSpace de System. −esto en el caso de Sybase−
Por otra parte al borrar el perfil de la base de datos no se borran las tablas de que han creado.
Si por algún motivo se pierden las tablas que conforman el catálogo, se pierden todas las referencias a las propiedades extendidas que se tengan sobre un modelo en particular; por lo que hay por tanto que estar respaldándolas como cualquier otra tabla importante del modelo. El catálogo solo se crea una vez.
Es uno de los medios para conectarse a bases de datos a través de código. Presentan la característica de que si se encuentran en el cliente se debe tener una logística para distribuirlos a los demás clientes.
Además se debe tener mucho cuidado del lugar donde quedan los .ini puesto que como son archivos ascii, cualquier persona podría meter mano con dolo.
El enfoque que se presenta como alternativo es tener un servidor que sirva como nexo entre los clientes y el servidor de base de datos; ambos enfoques se presentan en la siguiente figura; mostrando de diferente color el servidor que serviría de enlace.
Los archivos ini, como es conocido, trabajan por secciones; mismas que empiezan por un corchete y dentro de cada sección se determinan las variables necesarias junto con sus valores.
Un caso típico de archivo .ini puede ser el siguiente
[DATABASE]
DBPARM = ConnectString='dsn=Proyecto'
;mismo que podría servir de enlace para conectar una aplcación PB con un sistema de gestión de bases de datos.
Donde:
Configuración del SQLCA
Se hace mediante una window, en un botón que tenga el código necesario para la conección.
El código que podría presentarse en esta venatana se presenta a conticuación:
End if
// se leen los parametros del labs.ini
// P rofileString permite recuperar parámetros de un .ini
// SetP rofileString permite modificar parámetros de un .ini
// Lo que retorna el ProfileString, es una cadena. La cadena contenida en la variable de la sección a la cual se le hace referencia.
SQLCA.DBPARM = Profilestring("c:\mis documentos\power builder\clase 03\labs.ini","database","dbparm","")
// El comando anterior empieza a descargar el .ini:
// La instrucción anterior le dice que habra el archivo .ini en la sección //database y la variable dbparm.
//Lo que hace la instrucción anterior es
//tomar el dbparm del del .ini y se lo pone al dbparm de SQLCA
// La instrucción siguiente lo que hace es tomar todo lo contenido en la variable //DbParm de SQLCA ( `ConnectString='dsn=Dsn_ejemplo' ) y quitarle la //ultima comilla, después le agrega el contenido de los textboxes (usuario y //password) y finalmente le asigna de nuevo la comilla que le quitó.
SQLCA.DBPARM = LEFT(SQLCA.DBPARM, LEN(SQLCA.DBPARM)−1)+";"+ &
"UID="+trim(sle_usuario.text)+";" + &
"PWD="+trim(sle_clave.text)+";'"
// El resultado almacenado en SqlCa.Dbparm sería: ConnectString = `Dsn= proyecto; Uid= Nombre_Usuario; Pwd= Palabra_paso;'
// El resto del código del SqlCa solo garantiza que el .ini es igual que el código //del programa pera ya no es necesario; exepto el SqlCa.Dbms
SQLCA.DBMS = Profilestring("c:\mis documentos\power builder\clase 03\labs.ini","database","dbms","")
SQLCA.DATABASE = Profilestring("c:\mis documentos\power builder\clase 03\labs.ini","database","database","")
SQLCA.USERID = Profilestring("c:\mis documentos\power builder\clase 03\labs.ini","database","userid","")
SQLCA.DBPASS = Profilestring("c:\mis documentos\power builder\clase 03\labs.ini","database","dbpass","")
SQLCA.LOGID = Profilestring("c:\mis documentos\power builder\clase 03\labs.ini","database","logid","")
SQLCA.LOGPASS = Profilestring("c:\mis documentos\power builder\clase 03\labs.ini","database","logpass","")
SQLCA.SERVERNAME = Profilestring("c:\mis documentos\power builder\clase 03\labs.ini","database","servername","")
//Esta línea de código garantiza que se haya escogido sea el driver nativo o la //conexión ODBC que corresponda.
If trim(SQLCA.DBMS) = "" THEN
MessageBox("Error","No Existe Archivo DBMS",Exclamation!)
Halt Close
End If
Setpointer(Hourglass!)
//C onect es un comando de sql incrustado, después de esta sentencia PB le da el //control de la aplicación para la conexión con la base de datos al sistema gestor //que se haya escogido.
// en PB todo el sql que se introduzca debe decir ... using SqlCa o la variable de //trasacción que se tenga definida para tal efecto.
connect Using SQLCA; //no esta en PB pbScrit es un Sql Incrustado. ;
//obligado internamente open odbc para que abra el //drivers
Setpointer(Arrow!)
//La función SqlCode de SqlCA determina como se produjo la conexión con la //base de datos.
//Los valores que retona son:
// 0 cuando la conexión tubo éxito
// − 1 cuando existe algún problema en la base de datos
// 100 cuando una consulta debió retornar un registro pero retornó //más de uno.
beep(1)
messageBox("Error","−No hizo acceso a base datos !",Exclamation!)
sle_usuario.Text = ''
sle_usuario.SetFocus()
return
Else
MiTransaction.DBMS = 'ODBC' ... una vez creada hay que definir las varialbes de transacción de igual forma que como se hace con la SQLCA
Eliminación de la transaction
Una vez que la transaction ha cumplido con su objetivo, se debe destruir la variable de transacción para liberar recursos del sistema.
La eliminación de la variable de transacción se hace mediante el comando DESTROY.
Ejemplo: DESTROY MiTransaction
Orden Lógico:
Para trabajar con una variable de transacción que no sea la SQLCA, se debe seguir un orden específico a fin de no ocacionar problemas al usuario en tiempo de ejecución:
Pasos:
Manejo de menúes
Agregar un menú
La forma más prácita de hacer lo es mediente el pintor de menú de la PowerBar. Aquí dentro de las opciones más destacadas que presenta son:
Trabajando con un nuevo menú
Insertar las barras principales : cada barra principal que se inserte en el nuevo menú, será capaz de contener como es lógico, elementos dentro de ella. Pero en primer lugar hay que darle un nombre a cada una de ellas (ejemplo archivo, Edición, ect). Esto se hace en el Menú Bar Items. El ícono insert de la barra de menú, es quien nos ayuda en esta labor. Por otra parte el ícono move es quien nos permite desplazarnos entre las diferentes barras una vez éstas ya definidas. Opcionalmente se pueden borrar barras ya perviamente definidas mediente el empleo del ícono delete que se encuentra en la misma barra de herramientas. Se pueden agregar otra barra también clicando a la par de la última barra que se tiene..
Elementos de cada barra : el siguiente paso es insertar las opciones de cada barra principal previamente definida; para esto nos valemos del Menu for en el que una vez que se alla escogido la barra correspondiente; el nombre de la misma se añadirá al caption de Menu for (por ejemplo dirá algo así como Menu For Archivo ). La barra se puede escoger clicando sobre el título de la misma o
mediante el scroll que aparece en la parte posterios a éstas.
Ahora bien, una barra principal puede estar compuesta por un número indefinido de opciones dentro de ella; por lo que lo que hay que hacer para agregar cada nueva opción es dar
Inserción de barras separadoras: para agregar una barra separadora dentro de un menú en particular solo se debe agregar un guión medio ( − ), en el lugar correspondiente al nombre de la opción del menú que se tenga escogido (en el nombre del Menu Object Text).
Agregar más niveles a una opción de menú determinada: es posible al igual que en otros lenguajes de programación definir dentro de una opción de menú determinada otras opciones más. El ejemplo típico de esto es la opción Imprimir de un menú Archivo que presenta dentro de ella algunas otras opciones tales como definir impresora, imprimir docuemento, etc. En Power Builder hacer esto requiere solo de usar el ícono Next Level que se encuentra en la barra de herramientas; una vez hecho esto el definir las opciones de ese subnemú se hace de la misma forma que se definieron en el nivel previo. Pueden existir tantos niveles como sea necesario. Se puede entonces desplazarse entre niveles con los íconos Next Level y Prior Level.
Definir teclas de acelerator y shortCut: es conveniente agregar a cada menú sus respectivas teclas de acelerator y shortCut apegandose a un estándar. Para definir acelerator, se antepone un Ampersan (&) a alguna letra de la opción a la que se le está agregando el acelerator. De esta forma el usuario podra desplegar la respectiva opción del menú mediante la combinación de ALT + la letra que se haya escogido como acelerator; los acelerators trabajan nivel a nivel; así que si por ejemplo se tiene una A como acelerator para archivo y una S para la opción Salir del menú archivo, si se quiera salir del formulario en cuestión mediente teclas de acelerator, se debe oprimir primero ALT + A y luego **ALT
Barra de herramientas: es la cuarta lenguega de las propiedades del men y trabaja en conjunto con la lengüeta Pictures, en la toolbar se define el texto que puede o no aparecer sobre el ícono que se define en la lenguega Pictures.
Cabe apuntar que el lengüeta General(si la ventana es MDI, se puede definir un MDIMicroHelp el texto que aparece sobre el atatus bar)
Cógido a las opciones del menú: un menú solo es funcional una vez que este posee el código necesario para volver operativas todas sus definiciones. La forma de agregar código a una opción determinada del menú es clicando sobre el ícono Script una vez que se haya escogido la opción a la que se le desea agregar código. Una vez dentro de la ventana de código se debe escoger el evento que activará dicho código pues Power Builder posee más de un evento que puede hacer posible la ejecución de un código en particular; este evento por lo general siempre ha sido el Clicked pero aquí existe la posibilidad de invocar otro evento que desencadene dicho códogo.
Un factor que es muy importante hacer notar es que el código de los menúes se debe hacer tan general como se pueda, pues un menú en particular puede ser heredado a otro formulario, aplicación o inclusive librerías; por lo que lo ideal sería por ejemplo tener en la aplicación dentro de la que se piensa ejecutar el menú un evento definido por el usuario que realice todo el trabajo de código y dentro del código del menú solo se debería llamar dicho evento. Por ejemplo tener definido un evento que realice todo el trabajo de impresión para un caso en particular y despues dentro del codigo de la opción Imprimir del menú solo llamar ese evento (definido bajo un nombre tambien estandar), de esta manera podremos usar un menú en particular en