Está en la página 1de 36

Visual Basic - Guía del Estudiante Cap.

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 PORTAPAPELES. EL OBJETO CLIPBOARD

El objeto Clipboard Proporciona acceso al Portapapeles del sistema.

El portapapeles es una herramienta de windows que permite transportar texto o


imágenes de una parte a otra dentro de la misma aplicación, o entre dos
aplicaciones distintas. ¿Quién no ha cortado y pegado en Windows? Pues al hacerlo
está introduciendo texto en el portapaleles y copiándolo en otra parte.

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.

Sintaxis Clipboard.SetText datos, formato

datos Requerido. Cadena de datos que se va a colocar en el Portapapeles.

formato Opcional. Una constante o valor que especifica uno de los


formatos del Portapapeles reconocidos por Visual Basic, como se describe a
continuación :

Los valores de formato son:

Constante Valor Descripción

vbCFLink &HBF00 Información de conversación DDE


vbCFRTF &HBF01 Formato de texto enriquecido
vbCFText 1 (Predeterminado) Texto

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 1
Estas constantes se enumeran en la biblioteca de objetos de Visual Basic (VB)
del Examinador de objetos.

SetData

Pone una imagen en el objeto Clipboard usando el formato gráfico especificado.


No acepta argumentos con nombre.

Sintaxis Clipboard.SetData datos, formato

datos Requerido. El gráfico que se va colocar en el objeto Clipboard.

formato Opcional. Una constante o valor que especifica uno de los


formatos del
objeto Clipboard reconocidos por Visual Basic, como se describe
mas adelante. Si formato se omite, SetData determina el formato
gráfico automáticamente.

Los valores de formato son:

Constante Valor Descripción

vbCFBitmap 2 Mapa de bits (archivos .BMP)


vbCFMetafile 3 Metarchivo (archivos .WMF)
vbCFDIB 8 Mapa de bits independiente del dispositivo (DIB)
vbCFPalette 9 Paleta de colores

Estas constantes se enumeran en la biblioteca de objetos de Visual Basic (VB)


del Examinador de objetos.
El gráfico que se va colocar en el objeto Clipboard se define mediante la
función LoadPicture o la propiedad Picture de los objetos Form, Image o
PictureBox.

GetData
Devuelve un gráfico del objeto Clipboard. No acepta argumentos con nombre.

Sintaxis Clipboard.GetData (formato)

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.

Los valores de formato son:

Constante Valor Descripción

vbCFBitmap 2 Mapa de bits (archivos .BMP)


vbCFMetafile 3 Metarchivo (archivos .WMF)
vbCFDIB 8 Mapa de bits independiente del dispositivo (DIB)
vbCFPalette 9 Paleta de colores

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 2
Si en el objeto Clipboard no hay ningún gráfico que coincida con el formato
esperado, no se devuelve nada. Si en el objeto Clipboard sólo hay una paleta
de colores, se crea un DIB de tamaño mínimo (1 x 1).

GetText

Devuelve una cadena de texto del objeto Clipboard. No acepta argumentos con
nombre.

Sintaxis Clipboard.GetText (formato)

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.

Los valores de formato son:

Constante Valor Descripción

vbCFLink &HBF00 Información de conversación DDE


vbCFText 1 (Predeterminado) Texto

Si en el objeto Clipboard no hay ninguna cadena de texto que coincida con el


formato esperado, se devuelve una cadena vacía ("").

Paste

Copia datos desde el Portapapeles del sistema en un control contenedor OLE.

Sintaxis objeto.Paste

Objeto es el nombre del Panel Contenedor OLE donde se quiere depositar el


contenido del Portapapeles.

Comentario

Para usar este método, defina la propiedad OLETypeAllowed y después


verifique el valor de la propiedad PasteOK. No se puede pegar con éxito a
menos que PasteOK devuelva True.
Si se ha ejecutado el método Paste, la propiedad OLEType es vbOLELinked (0) o
vbOLEEmbedded (1). Si no se ha ejecutado el método Paste, la propiedad
OLEType es vbOLENone (3).
Este método puede usarse para implementar un comando Edición Pegar en un
menú.
Si el valor de la propiedad PasteOK es True y Visual Basic no puede pegar el
objeto, el control contenedor OLE elimina cualquier objeto existente en el
control.

PasteOK

Devuelve un valor booleano que determina si el contenido del Portapapeles del


sistema se puede pegar en el control contenedor OLE.

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 3
Sintaxis VariableBooleana = objeto.PasteOK

Objeto es el nombre del contenedor OLE donde se quiere pegar el contenido


del portapapeles.

Cuando el valor de esta propiedad es True, el contenido del Portapapeles del


sistema se puede pegar en el control contenedor OLE.
La propiedad OLETypeAllowed se usa para especificar el tipo del objeto
(vinculado o incrustado) que se quiere pegar en el control contenedor OLE. Una
vez que un objeto se ha pegado en el control contenedor OLE, se puede
verificar el valor de la propiedad OLEType para determinar el tipo de objeto que
ha sido creado.
Esta propiedad puede usarse si se quiere que la aplicación implemente un
comando Pegar en un menú Edición. Si PasteOK es False, el comando del menú
se deshabilita; si no, puede habilitarse. Los comandos de menú se habilitan y
se deshabilitan estableciendo su propiedad Enabled a True o False,
respectivamente.

