Documente Academic
Documente Profesional
Documente Cultură
5
PORTAPAPELES
INTERCAMBO DINAMICO DE DATOS
EL DRAG AND DROP (Drag & Drop) Arrastrar y Soltar
EL OLEDRAGDROP Drag & Drop con otras aplicaciones
MENÚS - MENUS EMERGENTES
El objeto Clipboard se usa para manipular el texto y los gráficos del Portapapeles. Este
objeto puede usarse para permitir que el usuario corte, copie y pegue texto y gráficos
en la aplicación.
El objeto Clipboard puede contener varias unidades de datos siempre y cuando cada
una tenga un formato diferente. Por ejemplo, se puede usar el método SetData para
poner un mapa de bits en el Clipboard con el formato CF_BITMAP y después usar el
método SetText con el formato CF_TEXT para poner texto en el Clipboard. Después
se puede usar el método GetText para recuperar el texto o el método GetData para
recuperar el gráfico. Los datos del Clipboard se pierden cuando se colocan otros datos
con el mismo formato en el Clipboard desde el código o mediante un comando de
menú.
SetText
Pone una cadena de texto en el objeto Clipboard usando el formato del objeto
Clipboard especificado. No acepta argumentos con nombre.
SetData
GetData
Devuelve un gráfico del objeto Clipboard. No acepta argumentos con nombre.
formato
Opcional. Una constante o valor que especifica el formato gráfico de Clipboard,
como se describe mas adelante. La constante o valor debe ir entre paréntesis.
Si formato es 0 o se omite, GetData usa automáticamente el formato
apropiado.
GetText
Devuelve una cadena de texto del objeto Clipboard. No acepta argumentos con
nombre.
formato
Opcional. Un valor o constante que especifica el formato del objeto Clipboard,
como se describe mas adelante. La constante o valor debe ir entre paréntesis.
Paste
Sintaxis objeto.Paste
Comentario
PasteOK
GetFormat
Devuelve un entero que indica si un elemento del objeto Clipboard coincide con
un formato especificado. No acepta argumentos con nombre.
formato
Requerido. Un valor o constante que especifica el formato del objeto Clipboard,
como se describe mas adelante. La constante o valor debe ir entre paréntesis.
Sintaxis Clipboard.Clear
Copy
Copia el objeto de un control contenedor OLE al Portapapeles del sistema.
Sintaxis objeto.Copy
EJERCICIO
Se propone el siguiente ejercicio, donde pueden verse todas las posibilidades del
Portapapeles.
Option Explicit
El intercambio dinámico de datos es una utilidad de Windows que utiliza Visual Basic,
y nos permite crear aplicaciones que tomen datos una de otras.
Para pasar datos de una aplicación a otra se necesitan al menos, dos aplicaciones
(lógico), una que se deje leer, y la otra (u otras), que quieran leer la información en
aquella.
Puede darse el caso que una aplicación esté recibiendo datos de otra aplicación, y a
su vez envíe datos a una tercera.
Cuando queremos que uno de estos controles sea el destino de un intercambio DDE
debemos indicarlo en sus propiedades LinkMode, LinkTopic, LinkItem, e indicarle el
tiempo de espera para un intercambio en la propiedad LinkTimeout.
Propiedad LinkMode
objeto.LinkMode [= número]
Propiedad LinkTopic
Esta propiedad es de lectura y escritura, tanto para los controles como para los
formularios.
El nombre de la aplicación origen será el nombre del de proyecto de Visual Basic sin la
extensión .VBP (si la aplicación se está ejecutando en el entorno de desarrollo de
Visual Basic), o el nombre de la aplicación de Visual Basic sin la extensión .EXE (si se
ejecuta como un archivo ejecutable independiente).
Propiedad LinkItem
Esta propiedad es de lectura y escritura, es decir, tanto sirve para saber el nombre del
control origen de los datos, como para establecerlo en tiempo de ejecución.
donde cadena es el nombre del control origen que tiene los datos y objeto es el
nombre del control al que le estamos poniendo la propiedad LinkItem.
Propiedad LinkTimeout
Nota La plazo mayor de tiempo que un control puede esperar es 65.535 décimas de
segundo, es decir, sobre 1 hora y 49 minutos. Al establecer LinkTimeout a 1 se
indica al control que espere la respuesta en una conversación DDE durante el mayor
plazo de tiempo. El usuario puede forzar que el control deje de esperar presionando la
tecla ESC..
Evento LinkNotify
End Sub
Método LinkRequest
Sintaxis objeto.LinkRequest
Método LinkSend
Sintaxis objeto.LinkSend
Objeto debe ser un control PictureBox de un objeto Form que sea origen de una
conversación DDE.
Cuando otras aplicaciones establecen vínculos automáticos con un objeto Form de su
aplicación, Visual Basic las notifica cuando el contenido de un control TextBox o Label
origen cambia. Sin embargo, Visual Basic no notifica automáticamente a una
aplicación destino DDE cuando el valor de la propiedad Picture de un control
PictureBox origen cambia. Como la cantidad de datos de un gráfico pueden ser muy
grande y como no tiene sentido actualizar la aplicación destino por cada cambio de
píxel de la imagen, Visual Basic requiere el uso del método LinkSend para notificar
Método LinkPoke
Sintaxis objeto.LinkPoke
El Drag & Drop es una forma visual de representar el movimiento de algo. Para ello
se toma algo de una parte de la interface gráfica, mediante la operación de colocar el
puntero del ratón y pulsar su botón izquierdo sobre ese algo que se quiere tomar. Sin
dejar de pulsar el botón izquierdo del ratón se desliza (se arrastra) el puntero del ratón
hasta el punto de la interface gráfica donde lo queremos dejar. Ese punto puede ser
un control o un formulario. Una vez en el punto de destino se suelta el botón del ratón
y se “deja caer” lo que habíamos tomado en el punto de origen. El efecto de “tomar”
algo de un control le denominaremos Drag. Si durante la operación de arrastre
pasamos por encima de un control, se producirá en ese control el evento DragOver Al
efecto de dejar caer le denominaremos DragDrop.
El Drag & Drop tiene un efecto visual muy didáctico. Pero NO HACE otra cosa. Es
decir, no toma nada del control origen ni lo suelta al llegar a destino. Esa acción de
tomar algo en el origen o soltarlo al llegar al destino debemos realizarla mediante
código en los eventos adecuados (MouseDown, DragOver , DragDrop), dando los
valores adecuados a las propiedades DragMode y DragIcon, y utilizando el método
Drag.
Propiedad DragMode
Cuando esta propiedad está a 0 (Manual) se debe emplear el Método Drag para iniciar
una operación Drag & Drop. Si está a 1, la operación de arrastrar y soltar se inicia
automáticamente cada vez que hacemos click sobre el botón izquierdo del ratón,
teniendo el puntero del mismo sobre el control. Los controles contenedores OLE sólo
se arrastran automáticamente cuando no tienen el enfoque.
Parece en principio mas práctico tener esta propiedad a 1. Sin embargo la realidad es
distinta. Se controla mucho mejor el Drag & Drop poniendo esta propiedad a 0
(Manual), pese a que en este caso deberemos utilizar el método Drag para iniciar el
proceso.
Propiedad DragIcon
Devuelve o establece el icono que se presenta como puntero del ratón durante una
operación de arrastrar y soltar.
Esta propiedad va a marcar el icono que aparezca durante la operación Drag & Drop
desplazándose a lo largo de la ventana. Si no se especifica esta propiedad, el
desplazamiento se expresa mediante un rectángulo del tamaño del control origen,
cosa que resulta bastante desagradable en cualquier aplicación. Debe ponerse por lo
tanto un icono en esta propiedad.
Para Nota. Cuando quiera colocar un icono animado en la propiedad DragIcon (una
hoja de papel que oscila al moverse, una hoja de papel que se destruye - ejemplos
tomados de W95-), debe usar varios iconos en secuencia. Por lo tanto debe cambiar la
propiedad DragIcon a lo largo del tiempo que dura el arrastre. Puede utilizar para ello
un temporizador (control Timer) o basarse en las coordenadas del formulario por
donde se mueve (para eso introducen en el evento DragOver del Formulario). Dado
que el cambio debe ser rápido, no es conveniente acceder al disco (mediante la
función LoadPicture) cada vez que tiene que cambiar la imagen del icono. Como para
simular un movimiento tan sencillo son suficientes pocas imágenes, (8 por ejemplo)
puede crear otras tantas variables tipo Picture, cargar las imágenes al comienzo de la
aplicación (con la función LoadPicture) y cuando necesite el movimiento animado del
icono, cargar las 8 imágenes secuencialmente desde esas variables, para simular el
movimiento
NCO.DragIcon = Variable1
NCO.DragIcon = Variable2
......
NCO.DragIcon = Variable8
Método Drag
Inicia, termina o cancela una operación de arrastre de cualquier objeto excepto los
controles Line, Menu, Shape o Timer.
El uso del método Drag para controlar una operación de arrastrar y soltar sólo se
requiere cuando la propiedad DragMode del control origen tiene el valor Manual (0).
Sin embargo, Drag puede usarse con objetos cuya propiedad DragMode tenga el valor
1 (o vbAutomatic).
Usando el método Drag puede controlar exactamente cuando quiere que se produzca
el inicio del Drag & Drop y el final. El autor de esta Guía del Estudiante vuelve a
recomendar que ponga la propiedad DragMode = 0 (Manual). Entre otras razones por
la siguiente :
Como decíamos al principio, el Drag & Drop solamente es una manifestación visual de
algo que se está produciendo, pero ese algo deberemos programarlo. Por ejemplo, es
muy típico llevar un dato de una casilla a otra (de un TextBox a otro p.e.) mediante
una operación D & D.
El dato debemos llevarlo a una variable que nos permita, al final de la operación,
introducir ese dato en el TextBox final. (No olvide declarar la variable en el lugar
correspondiente para que sea válida en ambos controles). La acción de llevar el dato a
la variable debemos hacerla en el procedimiento mas adecuado. Puede ser por
ejemplo, el procedimiento MouseDown del control origen, ya que cualquier operación
de D & D comienza haciendo click en el control origen. Si tiene la propiedad DragMode
de ese control en Manual, en el momento de hacer Click, ese control toma el foco y,
caso de un TextBox, puede arrastrar con el ratón para cambiar el texto, cosa que no
podría hacer si pone DragMode=1.
Evento DragOver
Cuando una operación de arrastrar y soltar está en progreso y el cursor del ratón pasa
por encima de un control o un formulario, se produce el evento DragOver de ese
control o formulario.
Donde :
origen = Control que se está arrastrando. O dicho de forma mas ortodoxa, control en
el que se inició la operación de Drag & Drop. Dentro de este procedimiento puede
hacer referencia a sus propiedades y métodos con este argumento. Por ejemplo,
Source.Visible = False. Caso de que el Control Origen fuese parte de un array de
controles, el Index de ese control se tiene en índice
x, y Número que especifica la posición horizontal (x) y vertical (y) actual del
puntero del mouse dentro del control o formulario destino. Estas coordenadas se
expresan siempre en términos del sistema de coordenadas del destino tal y como se
establece en las propiedades ScaleHeight, ScaleWidth, ScaleLeft y ScaleTop.
estado Entero que nos indica el estado de transición del control que se está
arrastrando en relación al formulario o control destino:
En General - Declaraciones
Dim pepe as string
Dim icono1 As Picture, Icono2 As Picture, Icono3 As Picture
Dim Icono4 As Picture, Icono5 As Picture, Icono6 As Picture
El Form1.Load se cargan los valores de estas variables con seis iconos existentes en el
disco. El icono asignado al control origen (Text1) es Icono4.
Set icono1 = LoadPicture("C:\vb\icons\dragdrop\drag1pg.ico")
Set Icono2 = LoadPicture("C:\vb\icons\dragdrop\drag2pg.ico")
Set Icono3 = LoadPicture("C:\vb\icons\dragdrop\drag3pg.ico")
Set Icono4 = LoadPicture("C:\vb\icons\dragdrop\drop1pg.ico")
Set Icono5 = LoadPicture("C:\vb\icons\dragdrop\dragfldr.ico")
Set Icono6 = LoadPicture("C:\vb\icons\dragdrop\dropfldr.ico")
Text1.DragIcon = Icono4
Evento DragDrop
Recuerde que la operación Drag & Drop no hace otra cosa que lo que se puede ver en
la interface gráfica. Debe poner en este Procedimiento (DragDrop) el código necesario
para que se realice la operación deseada.
Cuando veíamos las propiedades de los controles relacionadas con el Drag & Drop, veíamos otras
que hablaban de Drag y Drop, que eran OLEDragMode y OLEDropMode, y en el Formulario
veíamos solamente esta última: OLEDropMode. Entre los procedimientos observábamos algo
parecido: OLECompleteDrag, OLEDragDrop, OLEDragOver, OLEGiveFeedback, OLESetData
y OLEStartDrag. También existe el Método OLEDrag.
Mediante estas propiedades, procedimientos y método, podemos hacer que desde una aplicación
(Word por ejemplo) pase información a una aplicación hecha por nosotros, utilizando la misma
interfase gráfica para “ver” el movimiento de los datos. Lo mismo ocurre en sentido contrario.
Desde una aplicación nuestra podemos llevar texto o imágenes a Word. A ese mecanismo se le
denomina OLE Drag & Drop. Parece como si el OLE Drag & Drop reuniera las dos ventajas de
DDE y de Drag & Drop. Esa fue la idea con la que Microsoft creo esta herramienta.
Mediante el OLE Drag & Drop ya podemos enlazar nuestras aplicaciones a las aplicaciones
compradas. Pero piense que lo que va a conseguir con el OLE Drag & Drop ya lo tiene
prácticamente igual con el portapapeles. Por lo tanto, no se haga demasiadas ilusiones. Y además
recuerde que el mecanismo de arrastrar y soltar no es tan fácil como copiar y pegar, al menos
para personas poco hábiles.
El Objeto DataObjet
El objeto DataObjet es un contenedor que utiliza OLE para transportar datos. Recuerde, cuando
hacíamos Drag & Drop normal, en el Drag teníamos que meter lo que queríamos transportar (Texto
o imagen) en una variable y en el Drop poníamos el contenido de esa variable en el control final.
Esto puede hacerse cuando se trata de una misma aplicación, en la que el valor de la variable se
mantiene mientras estuviésemos dentro del ámbito donde se ha declarado. ¿Cómo haríamos esto
para pasar un texto a Word? Debe haber una “variable” que mantenga su contenido entre dos
aplicaciones. Esa “variable” debe ser un objeto superior a las dos aplicaciones que van a
intercambiar datos. Es concretamente el DataObjet
Método SetData
Inserta datos en un objeto DataObject con el formato de datos especificado.
Data es un objeto tipo DataObject donde se ha metido el texto que contienen el Text1.
Ese objeto llamado Data lo ha pasado el procedimiento (Data As DataObject) por lo
que podemos meterle los datos sin necesidad de crearlo previamente. Este objeto es
único para Windows, por lo que a partir de la ejecución de ese procedimiento
OLEStartDrag el texto introducido en Data está disponible para cualquier aplicación
Windows que sepa recogerlo.
Método GetData
Devuelve datos de un objeto DataObject en forma de Variant.
formato es un valor o constante, que determina el formato de los datos que se van a
obtener. Los valores para formato se pueden ver en el cuadro más abajo.
RTB1.SelText = Data.GetData(vbCFText)
End Sub
Método Clear
Elimina el contenido del objeto DataObject.
Sintaxis objeto.Clear
Puede ejecutar este método antes de introducir nuevos datos en el DataObject para asegurarse
que ha borrado los datos existentes
Este método sólo está disponible para los orígenes de operaciones de arrastre de
componentes. Si se invoca Clear desde un destino de la operación de colocación de
componentes, se producirá un error.
Método GetFormat
Devuelve un valor booleano que indica si un elemento del objeto DataObject
coincide con un formato especificado.
Propiedad Files
Devuelve una colección DataObjectFiles, que a su vez contiene una lista con todos
los nombres de archivo utilizados por un objeto DataObject (por ejemplo los nombres
de los archivos que un usuario arrastra hacia o desde el Explorador de archivos de
Windows).
Sintaxis NombredelObjetoDataObject.Files(índice)
Sintaxis NombredelObjetoDataObject.DataObjectFiles
Aunque se ha pretendido realizar un ejemplo de esta propiedad, el autor cede ese honor al alumno
interesado en el tema. No he podido obtener los elementos de la colección DataObjectFiles.
Propiedad OleDragMode
Esta propiedad establece la forma en la que comienza a realizarse la operación de Drag. Si está
en Automático basta con seleccionar el texto o la imagen a pasar a otra aplicación y una vez
seleccionado, al volver a marcarlo con el ratón, se inicia el Drag. En ese instante se ejecuta el
procedimiento OLEStartDrag donde deberemos colocar el código para que VB haga lo que
nosotros queramos. Ya se verá al estudiar este procedimiento.
A diferencia del Drag & Drop estudiado anteriormente, donde recomendábamos poner la propiedad
similar a manual, en este caso es mucho más práctico ponerlo en automático y además no es
molesto, ya que el Drag no se inicia si no se ha seleccionado previamente parte del texto o la
imagen a enviar a la otra aplicación.
La propiedad DragMode de ese control debe estar ahora a Manual, ya que si está en automático
se genera antes el Drag & Drop ordinario y no se producirá el OLE Drag & Drop.
Si se pone esta propiedad a Manual es necesario iniciar el drag mediante el método OLEDrag,
que ejecuta el procedimiento OLEStartDrag, y colocar en este el código correspondiente. No es
práctico, pero cada aplicación y cada programador es una caso distinto.
Propiedad OLEDropMode
Esta propiedad va a determinar la forma en la que el componente destino toma los datos
transportados medainte OLE Drag & Drop. Acepta tres valores:
Es normal poner esta propiedad a manual, para poder controlar lo que ocurre con la información
tanto en destino como en origen. Estando en Automático, la información en el origen se mueve al
destino, es decir, desaparece del origen al tiempo que se pone en el destino. Esto puede que no
sea lo deseado por el programador. Si pone esta propiedad en Manual, puede controlar lo que
hace la información tanto en destino como en origen.
Una cosa que podemos advertir en todos los eventos relacionados con el OLE Drag & Drop es la
ausencia del parámetro Source que teníamos en los eventos DragDrop y DragOver del Drag&Drop
convencional. Parece normal, ya que no tenemos porque saber el nombre del control origen si
éste es de una aplicación externa (Word por ejemplo). Ese parámetro Source lo empleábamos
para saber si un control podía recibir o no la información, dependiendo del origen de la misma. En
el OLE Drag & Drop solamente podemos basarnos para eso en el tipo de información que
transporta el DataObject, tipo que podemos determinar mediante el método GetFormat.
Evento OLEStartDrag
Se produce cuando se ejecuta el método OLEDrag de un componente o cuando un
componente inicia una operación OLE de arrastrar y colocar, y su propiedad
OLEDragMode está establecida a Automatic.
Sintaxis
Private Sub objeto_OLEStartDrag(datos As DataObject, efectosPermitidos As
Long)
Vemos que pasa como parámetro el objeto datos que es del tipo DataObject. Por lo
tanto podemos realizar sobre este objeto el método SetData visto anteriormente, para
introducir en él los datos deseados. Veamos un ejemplo:
Sintaxis
nombredelcontrol Nombre del control sobre el que pasa el puntero del ratón, en el
que se produce el evento OLEDragOver.
Evento OLEDragDrop
Se produce cuando se termina la operación de OLEDrag&Drop sobre el control. Para que se
pueda terminar la operación de OLEDrag&Drop el componente destino tienen que permitirlo.
Sintaxis
En este evento podemos escribir el código necesario para que el dato se coloque de la forma
deseada (por ejemplo, puede analizar el tipo de dato y proceder de acuerdo al contenido del
DataObject).
Los parámetros pasados por este evento son iguales al del evento anterior.
Evento OLEGiveFeedback
Este evento se produce en el control Origen. Se produce después de cada evento
OLEDragOver. OLEGiveFeedback permite al componente de origen proporcionar al
usuario una indicación visual, como cambiar el cursor del mouse para indicar lo que
ocurrirá si coloca el objeto o señalar visualmente la selección (en el componente de
origen) para indicar lo que va a ocurrir.
Sintaxis
En este capítulo hemos visto tres formas de transvasar información, bien de una
aplicación a otra, bien dentro de la misma aplicación.
Es posible que le haya llamado la atención estas herramientas. Y posiblemente
piense en un enorme número de posibilidades de aplicación. La realidad le va a
demostrar que se aplican muy pocas veces. Exceptuando el OLEDrag&Drop, que le
permite exportar texto a / desde Word, y eso le vienen muy bien al usuario porque
le ahorra tiempo de teclear, los demás no se usan con la profusión que se debería,
vistas a priori las ventajas que tienen.
La Barra de Menú puede tener tantas palabras como se desee, y sobre cada palabra,
puede desplegarse un Menú desplegable con mas palabras. Sobre cada una de estas
puede a su vez desplegarse otro conjunto de palabras, etc. con lo que se puede
conseguir una cantidad de palabras tan grande como necesitemos.
Para cada palabra se produce el evento click. Cada palabra de la Barra de Menú lleva
anexo un único procedimiento, que se ejecutará al hacer click sobre la palabra. Pero
en las palabras que sirven para desplegar un menú no tiene sentido que se ponga
ningún código en su procedimiento, ya que están ahí justamente para desplegar otras
palabras. Será en las palabras finales donde se colocará el código correspondiente.
En las figuras anteriores pueden verse tres formas distintas de ver el mismo Menú. En
la primera figura el Menú está sin desplegar. En la segunda figura puede verse un
árbol de Menú largo, desplegado en su totalidad. En la tercera puede verse el Menú
desplegable de la palabra Archivo de la Barra de Menú. Puede apreciarse en este
menú desplegable una línea que separa las palabras Guardar Como y SALIR. Esta
línea separadora es muy práctica para separar dos temas distintos dentro de un Menú
desplegable. Tan distintos como las operaciones de Abrir y Guardar respecto a la
última orden del menú desplegable que es SALIR de la aplicación.
Para crear un menú debe usarse el Editor de Menú, que se encuentra en la Barra de
Menú de VB en Herramientas | Editor de menús. Le aparecerá el siguiente cuadro.
(En principio vacío)
Existen otras propiedades aparte del Caption y Name que se introducen directamente
en las casillas al efecto.
nmuDocumentos.Visible = False
El nombre usado para nombrar a una de las palabras del menú puede ser cualquiera.
Sin embargo es prudente usar un nombre que nos pueda identificar, por una parte,
que ese nombre corresponde a una de las palabras del menú, y por otra, a que
palabra se refiere. La solución puede ser cualquiera. El autor de estos apuntes
propone poner las letras mnu (o menu - recomiendo no usar acentos e los Names de
VB), seguido del Caption de esa palabra.
Otras propiedades
El menú editado con los datos de la figura anterior tendrá esta forma en tiempo de
ejecución :
Para tabular las palabras, hay que hacer click en el botón en forma de flecha a la
derecha que está sobre la ventana de edición:
Situandonos sobre una de las líneas ya editadas, y haciendo click sobre el botón con
flecha hacia la izquierda, quitamos la tabulación.
Los botones con flecha hacia arriba o abajo nos permiten variar el orden de las líneas
ya editadas.
Quedan un par de cosas. Una de ellas es el carácter & que está delante de los Caption
de Archivo y Edición. Este carácter nos permite acceder al procedimiento click de esa
palabra pulsando la tecla Alt + la tecla correspondiente a la letra que está detrás del
carácter &. Justamente la letra que está subrayada en la palabra del menú.
Otra cosa. Puede verse en el menú desplegado de la figura anterior una línea entre
Guardar Como y SALIR. Esta línea, que solamente tiene efectos estéticos, se logra
introduciendo como Caption un guión ( - ). El editor de menús solamente le permite
el guión en una palabra de menú desplegable (Tabulada). No se olvide de poner el
Name incluso para este guión.
POPUP MENÚS
Por ejemplo, en el menú que hemos editado como ejemplo anteriormente, existía una
palabra Edición, de la que se desplegaba el Submenú Copiar, Cortar y Pegar. Si
analizamos la edición realizada, las palabras tenían el siguiente Caption y Name :
Edición mnuEdicion NO
Copiar mnuCopiar SI
Cortar mnuCortar SI
Pegar mnuPegar SI
Recuerde que las palabras del menú que estaban tabuladas son las que aparecían en el menú
desplegable. Esas mismas serán las que aparezcan en el PopUpMenu.
Para ello utilizaremos el Método PopupMenu. Este método pesenta un menú emergente en un
objeto MDIForm o Form en la posición actual del mouse o en las coordenadas especificadas.
Nombremenú. Este parámetro es requerido. Es el Name de la palabra del menú de donde cuelga
el menú desplegable. La palabra del menú a que se refiere Nombremenú debe tener al menos un
submenú.
Para combinar la los valores de indics de posición y comportamiento basta con sumar los valores.
Nota El parámetro indics no tiene efecto en las aplicaciones que se ejecuten bajo Microsoft
Windows versión 3.0 o anteriores.
negrita. Parámetro opcional que especifica el nombre de un control menú del menú emergente
para presentar su título en negrita. Si se omite, ningún control del menú aparece en negrita.
Nota. Este argumento funciona solamente en las aplicaciones que se ejecuten bajo Windows 95.
La aplicación ignora este argumento cuando se ejecute bajo versiones de 16 bits de Windows o
Windows NT 3.51 y anteriores.
La forma mas habitual de presentar un menú emergente es mediante el botón derecho del ratón.
Concretamente en el editor Word que estoy utilizando para escribir estos apuntes ocurre cuando
se levanta el botón derecho del ratón. Es decir, en el evento MouseUp, con la condición de que
Button=2. Imaginemos que queremos presentar en un menú emergente las palabras Cortar,
Copiar y Pegar del ejemplo anterior, que colgaban en el menú de la palabra Edición. (Vea mas
atrás). Queremos también que la palabra Copiar salga resaltada en negrita. Iríamos al
procedimiento MouseUp del Formulario y escribiríamos :
Observe que se ha omitido el nombre del Formulario (Opcional), el parámetro indics, y las
coordenadas x e y (el menú emergente aparecerá donde esté situado el cursor del ratón). Observe
también que las comas separadoras de los parámetros hay que colocarlas.
Cuando se presenta un menú emergente, el código que sigue a la llamada al método PopupMenu
no se ejecuta hasta que el usuario elige un comando del menú (en cuyo caso se ejecuta antes el
código del procedimiento de evento Click) o cancela el menú. Además, sólo puede presentarse un
menú emergente al mismo tiempo; por lo tanto, las llamadas a este método se ignoran si el menú
emergente está presentado actualmente o si un menú desplegable está abierto.
Si queremos presentar un menú emergente es necesario tener ese menú en el menú del
formulario. El problema puede ser que no queramos que esté en la barra de menú. No es
problema. Ponga la propiedad Visible del elemento del menú desde el que se va a desplegar el
submenú a False. No se verá ya en la barra de menú ni esa palabra ni el submenú que de ella se
despliega. Eso sí, las palabras del submenú deben tener la propiedad Visible = True. Si les pone
esa propiedad a False, no se verán en el menú emergente. Puede aprovechar esta circunstancia
para hacer menús emergentes con mas o menos elementos, según las necesidades de su
aplicación. También puede poner la propiedad Enabled a False si así lo precisa. No puede activar
la propiedad WindowList en un elemento que forma parte de un menú emergente.
Ejercicio propuesto: un editor de texto, con un menú que diga Copiar | Cortar | Pegar
donde pueda utilizar el portapapeles. Ahora es posible que le cueste un poco de