capitulo 5 visual basic

43
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 : LSB Visual Basic - Guia del Estudiante Capitulo 5 Página 1

Upload: boyforbaby

Post on 06-Jun-2015

4.433 views

Category:

Documents


12 download

DESCRIPTION

Manual de Visual Basic

TRANSCRIPT

Page 1: Capitulo 5 Visual Basic

Visual Basic - Guía del Estudiante Cap. 5

PORTAPAPELESINTERCAMBO DINAMICO DE DATOSEL DRAG AND DROP (Drag & Drop) Arrastrar y SoltarEL OLEDRAGDROP Drag & Drop con otras aplicacionesMENÚ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 DDEvbCFRTF &HBF01 Formato de texto enriquecidovbCFText 1 (Predeterminado) Texto

LSB Visual Basic - Guia del Estudiante Capitulo 5 Página 1

Page 2: Capitulo 5 Visual Basic

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.

GetDataDevuelve 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

Page 3: Capitulo 5 Visual Basic

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)

formatoOpcional. 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 DDEvbCFText 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

Page 4: Capitulo 5 Visual Basic

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)

formatoRequerido. 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 DDEvbCFText 1 TextovbCFBitmap 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

Page 5: Capitulo 5 Visual Basic

Clear

Borra el contenido del Portapapeles del sistema.

Sintaxis Clipboard.Clear

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

CopyCopia 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

Page 6: Capitulo 5 Visual Basic

El código de este formulario es el siguiente:

Option Explicit

Private Sub Check1_Click()End Sub

Private Sub Command1_Click()Clipboard.SetData Picture1.ImageEnd Sub

Private Sub Command2_Click()Dim ClpFmt As IntegerDim Msg As StringOn 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 SelectLabel1.Caption = Msg ' Muestra el mensaje.End Sub

Private Sub Command3_Click()Clipboard.ClearEnd Sub

Private Sub Command4_Click()Clipboard.SetText Label2.CaptionEnd Sub

Private Sub Command5_Click()Label3.Caption = Clipboard.GetTextEnd 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

Page 7: Capitulo 5 Visual Basic

Picture2.Picture = LoadPictureEnd Sub

Private Sub Command8_Click()Text1.Text = Trim(Text1.Text)If UCase(Right(Text1.Text, 3)) = "BMP" ThenCheck1.Value = 1ElseCheck1.Value = 0End IfIf Check1.Value = 1 ThenClipboard.SetData LoadPicture(Text1.Text), 8ElseClipboard.SetData LoadPicture(Text1.Text)End IfEnd Sub

LSB Visual Basic - Guia del Estudiante Capitulo 5 Página 7

Page 8: Capitulo 5 Visual Basic

LSB Visual Basic - Guia del Estudiante Capitulo 5 Página 8

Page 9: Capitulo 5 Visual Basic

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 formulario1= 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

Page 10: Capitulo 5 Visual Basic

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ónservidor (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

Page 11: Capitulo 5 Visual Basic

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

Page 12: Capitulo 5 Visual Basic

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

Page 13: Capitulo 5 Visual Basic

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

Page 14: Capitulo 5 Visual Basic

LSB Visual Basic - Guia del Estudiante Capitulo 5 Página 14

Page 15: Capitulo 5 Visual Basic

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

Page 16: Capitulo 5 Visual Basic

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 = Variable1NCO.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

Page 17: Capitulo 5 Visual Basic

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

Page 18: Capitulo 5 Visual Basic

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

Page 19: Capitulo 5 Visual Basic

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

En General - DeclaracionesDim pepe as stringDim icono1 As Picture, Icono2 As Picture, Icono3 As PictureDim 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 originalIf 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

Page 20: Capitulo 5 Visual Basic

LSB Visual Basic - Guia del Estudiante Capitulo 5 Página 20

Page 21: Capitulo 5 Visual Basic

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

Page 22: Capitulo 5 Visual Basic

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, vbCFTextEnd 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ónvbCFText 1 Texto (archivos .txt)vbCFBitmap 2 Mapa de bits (Archivos .bmp)vbCFMetafile 3 Metaarchivo (archivos .wmf)vbCFEMetafile 14 Metarchivo mejorado (archivos .emf)

vbCFDIB 8Mapa de bits independiente del dispositivo (DIB)

LSB Visual Basic - Guia del Estudiante Capitulo 5 Página 22

Page 23: Capitulo 5 Visual Basic

vbCFPalette 9 Paleta de coloresvbCFFiles 15 Lista de archivosvbCFRTF -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.ClearData.SetData Text1.TextEnd 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 ThenRTB1.SelText = Data.GetData(vbCFText)End IfEnd 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)

LSB Visual Basic - Guia del Estudiante Capitulo 5 Página 23

Page 24: Capitulo 5 Visual Basic

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.

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

LSB Visual Basic - Guia del Estudiante Capitulo 5 Página 24

Page 25: Capitulo 5 Visual Basic

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

SintaxisPrivate 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.ClearData.SetData Text1.TextAllowedEffects = 1End 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 & Drop1 vbDropEffectCopy Los datos se copian en el destino y no se modifican en el

control origen.

LSB Visual Basic - Guia del Estudiante Capitulo 5 Página 25

Page 26: Capitulo 5 Visual Basic

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

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 datosefecto 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 control1 vbLeave El ratón está saliendo del control2 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).

LSB Visual Basic - Guia del Estudiante Capitulo 5 Página 26

Page 27: Capitulo 5 Visual Basic

Los parámetros pasados por este evento son iguales al del evento anterior.

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 = 255End 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.

LSB Visual Basic - Guia del Estudiante Capitulo 5 Página 27

Page 28: Capitulo 5 Visual Basic

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 28

Page 29: Capitulo 5 Visual Basic

LSB Visual Basic - Guia del Estudiante Capitulo 5 Página 29

Page 30: Capitulo 5 Visual Basic

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

Page 31: Capitulo 5 Visual Basic

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

Page 32: Capitulo 5 Visual Basic

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

Page 33: Capitulo 5 Visual Basic

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

Page 34: Capitulo 5 Visual Basic

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 NOCopiar mnuCopiar SICortar mnuCortar SIPegar 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ú sesitú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 delmenú 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

Page 35: Capitulo 5 Visual Basic

vbPopupMenuRightButton 2 Los elementos del menú emergentereaccionan 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 ThenPopupMenu mnuEdicion, , , , mnuCopiarEnd IfEnd 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.

LSB Visual Basic - Guia del Estudiante Capitulo 5 Página 35

Page 36: Capitulo 5 Visual Basic

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