Los objetos se pegan en el control contenedor OLE con el método Paste.


Para ofrecer mayor flexibilidad al usuario, presente un cuadro de diálogo
Pegado especial cuando el usuario elija el comando Edición Pegar
. (Establezca OLETypeAllowed = 2 y después use el método PasteSpecialDlg).
Cuando se presenta este cuadro de diálogo, el objeto del Portapapeles del
sistema se pega basándose en las selecciones del usuario en el cuadro de
diálogo.

GetFormat

Devuelve un entero que indica si un elemento del objeto Clipboard coincide con
un formato especificado. No acepta argumentos con nombre.

Sintaxis VariableLong = Clipboard.GetFormat (formato)

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.

Los valores de formato son:

Constante Valor Descripción

vbCFLink HBF00 Información de conversación DDE


vbCFText 1 Texto
vbCFBitmap 2 Mapa de bits (archivos .BMP)
vbCFMetafile 3 Metarchivo (archivos .WMF)
vbCFDIB 8 Mapa de bits independiente del dispositivo (DIB)
vbCFPalette 9 Paleta de colores

El método GetFormat devuelve True si algún elemento del objeto Clipboard


coincide con el formato especificado. Si no, devuelve False.
Para los formatos vbCFDIB y vbCFBitmap, la paleta de colores que se encuentre
en el Clipboard se usa para presentar el gráfico.

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 4
Clear

Borra el contenido del Portapapeles del sistema.

Sintaxis Clipboard.Clear

Con Clear se borra todo el contenido del portapapeles, texto y gráficos.

Copy
Copia el objeto de un control contenedor OLE al Portapapeles del sistema.

Sintaxis objeto.Copy

Objeto es el nombre del contenedor OLE cuyo contenido queremos copiar

Cuando se copia un objeto en el Portapapeles del sistema, todos los datos y la


información de vinculación asociados con el objeto se copian en el Portapapeles del
sistema. En el Portapapeles del sistema se pueden copiar objetos vinculados y
objetos incrustados.
Este método puede usarse para implementar un comando Edición | Copiar en un
menú.

EJERCICIO

Se propone el siguiente ejercicio, donde pueden verse todas las posibilidades del
Portapapeles.

Cree un formulario de la siguiente forma :

El gráfico que tiene el Picture de la izquierda puede ser cualquiera.

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 5
El código de este formulario es el siguiente:

Option Explicit

Private Sub Check1_Click()


End Sub

Private Sub Command1_Click()


Clipboard.SetData Picture1.Image
End Sub

Private Sub Command2_Click()


Dim ClpFmt As Integer
Dim Msg As String
On Error Resume Next ' Configura el controlador de errores.
If Clipboard.GetFormat(vbCFText) Then ClpFmt = ClpFmt + 1
If Clipboard.GetFormat(vbCFBitmap) Then ClpFmt = ClpFmt + 2
If Clipboard.GetFormat(vbCFDIB) Then ClpFmt = ClpFmt + 4
If Clipboard.GetFormat(vbCFMetafile) Then ClpFmt = ClpFmt + 8
Select Case ClpFmt
Case 1
Msg = "El Portapapeles sólo contiene texto."
Case 2
Msg = " El Portapapeles sólo contiene un archivo de mapa de bits."
Case 3
Msg = " El Portapapeles contiene texto y un archivo de mapa de bits."
Case 5
Msg = " El Portapapeles contiene texto y un archivo DIB."
Case 8
Msg = " El Portapapeles contiene solamente un archivo MetaFile."
Case 9
Msg = " El Portapapeles contiene texto y un archivo MetaFile."
Case Else
Msg = "No hay nada en el Portapapeles."
End Select
Label1.Caption = Msg ' Muestra el mensaje.
End Sub

Private Sub Command3_Click()


Clipboard.Clear
End Sub

Private Sub Command4_Click()


Clipboard.SetText Label2.Caption
End Sub

Private Sub Command5_Click()


Label3.Caption = Clipboard.GetText
End Sub

Private Sub Command6_Click()


Picture2.Picture = Clipboard.GetData()
End Sub

Private Sub Command7_Click()

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 6
Picture2.Picture = LoadPicture
End Sub

Private Sub Command8_Click()


Text1.Text = Trim(Text1.Text)
If UCase(Right(Text1.Text, 3)) = "BMP" Then
Check1.Value = 1
Else
Check1.Value = 0
End If
If Check1.Value = 1 Then
Clipboard.SetData LoadPicture(Text1.Text), 8
Else
Clipboard.SetData LoadPicture(Text1.Text)
End If
End Sub

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 7
LSB Visual Basic - Guia del Estudiante Capitulo 5
Página 8
INTERCAMBO DINAMICO DE DATOS (Dinamic Data Exchange) DDE

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.

A la aplicación que envía la información se le llama aplicación servidor, y a la que la


recibe, aplicación cliente.

La aplicación servidor debe estar funcionando antes de que la aplicación cliente le


