You are on page 1of 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 vbCFLink vbCFRTF vbCFText Valor &HBF00 &HBF01 1 Descripción Información de conversación DDE Formato de texto enriquecido (Predeterminado) Texto

LSB Visual Basic Página 1

-

Guia del Estudiante

Capitulo 5

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 datos Clipboard.SetData datos, formato 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 vbCFBitmap vbCFMetafile vbCFDIB vbCFPalette Valor 2 3 8 9 Descripción Mapa de bits (archivos .BMP) Metarchivo (archivos .WMF) Mapa de bits independiente del dispositivo (DIB) 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 vbCFBitmap vbCFMetafile vbCFDIB vbCFPalette Valor 2 3 8 9 Descripción Mapa de bits (archivos .BMP) Metarchivo (archivos .WMF) Mapa de bits independiente del dispositivo (DIB) Paleta de colores

LSB Visual Basic Página 2

-

Guia del Estudiante

Capitulo 5

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 vbCFLink vbCFText Valor Descripción Información de conversación DDE (Predeterminado) Texto

&HBF00 1

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 Página 3

-

Guia del Estudiante

Capitulo 5

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 vbCFLink vbCFText vbCFBitmap vbCFMetafile vbCFDIB vbCFPalette Valor Descripción

HBF00 Información de conversación DDE 1 Texto 2 Mapa de bits (archivos .BMP) 3 Metarchivo (archivos .WMF) 8 Mapa de bits independiente del dispositivo (DIB) 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 Página 4 Guia del Estudiante Capitulo 5

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 Página 5

-

Guia del Estudiante

Capitulo 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 Página 6 Guia del Estudiante Capitulo 5

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 Página 7

-

Guia del Estudiante

Capitulo 5

LSB Visual Basic Página 8

-

Guia del Estudiante

Capitulo 5

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 formulario. Para un formulario tiene dos valores posibles : 0 = None 1= Source de No puede existir comunicación DDE con ese formulario El formulario permite que exista una comunicación DLL entre uno 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. (Label, TextBox y PictureBox) ó un

LSB Visual Basic Página 9

-

Guia del Estudiante

Capitulo 5

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 (destino), 3=Notify é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] Los datos se traspasarán cuando lo pida la aplicación cliente mediante la orden LinkRequest. Cuando existe un cambio en los datos de la aplicación origen,

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 Página 10 Guia del Estudiante Capitulo 5

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 Página 11 Guia del Estudiante Capitulo 5

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 Página 12 Guia del Estudiante Capitulo 5

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 Página 13

-

Guia del Estudiante

Capitulo 5

LSB Visual Basic Página 14

-

Guia del Estudiante

Capitulo 5

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 Página 15

-

Guia del Estudiante

Capitulo 5

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 Página 16 Guia del Estudiante Capitulo 5

Constante

Valor

Descripción Cancela la operación de arrastre. Inicia el arrastre del objeto. Termina el arrastre y suelta el objeto.

vbCancel 0 vbBeginDrag 1 vbEndDrag 2

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 Página 17

-

Guia del Estudiante

Capitulo 5

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 Página 18

-

Guia del Estudiante

Capitulo 5

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 Página 19

-

Guia del Estudiante

Capitulo 5

LSB Visual Basic Página 20

-

Guia del Estudiante

Capitulo 5

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 Página 21

-

Guia del Estudiante

Capitulo 5

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 vbCFText vbCFBitmap vbCFMetafile vbCFEMetafile vbCFDIB vbCFPalette vbCFFiles LSB Visual Basic Página 22 Valor 1 2 3 14 8 9 15 Descripción Texto (archivos .txt) Mapa de bits (Archivos .bmp) Metaarchivo (archivos .wmf) Metarchivo mejorado (archivos .emf) Mapa de bits independiente del dispositivo (DIB) Paleta de colores Lista de archivos Capitulo 5

Guia del Estudiante

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 Página 23 Guia del Estudiante Capitulo 5

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 Página 24

-

Guia del Estudiante

Capitulo 5

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 1 vbDropEffectNone No se inicia el OLE Drag & Drop 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 Página 25

-

Guia del Estudiante

Capitulo 5

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 que se Nombre del control sobre el que pasa el puntero del ratón, en el 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 1 2 vbEnter vbLeave vbOver El ratón está entrando al control El ratón está saliendo del control 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 Página 26

-

Guia del Estudiante

Capitulo 5

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 Página 27

-

Guia del Estudiante

Capitulo 5

LSB Visual Basic Página 28

-

Guia del Estudiante

Capitulo 5

LSB Visual Basic Página 29

-

Guia del Estudiante

Capitulo 5

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 Página 30 Guia del Estudiante Capitulo 5

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 Página 31 Guia del Estudiante Capitulo 5

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 Página 32 Guia del Estudiante Capitulo 5

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 Página 33

-

Guia del Estudiante

Capitulo 5

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 Edición Copiar Cortar Pegar

Name mnuEdicion mnuCopiar mnuCortar mnuPegar

Tabulada NO SI SI 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) vbPopupMenuLeftAlign Valor 0 Descripción (Predeterminado) El lado izquierdo del menú se sitúa en x. El menú emergente se centra en x. El lado derecho del menú se sitúa en x. Valor 0 Descripción (Predeterminado) Los elementos del menú emergente sólo reaccionan a los clic del mouse cuando se use el botón primario del mouse. Capitulo 5

vbPopupMenuCenterAlign 4 vbPopupMenuRightAlign 8 Constante (comportamiento) vbPopupMenuLeftButton

LSB Visual Basic Página 34

-

Guia del Estudiante

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 Página 35 Guia del Estudiante Capitulo 5

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

LSB Visual Basic Página 36

-

Guia del Estudiante

Capitulo 5