pida la información. Si no es así, se generará un error.

Los datos a traspasar de una aplicación a otra pueden ser:

• Textos, de un Label o un TextBox.


• Imágenes, de un PictureBox.

El origen de un intercambio DDE siempre es un formulario. Dentro de este


formulario origen estará el Label, TextBox o PictureBox que contiene la información a
enviar.

Para indicar que un formulario es origen de información para un intercambio DDE


debemos decírselo en sus propiedades LinkMode y LinkTopic.

El destino de un texto ha de ser necesariamente un Label, un TextBox, y el destino


de un gráfico debe ser un PictureBox.

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

Tiene distinta forma si se trata de un control (Label, TextBox y PictureBox) ó un


formulario.

Para un formulario tiene dos valores posibles :

0 = None No puede existir comunicación DDE con ese formulario


1= Source El formulario permite que exista una comunicación DLL entre uno
de
sus controles y otra aplicación.

Si se establece el valor de esta propiedad a 0 en tiempo de diseño, no podrá


cambiarse en tiempo de ejecución. Si se establece a 1 en tiempo de diseño, se podrá
cambiar a 0 y volver a ponerla a 1 en tiempo de ejecución.

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 9
Para un control, la propiedad LinkMode le permite que inicie una conversación DDE
con una aplicación servidor, (origen), y cómo iniciarla. Tiene 4 valores posibles :

0=None. No existe comunicación DDE con ese control

1=Automático Los datos se traspasarán desde la aplicación servidor a


este control de
la aplicación cliente cada vez que cambie el dato en la aplicación
servidor (origen)

2=Manual Los datos se traspasarán cuando lo pida la aplicación cliente


(destino),
mediante la orden LinkRequest.

3=Notify Cuando existe un cambio en los datos de la aplicación origen,


ésta
notifica a la aplicación destino que el dato ha cambiado, pero no
le envía el dato nuevo. En el control de la aplicación destino
donde debe llevarse la información, se genera el evento
LinkNotify, en cuyo procedimiento podremos escribir el código
necesario dependiendo de nuestra aplicación. Para traer la
información, debe ejecutarse la orden LinkRequest. (Véase mas
adelante)

En tiempo de ejecución, para un control, esta propiedad es de lectura y escritura, es


decir, se puede usar para saber que valor tiene esta propiedad en un determinado
control, o para forzar esa propiedad a un determinado valor.

La sintaxis de esta propiedad es :

objeto.LinkMode [= número]

donde número es un entero que especifica el tipo de conexión. (0, 1, 2 ó 3 según se


ha visto)
y objeto es el nombre del control.

Propiedad LinkTopic

Esta propiedad es de lectura y escritura, tanto para los controles como para los
formularios.

Cuando un control destino quiere establecer una comunicación DDE “llama” a la


aplicación origen, y dentro de ella, al formulario que contiene el control cuya
información debe ser traspasada. (Nótese que la aplicación origen puede tener varios
formularios). Al ese formulario podría llamarle por su nombre, (por su Name), pero no
lo hace así. Le llama por un nombre que le debemos poner al formulario en su
propiedad LinkTopic. A este nombre se le denomina Tema.

La propiedad LinkTopic, para un formulario de origen, devuelve o establece el tema


al que el formulario “responde” en una conversación DDE.

Sintaxis NombredelFormulario.LinkTopic [= tema]

Para un control destino, La propiedad LinkTopic contiene el nombre de la aplicación y


el tema, ambos separados mediante el carácter | (carácter 124)

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 10
Sintaxis NombredelControl.LinkTopic [= aplicacionorigen|tema]

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).

El tema será el mismo al que “responde” el formulario donde se encuentra el control


que contiene la información a traspasar.

(DDE es una utilidad de Windows. Windows establece que el estándar de un vinculo


DDE es Aplicación | Tema | elemento. Véase para mas detalles el manual de
Windows, enlaces DDE)

Propiedad LinkItem

La propiedad LinkItem solamente la tiene el control destino de la información. No la


tiene el formulario origen. En esta propiedad deberá expresarse el nombre del
control origen de la información.

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.

Sintaxis objeto.LinkItem = cadena

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

Devuelve o establece la cantidad de tiempo que un control espera una respuesta a un


mensaje DDE.

Sintaxis objeto.LinkTimeout = número

donde número es una expresión numérica que especifica el tiempo de espera en


décimas de segundo.
El tiempo de respuesta DDE desde aplicaciones origen varía. Use esta propiedad para
ajustar el tiempo que un control destino espera la respuesta de una aplicación origen.
Si se usa LinkTimeout de forma correcta se puede evitar la generación de un error
por Visual Basic si una aplicación origen tarda mucho en responder.

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

Ocurre cuando el origen ha cambiado el dato definido por el vínculo DDE si la


propiedad LinkMode del control destino está establecido a 3 (Notificar).

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 11
Private Sub objeto_LinkNotify([índice As Integer])

End Sub

En este procedimiento se puede escribir el código necesario para nuestra aplicación, a


sabiendas de que este evento se produce cuando cambia la información en origen.
Posiblemente no quiera depositarlo de inmediato en el control destino, puesto que si
fuese así habría puesto la propiedad LinkMode a 1. Cuando quiera colocar el dato en
el control destino, puede utilizar el método LinkRequest para obtener el nuevo dato de
la fuente.

Método LinkRequest

Pide a la aplicación origen de una conversación DDE que actualice el contenido de un


control Label, PictureBox o TextBox.

Sintaxis objeto.LinkRequest

Siendo objeto el nombre del control destino de la aplicación.

Objeto es el nombre de un control Label, PictureBox o TextBox involucrado en una


conversación DDE como destino. LinkRequest provoca que la aplicación origen envíe
los datos actuales al objeto, actualizando la propiedad Caption si objeto es un control
Label, la propiedad Picture si objeto es un control PictureBox o la propiedad Text si
objeto es un control TextBox.
Si la propiedad LinkMode del objeto está definida como 1 (Automático), la aplicación
origen actualiza objeto automáticamente y LinkRequest no es necesario. Si la
propiedad LinkMode del objeto está definida como 2 (Manual) , la aplicación origen
actualiza objeto sólo cuando se usa LinkRequest.
Si la propiedad LinkMode del objeto está definida como 3 (Notify), el origen notifica al
destino que los datos han cambiado invocando el método LinkNotify. El destino debe
entonces usar el método LinkRequest para actualizar los datos.

Método LinkSend

Transfiere el contenido de un control PictureBox a la aplicación destino de una


conversación DDE.

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

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 12
explícitamente a las aplicaciones destino DDE cuándo cambia el contenido de un
control PictureBox.

Método LinkPoke

Transfiere el contenido de un control Label, PictureBox o TextBox a la aplicación origen


de una conversación DDE.

Sintaxis objeto.LinkPoke

Objeto es el nombre del control Label, PictureBox o TextBox involucrado en la


conversación DDE como destino. Si objeto es un control Label, LinkPoke transfiere el
contenido de la propiedad Caption al origen. Si objeto es un control PictureBox,
LinkPoke transfiere el contenido de la propiedad Picture al origen. Si objeto es un
control TextBox, LinkPoke transfiere el contenido de la propiedad Text al origen.
Normalmente, en una conversación DDE la información fluye de origen a destino. Sin
embargo, LinkPoke permite que un objeto destino suministre datos al origen. No todas
las aplicaciones origen aceptan información de esta forma; si la aplicación origen no
acepta los datos, se produce un error.

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 13
LSB Visual Basic - Guia del Estudiante Capitulo 5
Página 14
EL DRAG & DROP (Arrastrar y Soltar)

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

Es una propiedad de lectura y escritura. Devuelve o establece un valor que determina


si se usa el modo de arrastre manual o automático en una operación de arrastrar y
soltar.

Sintaxis NombreControlOrigen.DragMode = número

Donde número puede tomar los valores 0 (Manual) ó 1 (Automático).


El valor predeterminado es el 0.

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.

El poner esta propiedad en automático conlleva también el hecho de que el control no


toma el foco haciendo click sobre él, ya que no sabe si lo que quiere hacer es llevarle
el foco o iniciar una operación de Drag & Drop.

Propiedad DragIcon

Devuelve o establece el icono que se presenta como puntero del ratón durante una
operación de arrastrar y soltar.

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 15
Sintaxis NombreControlOrigen.DragIcon = icono

Donde Icono es cualquier referencia a un icono válido.

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.

El valor de esta propiedad puede establecerse en tiempo de diseño, eligiendo el icono


en el cuadro de Propiedades del control origen, o en tiempo de ejecución. En este
caso, la referencia a un icono válido puede darse igualando el valor de esta propiedad
a un icono ya existente en la aplicación (NCO.DragIcon = Form1.Icon pondría como
icono el del formulario Form1, NCO.DragIcon = Text1.DragIcon pondría el mismo
icono de Text1 para esta propiedad), o cargándolo mediante la función LoadPicture :

(NCO.DragIcon = LoadPicture (C :\Iconos\Icono1.ICO)

El archivo que se cargue debe tener la extensión .ICO y formato de icono.

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

Esto le ocupará mas memoria. Es el precio a pagar por la rapidez y la buena


presentación de una aplicación.

Método Drag
Inicia, termina o cancela una operación de arrastre de cualquier objeto excepto los
controles Line, Menu, Shape o Timer.

Sintaxis NombreControlOrigen.Drag TipoAcción

NombreControlOrigen es el nombre del control donde se inició la operación Drag &


Drop.

TipoAcción es un valor o una constante que especifica la acción a realizar, según se


describe a continuación :

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 16
Constante Valor Descripción

vbCancel 0 Cancela la operación de arrastre.


vbBeginDrag 1 Inicia el arrastre del objeto.
vbEndDrag 2 Termina el arrastre y suelta el objeto.

Si se omite TipoAcción, la acción predeterminada es iniciar el arrastre del objeto.

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).

En versiones anteriores de Visual Basic, Drag era un método asíncrono y las


instrucciones siguientes se ejecutaban incluso aunque la acción de arrastre no hubiera
terminado. En Visual Basic versión 4.0, Drag es un método síncrono y las instrucciones
siguientes no se ejecutan hasta que la acción de arrastre no haya terminado.

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 :

Cuando tenemos la propiedad DragMode de un TextBox a 1 (automático) ese TextBox


no podrá coger el foco, (al menos de forma fácil) y si lo consigue no puede seleccionar
el texto que tiene actualmente, ya que VB no puede saber si lo que está ocurriendo es
que queremos seleccionar el texto o si deseamos iniciar la operación D & D.

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.

Dependiendo si se trata de un Formulario convencional, un Formulario MDI o un


control, el procedimiento DragOver captura distintos parámetros :

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 17
Private Sub Form_DragOver(origen As Control, x As Single, y As Single, estado As
Integer)
Private Sub MDIForm_DragOver(origen As Control, x As Single, y As Single, estado As
Integer)
Private Sub Control_DragOver([índice As Integer,]origen As Control, x As Single, y As
Single, estado As Integer)

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:

0 = Entra. Este valor se produce en el instante en el que entra el cursor del


ratón a
este control o Formulario. Se genera también en el control origen en el instante
que se
pulsa el botón del ratón, iniciándose de esta forma el D & D.
1 = Deja Este valor se produce cuando el cursor sale del control o
Formulario.
2 = Sobre Este valor se produce cuando el cursor se está moviendo sobre el
control o
el Formulario destino.

Mediante el parámetro origen (completado con índice si el origen se trata de un


array) podemos conocer el control desde el que se inició la operación de Drag & Drop.
Debemos tener siempre presente que el procedimiento DragOver se realiza cada vez
que pasamos por encima de un control o formulario durante una operación de Drag &
Drop, independientemente que ese control o formulario sea o no sea origen ni destino
de esa operación. Puede emplearse el procedimiento DragOver para comprobar si
ese valor que transportamos puede depositarse sobre el control o formulario por el
que estamos pasando, si el valor que llevamos está dentro de los márgenes que
admite la aplicación, etc. Es muy llamativo por ejemplo, cambiar el color del control
que va a recibir el valor traspasado si este valor se sale de los márgenes aceptables.
O cambiar la propiedad DragIcon del control origen cuando ese dato no se puede
depositar en ese control. Es típico poner la señal de trafico de Prohibido cuando el
dato transportado no se puede soltar sobre el control sobre el que estamos pasando el
cursor del ratón. (Como el control origen se pasa como parámetro al procedimiento
DragOver con el nombre Origen basta con poner Origen.Dragicon = ..... ) Recuerde
en este caso que al abandonar ese control debe restaurar el icono original. Para ello es
útil cargar varias variables con los distintos iconos que se van a usar y luego igualar la
propiedad DragIcon del control origen a una u otra variable, dependiendo de los
valores u otros factores de la aplicación.

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 18
En el siguiente ejemplo, se declaran 6 variables tipo Picture que van a almacenar seis
iconos distintos :

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

En el control destino se cambia el icono si el valor de la variable transportada (pepe)


es mayor de 999 :
En el procedimiento DragOver
If Val(pepe) > 999 Then Source.DragIcon = icono1
‘Al salir de Text1 se recupera el icono original
If State = 1 Then Source.DragIcon = Icono4

Evento DragDrop

Ocurre cuando se completa una operación de arrastrar y soltar como resultado de


arrastrar un control sobre un formulario o control y liberar el botón del mouse o utilizar
el método Drag con su argumento acción establecido a 2 (Drop).

Dependiendo de si soltamos sobre un Formulario convencional, Formulario MDI o


Control, este evento captura los siguientes parámetros :

Private Sub Form_DragDrop(origen As Control, x As Single, y As Single)


Private Sub MDIForm_DragDrop(origen As Control, x As Single, y As Single)
Private Sub Control_DragDrop([índice As Integer,]origen As Control, x As Single, y As
Single)

Estos parámetros son idénticos a los del Procedimiento DragOver ya comentados

Utilice un procedimiento de evento DragDrop para controlar qué ocurre tras


completarse una operación de arrastrar. Por ejemplo, puede mover el contenido del
control origen a un nuevo lugar o copiar un archivo de un lugar a otro, depositar un
valor sobre un control etc.

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.

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 19
LSB Visual Basic - Guia del Estudiante Capitulo 5
Página 20
EL OLE Drag & Drop
El Drag & Drop visto hasta ahora permite llevar datos desde un control a otro siempre dentro de la
misma aplicación, incluyendo una interface gráfica muy didáctica para presentar ese movimiento
de información. El DDE permite llevar información desde una aplicacióna otra, pero de forma
rígida, es decir, desde un control a otro control, sin intervención del usuario, o al menos, sin una
intervención realizada de forma gráfica con el ratón.

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

El objeto DataObject es un contenedor de datos donde se pueden transportar datos


desde un componente de origen a un componente de destino.

El DataObject tiene sus propiedades y métodos.

Métodos del DataObject

Método SetData
Inserta datos en un objeto DataObject con el formato de datos especificado.

Sintaxis objeto.SetData [datos], [formato]

objeto es un objeto tipo DataObjet. Este objeto no es necesario declararlo, ya que


aparece en todos los procedimientos donde es posible introducir o sacar datos del
DataObject.

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 21
Por ejemplo, en el método OLEStartDrag se pasa como parámetro un objeto DataObject llamado
Data.

Private Sub Text1_OLEStartDrag(Data As DataObject, AllowedEffects As Long)


Data.SetData Text1.Text, vbCFText
End Sub

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.

datos es el dato a introducir en el DataObject. En el ejemplo anterior, era el texto


contenido en Text1

formato es un valor o constante que especifica el tipo de datos introducidos. Este


argumento es opcional. Vea valores posibles en el cuadro más abajo.

Método GetData
Devuelve datos de un objeto DataObject en forma de Variant.

Sintaxis objeto.GetData (formato)

objeto es el objeto tipo DataObject

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.

Un ejemplo de GetData. En el procedimiento OLEDragDrop de un RichTextBox con la


propiedad OLEDropMode existe este código para poner el texto que llevaba el
DataObject en el RichTextBox. Observe que también se pasa en este procedimiento,
un parámetro llamado Data del tipo DataObject.

Private Sub RTB1_OLEDragDrop(Data As RichTextLib.DataObject, Effect As Long,


Button As Integer, Shift As Integer, x As Single, y As Single)

RTB1.SelText = Data.GetData(vbCFText)
End Sub

Loa valores o constantes para formato en ambos métodos son:

Constante Valor Descripción


vbCFText 1 Texto (archivos .txt)
vbCFBitmap 2 Mapa de bits (Archivos .bmp)
vbCFMetafile 3 Metaarchivo (archivos .wmf)
vbCFEMetafile 14 Metarchivo mejorado (archivos .emf)
vbCFDIB 8 Mapa de bits independiente del dispositivo (DIB)
vbCFPalette 9 Paleta de colores
vbCFFiles 15 Lista de archivos

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 22
vbCFRTF -16639 Formato de texto enriquecido (archivos .rtf)

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

Private Sub Text1_OLEStartDrag(Data As DataObject, AllowedEffects As Long)


Data.Clear
Data.SetData Text1.Text
End Sub

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.

Sintaxis objeto.GetFormat formato

Ejemplo Puede asegurarse que el formato contenido en el DataObject es el


deseado antes de proceder a colocarlo en un control en la operación de Drop:

Private Sub RTB1_OLEDragDrop(Data As RichTextLib.DataObject, Effect As Long,


Button As Integer, Shift As Integer, x As Single, y As Single)
If Data.GetFormat(vbCFText) = True Then
RTB1.SelText = Data.GetData(vbCFText)
End If
End Sub

Propiedades del DataObject


Deberíamos decir mejor, propiedad, ya que solamente tiene una:

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)

La colección Files sólo se puebla con nombres de archivo cuando el objeto


DataObject contiene datos de tipo vbCFFiles. La colección Files puede rellenarse
para permitir a las aplicaciones de Visual Basic actuar como origen de operaciones de
arrastre de una lista de archivos.

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 23
Colección DataObjectFiles
Es la colección de cadenas con los nombres de ficheros de la propiedad Files del
objeto DataObject.

Sintaxis NombredelObjetoDataObject.DataObjectFiles

La colección DataObjectFiles es una colección de cadenas que representan un


conjunto de archivos seleccionados mediante el método GetData o en una aplicación,
como el Explorador de Windows.
Aunque la colección DataObjectFiles tiene sus propios métodos y propiedades, debe
usar la propiedad Files del objeto DataObject para ver y manipular el contenido de la
colección 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.

Volvamos sobre las propiedades y métodos de los controles involucrados en un


OLE Drag & Drop

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:

0 vbOLEDropNone El componente no acepta operaciones de Drop. Cuando


pasa el cursor del ratón sobre él durante una
operación de OLE Drag & Drop, muestra el icono de No
Colocar
1 vbOLEDropManual Manual. El componente de destino desencadena los
eventos OLE de colocar, (Evento OLEDragDrop) lo
que permite al programador controlar la operación
en el código.

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 24
2 vbOLEDropAutomatic Automático. El componente de destino acepta
automáticamente las operaciones OLE de colocar si el
objeto DataObject contiene datos en un formato
que reconoce. En este caso, en el destino no se
producen los eventos del mouse ni eventos OLE de
arrastrar y colocar.

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.

Eventos relacionados con el OLE Drag & Drop.

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:

Private Sub Text1_OLEStartDrag(Data As DataObject, AllowedEffects As Long)


Data.Clear
Data.SetData Text1.Text
AllowedEffects = 1
End Sub

El parámetro EfectosPermitidos va a determinar lo que ocurre con el dato en el control


origen. Acepta 3 valores:

0 vbDropEffectNone No se inicia el OLE Drag & Drop


1 vbDropEffectCopy Los datos se copian en el destino y no se modifican en el
control origen.
2 vbDropEffectMove Los datos se colocan en el destino y desaparecen del
control origen. Ocurre el efecto de mover los datos.

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 25
Evento OLEDragOver
Se produce cuando el puntero del ratón pasa por encima de un control durante una
operación de OLE Drag & Drop.

Sintaxis

Private Sub nombredelcontrol_OLEDragOver(datos As DataObject, efecto As


Long, botón As Integer, mayúsculas As Integer, x As Single, y As Single, estado
As Integer)

Este evento solamente ocurre cuando la propiedad OLEDropMode está en manual

nombredelcontrol Nombre del control sobre el que pasa el puntero del ratón, en el
que se produce el evento OLEDragOver.

datos Objeto tipo DataObject que transporta los datos


efecto Este parámetro es similar al AllowedEffects del evento
OLEStartDrag y tiene los mismos valores.
boton Indica el botón que se está pulsando: 1 = izdo. 2 = Dcho. 4 =
Central. Si está pulsado más de uno, será la suma de los
valores de cada uno.
mayusculas Indica el estado de pulsación de las teclas MAYUSCULAS, CTRL y
ALT
1 = MAY, 2 = CTRL, 4 = ALT. Si hay más de una tecla pulsada,
será la suma de los valores de cada una.
x, y Posición del puntero del ratón dentro del control destino,
medidas en las unidades de medida del formulario.
estado Valor que indica uno de los tres estados siguientes:

0 vbEnter El ratón está entrando al control


1 vbLeave El ratón está saliendo del control
2 vbOver El ratón está dentro del control

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.

Nota Este evento sólo se produce cuando OLEDropMode está establecido a 1


(Manual).

Sintaxis

Private Sub objeto_OLEDragDrop(datos As DataObject, efecto As Long, botón As


Integer, mayúsculas As Integer, x As Single, y As Single)

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.

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 26
Evento OLECompleteDrag
Se produce en el origen cuando se ha completado la operación de arrastre (cuando se levanta el
botón del ratón), e informa al componente de origen de que se ha completado o cancelado dicha
operación.

Sintaxis Private Sub objeto_OLECompleteDrag([efecto As Long])

Efecto es idéntico a los eventos anteriores.

En el ejemplo siguiente, el control origen (Text1) se pone rojo cuando se termina el


OLEDrag&Drop:

Private Sub Text1_OLECompleteDrag(Effect As Long)


Text1.BackColor = 255
End Sub

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

Private Sub objeto_OLEGiveFeedback(efecto As Long, cursoresPredeterminados


As Boolean)

efecto igual a los eventos anteriores.

CursoresPredeterminados Valor booleano que determina si Visual Basic utiliza el cursor


predeterminado del mouse que indica el componente o si utiliza un cursor definido por el usuario.
True (predeterminado) = utiliza el cursor predeterminado.
False = no utiliza el cursor predeterminado. Debe haber establecido un cursor de mouse con la
propiedad MousePointer del objeto Screen.

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.

Como siempre en programación, lo bueno es lo que acepta y le gusta al usuario. Y el


realizar un arrastre con el ratón es una operación que no todos terminan con éxito.
Quizás sea esa la razón de no usarlo tan profusamente.

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 27
LSB Visual Basic - Guia del Estudiante Capitulo 5
Página 28
LSB Visual Basic - Guia del Estudiante Capitulo 5
Página 29
EL EDITOR DE MENUS

El Menú o Barra de Menú es la segunda línea de cualquier ventana Windows, donde


pueden verse distintos nombres. La Barra de Menú es un componente de un
Formulario.

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)

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 30
Cada palabra del menú tiene su Caption (La palabra que aparece en el menú), su
Name (Nombre), y puede tener Index (si existen varias palabras con el mismo Name).
Para introducir estas propiedades basta con teclearlas directamente en cada una de
las casillas al efecto del cuadro del editor de menús. Para colocar el cursor de
escritura en una u otra casilla, puede hacerse bien con el cursor del ratón, bien con el
tabulador. Para pasar a la siguiente línea de edición (crear una nueva palabra), basta
con pulsar ENTER.

Existen otras propiedades aparte del Caption y Name que se introducen directamente
en las casillas al efecto.

HelpContextID Igual que esta propiedad en el resto de los controles, permite


introducir un número de contexto para la ayuda de Windows.

Enabled. Habilitado. Si se quita la marca de esa casilla, esa palabra aparecerá


por defecto deshabilitada. Esta propiedad puede leerse y cambiarse en tiempo de
ejecución, por lo que esta propiedad puede usarse para deshabilitar ciertas funciones
de la aplicación, dependiendo de la evolución de la propia aplicación. La presentación
en el menú cuando está deshabilitada es con color pálido.

Visible. Como su nombre indica, que sea visible o no lo sea. Puede


cambiarse en tiempo de ejecución.

WindowList Indica si esa palabra es la que va a mostrar todos los formularios


abiertos en una aplicación de documentos múltiples (MDI). Al hacer click sobre esta
palabra, se desplegará un submenú con todos los Caption de los Formularios hijo
abiertos en ese momento. Solamente puede existir una palabra en un menú con esta
propiedad activada. Esta propiedad no puede variarse en tiempo de ejecución.

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 31
Para cambiar una de estas propiedades en tiempo de ejecución, basta con citar por su
nombre a esa palabra (por su Name, no por su Caption), e igualar a True o False su
valor :

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

Shortcut Atajo. Esta propiedad admite varias combinaciones de teclas para


acceder al procedimiento click de esa palabra sin necesidad de usar el ratón. Las
combinaciones de teclas posibles se muestran haciendo click en la flecha hacia abajo
que tiene esa casilla. Se desplegará una lista con todas ellas. Para elegir una de estas
combinaciones, basta con hacer click sobre la línea que la contiene. Esta combinación
de teclas aparecerá en el menú, al lado de la palabra (Véase figura siguiente, SALIR
Ctrl + X)

NegotiatePosition. Establece un valor que determina si los controles Menu de nivel


superior se muestran en la barra de menús mientras un objeto vinculado o incrustado
de un formulario está activo y mostrando sus menús. No está disponible en tiempo de
ejecución. Puede tener los valores 0 (Predeterminado) Ninguno. El menú no se
muestra en la barra de menús cuando el objeto está activo.
1 Izquierda. El menú se muestra a la izquierda de la barra de menús cuando el objeto
está activo.
2 Medio. El menú se muestra en medio de la barra de menús cuando el objeto está
activo.
3 Derecha. El menú se muestra a la derecha de la barra de menús cuando el objeto
está activo.

El menú editado con los datos de la figura anterior tendrá esta forma en tiempo de
ejecución :

Observe que tiene cuatro palabras en la línea superior, y que “colgando” de la


primera aparece un menú desplegable. Para conseguir un menú desplegable fíjese en

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 32
la figura del Editor, en la parte de abajo donde están todos los Caption de las palabras
del menú. Observará que algunas de ellas (&Edicion, Documentos, Ayuda - Hay otra
que no se vé, &Archivo) están completamente a la izquierda de la ventana, y las
demás están separadas de la parte izquierda por unos guiones. Las palabras que
están completamente a la izquierda son las que figurarán en la barra de menú de
forma permanente. Las que están separadas (tabuladas) corresponden a las que
aparecerán en los menús desplegables. Como es lógico, un menú desplegable debe
colgar de una palabra de las de la barra de menú. La palabra de la que cuelga el
submenú es la palabra sin tabular inmediatamente anterior.

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.

Podemos hacer varios niveles de submenús a base de introducir varias tabulaciones.


Al comienzo de este capítulo puede ver un ejemplo de ello.

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ú.

El carácter & no tiene porqué ir precisamente al comienzo de la palabra. Puede ir en


el medio de la palabra. De esta forma se subrayará una letra intermedia.

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.

NOTA MUY IMPORTANTE

Siempre se recomienda poner la orden de SALIR en la primera palabra de la barra de


Menú. Bien que esa primera palabra sea Salir o que esté en el menú desplegable de la
primera palabra de la Barra de Menú, en este último caso, separada mediante una
línea separadora. (Vea The Windows Interface Guidelines for Software Design,
pág.124)

POPUP MENÚS

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 33
Un PopUpMenú o Menú Emergente es un menú que despliega en cualquier punto de
un Formulario (MDI o normal) con varias opciones. Es normal en los procesadores de
texto que se obtenga un menú emergente pulsando el botón derecho del ratón, donde
aparecen las tres palabras mágicas de Copiar, Cortar y Pegar.

Para crear un menú emergente o PopUpMenu es necesario tener en el menú de ese


formulario una palabra de la que se despliegue un submenú con las mismas palabras
que queremos que aparezcan en el PopUpMenu.

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 :

Caption Name Tabulada

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.

La sintaxis de este método es la siguiente :

NombreFormulario.PopupMenu nombremenú, indics, x, y, negrita

Donde NombreFormulario es el nombre del formulario donde presentamos el PopUpMenu.


Puede omitirse.

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ú.

Indics. Parámetro opcional. Un valor o constante que especifica la posición y el comportamiento


del menú emergente, como se describe a continuación :

Constante (posición) Valor Descripción

vbPopupMenuLeftAlign 0 (Predeterminado) El lado izquierdo del menú se


sitúa en x.
vbPopupMenuCenterAlign 4 El menú emergente se centra en x.
vbPopupMenuRightAlign 8 El lado derecho del menú se sitúa en x.

Constante (comportamiento) Valor Descripción

vbPopupMenuLeftButton 0 (Predeterminado) Los elementos del


menú emergente sólo reaccionan a los
clic del mouse cuando se use el botón
primario del mouse.

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 34
vbPopupMenuRightButton 2 Los elementos del menú emergente
reaccionan a los clic del mouse cuando se
usen los botones primario o secundario.

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.

X, y Parámetro(s) opcionales que especifican las coordenadas x e y donde va a aparecer el menú


emergente. Si no se especifican, aparecerá donde esté el puntero del mouse. Las unidades de
medida de las coordenadas x e y se definen mediante la propiedad ScaleMode.

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 :

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)


If Button = 2 Then
PopupMenu mnuEdicion, , , , mnuCopiar
End If
End Sub

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

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 35
trabajo. Pero este ejercicio lo va a repetir con casi todas las aplicaciones que realice
en su vida profesional.

LSB Visual Basic - Guia del Estudiante Capitulo 5


Página 36