Sunteți pe pagina 1din 33

Visual Basic - Gua 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 MENS - 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 imgenes de una parte a otra dentro de la misma aplicacin, o entre dos aplicaciones distintas. Quin no ha cortado y pegado en Windows? Pues al hacerlo est introduciendo texto en el portapaleles y copindolo en otra parte.

El objeto Clipboard se usa para manipular el texto y los grficos del Portapapeles. Este objeto puede usarse para permitir que el usuario corte, copie y pegue texto y grficos en la aplicacin. El objeto Clipboard puede contener varias unidades de datos siempre y cuando cada una tenga un formato diferente. Por ejemplo, se puede usar el mtodo SetData para poner un mapa de bits en el Clipboard con el formato CF_BITMAP y despus usar el mtodo SetText con el formato CF_TEXT para poner texto en el Clipboard. Despus se puede usar el mtodo GetText para recuperar el texto o el mtodo GetData para recuperar el grfico. Los datos del Clipboard se pierden cuando se colocan otros datos con el mismo formato en el Clipboard desde el cdigo 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 datos Clipboard.SetText datos, formato 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 continuacin : Los valores de formato son: Constante vbCFLink vbCFRTF vbCFText Valor &HBF00 &HBF01 1 Descripcin Informacin de conversacin DDE Formato de texto enriquecido (Predeterminado) Texto

Estas constantes se enumeran en la biblioteca de objetos de Visual Basic (VB) del Examinador de objetos. SetData

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 1

Pone una imagen en el objeto Clipboard usando el formato grfico especificado. No acepta argumentos con nombre. Sintaxis datos formato Clipboard.SetData datos, formato Requerido. El grfico que se va colocar en el objeto Clipboard. 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 grfico automticamente.

Los valores de formato son: Constante vbCFBitmap vbCFMetafile vbCFDIB vbCFPalette Valor 2 3 8 9 Descripcin 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 grfico que se va colocar en el objeto Clipboard se define mediante la funcin LoadPicture o la propiedad Picture de los objetos Form, Image o PictureBox.

GetData Devuelve un grfico del objeto Clipboard. No acepta argumentos con nombre. Sintaxis Clipboard.GetData (formato)

formato Opcional. Una constante o valor que especifica el formato grfico de Clipboard, como se describe mas adelante. La constante o valor debe ir entre parntesis. Si formato es 0 o se omite, GetData usa automticamente el formato apropiado. Los valores de formato son: Constante vbCFBitmap vbCFMetafile vbCFDIB vbCFPalette Valor 2 3 8 9 Descripcin Mapa de bits (archivos .BMP) Metarchivo (archivos .WMF) Mapa de bits independiente del dispositivo (DIB) Paleta de colores

Si en el objeto Clipboard no hay ningn grfico que coincida con el formato esperado, no se devuelve nada. Si en el objeto Clipboard slo hay una paleta de colores, se crea un DIB de tamao mnimo (1 x 1).

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

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 2

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 parntesis. Los valores de formato son: Constante vbCFLink vbCFText Valor Descripcin Informacin de conversacin 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 vaca (""). 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 mtodo, defina la propiedad OLETypeAllowed y despus verifique el valor de la propiedad PasteOK. No se puede pegar con xito a menos que PasteOK devuelva True. Si se ha ejecutado el mtodo Paste, la propiedad OLEType es vbOLELinked (0) o vbOLEEmbedded (1). Si no se ha ejecutado el mtodo Paste, la propiedad OLEType es vbOLENone (3). Este mtodo puede usarse para implementar un comando Edicin 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. 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.

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 3

Esta propiedad puede usarse si se quiere que la aplicacin implemente un comando Pegar en un men Edicin. 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 mtodo Paste. Para ofrecer mayor flexibilidad al usuario, presente un cuadro de dilogo Pegado especial cuando el usuario elija el comando Edicin Pegar . (Establezca OLETypeAllowed = 2 y despus use el mtodo PasteSpecialDlg). Cuando se presenta este cuadro de dilogo, el objeto del Portapapeles del sistema se pega basndose en las selecciones del usuario en el cuadro de dilogo. 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 parntesis. Los valores de formato son: Constante vbCFLink vbCFText vbCFBitmap vbCFMetafile vbCFDIB vbCFPalette Valor HBF00 1 2 3 8 9 Descripcin Informacin de conversacin DDE Texto Mapa de bits (archivos .BMP) Metarchivo (archivos .WMF) Mapa de bits independiente del dispositivo (DIB) Paleta de colores

El mtodo GetFormat devuelve True si algn 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 grfico. Clear Borra el contenido del Portapapeles del sistema. Sintaxis Clipboard.Clear

Con Clear se borra todo el contenido del portapapeles, texto y grficos. 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

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 4

Cuando se copia un objeto en el Portapapeles del sistema, todos los datos y la informacin de vinculacin 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 mtodo puede usarse para implementar un comando Edicin | 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 grfico que tiene el Picture de la izquierda puede ser cualquiera. El cdigo 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

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 5

Case 1 Msg = "El Portapapeles slo contiene texto." Case 2 Msg = " El Portapapeles slo 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() Picture2.Picture = LoadPicture End Sub Private Sub Command8_Click() Text1.Text = Trim(Text1.Text) If UCase(Right(Text1.Text, 3)) = "BMP" Then Check1.Value = 1 Else Check1.Value = 0 End If If Check1.Value = 1 Then Clipboard.SetData LoadPicture(Text1.Text), 8 Else Clipboard.SetData LoadPicture(Text1.Text) End If End Sub

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 6

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 7

INTERCAMBO DINAMICO DE DATOS (Dinamic Data Exchange) DDE El intercambio dinmico 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 aplicacin a otra se necesitan al menos, dos aplicaciones (lgico), una que se deje leer, y la otra (u otras), que quieran leer la informacin en aquella. Puede darse el caso que una aplicacin est recibiendo datos de otra aplicacin, y a su vez enve datos a una tercera. A la aplicacin que enva la informacin se le llama aplicacin servidor, y a la que la recibe, aplicacin cliente. La aplicacin servidor debe estar funcionando antes de que la aplicacin cliente le pida la informacin. Si no es as, se generar un error. Los datos a traspasar de una aplicacin a otra pueden ser: Textos, de un Label o un TextBox. Imgenes, 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 informacin a enviar. Para indicar que un formulario es origen de informacin para un intercambio DDE debemos decrselo en sus propiedades LinkMode y LinkTopic. El destino de un texto ha de ser necesariamente un Label, un TextBox, y el destino de un grfico 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 1= Source No puede existir comunicacin DDE con ese formulario El formulario permite que exista una comunicacin DLL entre uno de sus controles y otra aplicacin.

Si se establece el valor de esta propiedad a 0 en tiempo de diseo, no podr cambiarse en tiempo de ejecucin. Si se establece a 1 en tiempo de diseo, se podr cambiar a 0 y volver a ponerla a 1 en tiempo de ejecucin.

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 8

Para un control, la propiedad LinkMode le permite que inicie una conversacin DDE con una aplicacin servidor, (origen), y cmo iniciarla. Tiene 4 valores posibles : 0=None. 1=Automtico No existe comunicacin DDE con ese control Los datos se traspasarn desde la aplicacin servidor a este control de la aplicacin cliente cada vez que cambie el dato en la aplicacin servidor (origen) Los datos se traspasarn cuando lo pida la aplicacin cliente (destino), mediante la orden LinkRequest. Cuando existe un cambio en los datos de la aplicacin origen, sta notifica a la aplicacin destino que el dato ha cambiado, pero no le enva el dato nuevo. En el control de la aplicacin destino donde debe llevarse la informacin, se genera el evento LinkNotify, en cuyo procedimiento podremos escribir el cdigo necesario dependiendo de nuestra aplicacin. Para traer la informacin, debe ejecutarse la orden LinkRequest. (Vase mas adelante)

2=Manual

3=Notify

En tiempo de ejecucin, 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 [= nmero] donde nmero es un entero que especifica el tipo de conexin. (0, 1, 2 3 segn 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 comunicacin DDE llama a la aplicacin origen, y dentro de ella, al formulario que contiene el control cuya informacin debe ser traspasada. (Ntese que la aplicacin origen puede tener varios formularios). Al ese formulario podra 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 conversacin DDE. Sintaxis NombredelFormulario.LinkTopic [= tema]

Para un control destino, La propiedad LinkTopic contiene el nombre de la aplicacin y el tema, ambos separados mediante el carcter | (carcter 124) Sintaxis NombredelControl.LinkTopic [= aplicacionorigen|tema]

El nombre de la aplicacin origen ser el nombre del de proyecto de Visual Basic sin la extensin .VBP (si la aplicacin se est ejecutando en el entorno de desarrollo de Visual Basic), o el nombre de la aplicacin de Visual Basic sin la extensin .EXE (si se ejecuta como un archivo ejecutable independiente).

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 9

El tema ser el mismo al que responde el formulario donde se encuentra el control que contiene la informacin a traspasar. (DDE es una utilidad de Windows. Windows establece que el estndar de un vinculo DDE es Aplicacin | Tema | elemento. Vase para mas detalles el manual de Windows, enlaces DDE) Propiedad LinkItem La propiedad LinkItem solamente la tiene el control destino de la informacin. No la tiene el formulario origen. En esta propiedad deber expresarse el nombre del control origen de la informacin. 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 ejecucin. 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 = nmero

donde nmero es una expresin numrica que especifica el tiempo de espera en dcimas de segundo. El tiempo de respuesta DDE desde aplicaciones origen vara. Use esta propiedad para ajustar el tiempo que un control destino espera la respuesta de una aplicacin origen. Si se usa LinkTimeout de forma correcta se puede evitar la generacin de un error por Visual Basic si una aplicacin origen tarda mucho en responder. Nota La plazo mayor de tiempo que un control puede esperar es 65.535 dcimas 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 conversacin 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 vnculo DDE si la propiedad LinkMode del control destino est establecido a 3 (Notificar). Private Sub objeto_LinkNotify([ndice As Integer])

End Sub En este procedimiento se puede escribir el cdigo necesario para nuestra aplicacin, a sabiendas de que este evento se produce cuando cambia la informacin en origen. Posiblemente no quiera depositarlo de inmediato en el control destino, puesto que si fuese as habra puesto la propiedad LinkMode a 1. Cuando quiera colocar el dato en el control destino, puede utilizar el mtodo LinkRequest para obtener el nuevo dato de la fuente.

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 10

Mtodo LinkRequest Pide a la aplicacin origen de una conversacin DDE que actualice el contenido de un control Label, PictureBox o TextBox. Sintaxis objeto.LinkRequest

Siendo objeto el nombre del control destino de la aplicacin.

Objeto es el nombre de un control Label, PictureBox o TextBox involucrado en una conversacin DDE como destino. LinkRequest provoca que la aplicacin origen enve 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 (Automtico), la aplicacin origen actualiza objeto automticamente y LinkRequest no es necesario. Si la propiedad LinkMode del objeto est definida como 2 (Manual) , la aplicacin origen actualiza objeto slo 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 mtodo LinkNotify. El destino debe entonces usar el mtodo LinkRequest para actualizar los datos.

Mtodo LinkSend Transfiere el contenido de un control PictureBox a la aplicacin destino de una conversacin DDE. Sintaxis objeto.LinkSend

Objeto debe ser un control PictureBox de un objeto Form que sea origen de una conversacin DDE. Cuando otras aplicaciones establecen vnculos automticos con un objeto Form de su aplicacin, Visual Basic las notifica cuando el contenido de un control TextBox o Label origen cambia. Sin embargo, Visual Basic no notifica automticamente a una aplicacin destino DDE cuando el valor de la propiedad Picture de un control PictureBox origen cambia. Como la cantidad de datos de un grfico pueden ser muy grande y como no tiene sentido actualizar la aplicacin destino por cada cambio de pxel de la imagen, Visual Basic requiere el uso del mtodo LinkSend para notificar explcitamente a las aplicaciones destino DDE cundo cambia el contenido de un control PictureBox.

Mtodo LinkPoke Transfiere el contenido de un control Label, PictureBox o TextBox a la aplicacin origen de una conversacin DDE. Sintaxis objeto.LinkPoke

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 11

Objeto es el nombre del control Label, PictureBox o TextBox involucrado en la conversacin 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 conversacin DDE la informacin fluye de origen a destino. Sin embargo, LinkPoke permite que un objeto destino suministre datos al origen. No todas las aplicaciones origen aceptan informacin de esta forma; si la aplicacin origen no acepta los datos, se produce un error.

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 12

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 13

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 grfica, mediante la operacin de colocar el puntero del ratn y pulsar su botn izquierdo sobre ese algo que se quiere tomar. Sin dejar de pulsar el botn izquierdo del ratn se desliza (se arrastra) el puntero del ratn hasta el punto de la interface grfica donde lo queremos dejar. Ese punto puede ser un control o un formulario. Una vez en el punto de destino se suelta el botn del ratn y se deja caer lo que habamos tomado en el punto de origen. El efecto de tomar algo de un control le denominaremos Drag. Si durante la operacin 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 didctico. Pero NO HACE otra cosa. Es decir, no toma nada del control origen ni lo suelta al llegar a destino. Esa accin de tomar algo en el origen o soltarlo al llegar al destino debemos realizarla mediante cdigo en los eventos adecuados (MouseDown, DragOver , DragDrop), dando los valores adecuados a las propiedades DragMode y DragIcon, y utilizando el mtodo 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 automtico en una operacin de arrastrar y soltar. Sintaxis NombreControlOrigen.DragMode = nmero

Donde nmero puede tomar los valores 0 (Manual) 1 (Automtico). El valor predeterminado es el 0. Cuando esta propiedad est a 0 (Manual) se debe emplear el Mtodo Drag para iniciar una operacin Drag & Drop. Si est a 1, la operacin de arrastrar y soltar se inicia automticamente cada vez que hacemos click sobre el botn izquierdo del ratn, teniendo el puntero del mismo sobre el control. Los controles contenedores OLE slo se arrastran automticamente cuando no tienen el enfoque. Parece en principio mas prctico 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 mtodo Drag para iniciar el proceso. El poner esta propiedad en automtico conlleva tambin 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 operacin de Drag & Drop.

Propiedad DragIcon
Devuelve o establece el icono que se presenta como puntero del ratn durante una operacin de arrastrar y soltar. Sintaxis NombreControlOrigen.DragIcon = icono

Donde Icono es cualquier referencia a un icono vlido.

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 14

Esta propiedad va a marcar el icono que aparezca durante la operacin Drag & Drop desplazndose a lo largo de la ventana. Si no se especifica esta propiedad, el desplazamiento se expresa mediante un rectngulo del tamao del control origen, cosa que resulta bastante desagradable en cualquier aplicacin. Debe ponerse por lo tanto un icono en esta propiedad. El valor de esta propiedad puede establecerse en tiempo de diseo, eligiendo el icono en el cuadro de Propiedades del control origen, o en tiempo de ejecucin. En este caso, la referencia a un icono vlido puede darse igualando el valor de esta propiedad a un icono ya existente en la aplicacin (NCO.DragIcon = Form1.Icon pondra como icono el del formulario Form1, NCO.DragIcon = Text1.DragIcon pondra el mismo icono de Text1 para esta propiedad), o cargndolo mediante la funcin LoadPicture : (NCO.DragIcon = LoadPicture (C :\Iconos\Icono1.ICO) El archivo que se cargue debe tener la extensin .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 rpido, no es conveniente acceder al disco (mediante la funcin LoadPicture) cada vez que tiene que cambiar la imagen del icono. Como para simular un movimiento tan sencillo son suficientes pocas imgenes, (8 por ejemplo) puede crear otras tantas variables tipo Picture, cargar las imgenes al comienzo de la aplicacin (con la funcin LoadPicture) y cuando necesite el movimiento animado del icono, cargar las 8 imgenes 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 presentacin de una aplicacin.

Mtodo Drag
Inicia, termina o cancela una operacin de arrastre de cualquier objeto excepto los controles Line, Menu, Shape o Timer. Sintaxis NombreControlOrigen.Drag TipoAccin

NombreControlOrigen es el nombre del control donde se inici la operacin Drag & Drop. TipoAccin es un valor o una constante que especifica la accin a realizar, segn se describe a continuacin : Constante vbCancel vbBeginDrag vbEndDrag Valor 0 1 2 Descripcin Cancela la operacin de arrastre. Inicia el arrastre del objeto. Termina el arrastre y suelta el objeto.

Si se omite TipoAccin, la accin predeterminada es iniciar el arrastre del objeto.

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 15

El uso del mtodo Drag para controlar una operacin de arrastrar y soltar slo 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 mtodo asncrono y las instrucciones siguientes se ejecutaban incluso aunque la accin de arrastre no hubiera terminado. En Visual Basic versin 4.0, Drag es un mtodo sncrono y las instrucciones siguientes no se ejecutan hasta que la accin de arrastre no haya terminado. Usando el mtodo Drag puede controlar exactamente cuando quiere que se produzca el inicio del Drag & Drop y el final. El autor de esta Gua 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 (automtico) ese TextBox no podr coger el foco, (al menos de forma fcil) 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 operacin D & D. Como decamos al principio, el Drag & Drop solamente es una manifestacin visual de algo que se est produciendo, pero ese algo deberemos programarlo. Por ejemplo, es muy tpico llevar un dato de una casilla a otra (de un TextBox a otro p.e.) mediante una operacin D & D. El dato debemos llevarlo a una variable que nos permita, al final de la operacin, introducir ese dato en el TextBox final. (No olvide declarar la variable en el lugar correspondiente para que sea vlida en ambos controles). La accin 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 operacin 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 ratn para cambiar el texto, cosa que no podra hacer si pone DragMode=1.

Evento DragOver
Cuando una operacin de arrastrar y soltar est en progreso y el cursor del ratn 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 parmetros : 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 operacin de Drag & Drop. Dentro de este procedimiento puede hacer referencia a sus propiedades y mtodos 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 Nmero que especifica la posicin horizontal (x) y vertical (y) actual del puntero del mouse dentro del control o formulario destino. Estas coordenadas se expresan siempre en trminos del

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 16

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 transicin del control que se est arrastrando en relacin al formulario o control destino: 0 = Entra. Este valor se produce en el instante en el que entra el cursor del ratn a este control o Formulario. Se genera tambin en el control origen en el instante que se pulsa el botn del ratn, inicindose 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 parmetro origen (completado con ndice si el origen se trata de un array) podemos conocer el control desde el que se inici la operacin 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 operacin de Drag & Drop, independientemente que ese control o formulario sea o no sea origen ni destino de esa operacin. 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 mrgenes que admite la aplicacin, 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 mrgenes aceptables. O cambiar la propiedad DragIcon del control origen cuando ese dato no se puede depositar en ese control. Es tpico poner la seal de trafico de Prohibido cuando el dato transportado no se puede soltar sobre el control sobre el que estamos pasando el cursor del ratn. (Como el control origen se pasa como parmetro 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 aplicacin. 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

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 17

Evento DragDrop
Ocurre cuando se completa una operacin de arrastrar y soltar como resultado de arrastrar un control sobre un formulario o control y liberar el botn del mouse o utilizar el mtodo Drag con su argumento accin establecido a 2 (Drop). Dependiendo de si soltamos sobre un Formulario convencional, Formulario MDI o Control, este evento captura los siguientes parmetros : 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 parmetros son idnticos a los del Procedimiento DragOver ya comentados Utilice un procedimiento de evento DragDrop para controlar qu ocurre tras completarse una operacin 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 operacin Drag & Drop no hace otra cosa que lo que se puede ver en la interface grfica. Debe poner en este Procedimiento (DragDrop) el cdigo necesario para que se realice la operacin deseada.

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 18

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 19

EL OLE Drag & Drop


El Drag & Drop visto hasta ahora permite llevar datos desde un control a otro siempre dentro de la misma aplicacin, incluyendo una interface grfica muy didctica para presentar ese movimiento de informacin. El DDE permite llevar informacin desde una aplicacina otra, pero de forma rgida, es decir, desde un control a otro control, sin intervencin del usuario, o al menos, sin una intervencin realizada de forma grfica con el ratn. Cuando veamos las propiedades de los controles relacionadas con el Drag & Drop, veamos otras que hablaban de Drag y Drop, que eran OLEDragMode y OLEDropMode, y en el Formulario veamos solamente esta ltima: OLEDropMode. Entre los procedimientos observbamos algo parecido: OLECompleteDrag, OLEDragDrop, OLEDragOver, OLEGiveFeedback, OLESetData y OLEStartDrag. Tambin existe el Mtodo OLEDrag. Mediante estas propiedades, procedimientos y mtodo, podemos hacer que desde una aplicacin (Word por ejemplo) pase informacin a una aplicacin hecha por nosotros, utilizando la misma interfase grfica para ver el movimiento de los datos. Lo mismo ocurre en sentido contrario. Desde una aplicacin nuestra podemos llevar texto o imgenes 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 prcticamente igual con el portapapeles. Por lo tanto, no se haga demasiadas ilusiones. Y adems recuerde que el mecanismo de arrastrar y soltar no es tan fcil como copiar y pegar, al menos para personas poco hbiles.

El Objeto DataObjet
El objeto DataObjet es un contenedor que utiliza OLE para transportar datos. Recuerde, cuando hacamos Drag & Drop normal, en el Drag tenamos que meter lo que queramos transportar (Texto o imagen) en una variable y en el Drop ponamos el contenido de esa variable en el control final. Esto puede hacerse cuando se trata de una misma aplicacin, en la que el valor de la variable se mantiene mientras estuvisemos dentro del mbito donde se ha declarado. Cmo haramos 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 mtodos.

Mtodos del DataObject


Mtodo 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

Pgina 20

Por ejemplo, en el mtodo OLEStartDrag se pasa como parmetro 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 ejecucin de ese procedimiento OLEStartDrag el texto introducido en Data est disponible para cualquier aplicacin 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 ms abajo.

Mtodo 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 ms abajo. Un ejemplo de GetData. En el procedimiento OLEDragDrop de un RichTextBox con la propiedad OLEDropMode existe este cdigo para poner el texto que llevaba el DataObject en el RichTextBox. Observe que tambin se pasa en este procedimiento, un parmetro 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 mtodos son: Constante vbCFText vbCFBitmap vbCFMetafile vbCFEMetafile vbCFDIB vbCFPalette vbCFFiles vbCFRTF Valor 1 2 3 14 8 9 15 -16639 Descripcin 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 Formato de texto enriquecido (archivos .rtf)

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 21

Mtodo Clear
Elimina el contenido del objeto DataObject. Sintaxis objeto.Clear

Puede ejecutar este mtodo 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 mtodo slo est disponible para los orgenes de operaciones de arrastre de componentes. Si se invoca Clear desde un destino de la operacin de colocacin de componentes, se producir un error.

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


Deberamos decir mejor, propiedad, ya que solamente tiene una: Propiedad Files Devuelve una coleccin 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 coleccin Files slo se puebla con nombres de archivo cuando el objeto DataObject contiene datos de tipo vbCFFiles. La coleccin Files puede rellenarse para permitir a las aplicaciones de Visual Basic actuar como origen de operaciones de arrastre de una lista de archivos.

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 22

Coleccin DataObjectFiles Es la coleccin de cadenas con los nombres de ficheros de la propiedad Files del objeto DataObject. Sintaxis NombredelObjetoDataObject.DataObjectFiles

La coleccin DataObjectFiles es una coleccin de cadenas que representan un conjunto de archivos seleccionados mediante el mtodo GetData o en una aplicacin, como el Explorador de Windows. Aunque la coleccin DataObjectFiles tiene sus propios mtodos y propiedades, debe usar la propiedad Files del objeto DataObject para ver y manipular el contenido de la coleccin 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 coleccin DataObjectFiles.

Volvamos sobre las propiedades y mtodos de los controles involucrados en un OLE Drag & Drop
Propiedad OleDragMode Esta propiedad establece la forma en la que comienza a realizarse la operacin de Drag. Si est en Automtico basta con seleccionar el texto o la imagen a pasar a otra aplicacin y una vez seleccionado, al volver a marcarlo con el ratn, se inicia el Drag. En ese instante se ejecuta el procedimiento OLEStartDrag donde deberemos colocar el cdigo para que VB haga lo que nosotros queramos. Ya se ver al estudiar este procedimiento. A diferencia del Drag & Drop estudiado anteriormente, donde recomendbamos poner la propiedad similar a manual, en este caso es mucho ms prctico ponerlo en automtico y adems 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 aplicacin. La propiedad DragMode de ese control debe estar ahora a Manual, ya que si est en automtico 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 mtodo OLEDrag, que ejecuta el procedimiento OLEStartDrag, y colocar en este el cdigo correspondiente. No es prctico, pero cada aplicacin 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: El componente no acepta operaciones de Drop. Cuando pasa el cursor del ratn sobre l durante una operacin 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 operacin en el cdigo. 2 vbOLEDropAutomatic Automtico. El componente de destino acepta automticamente las operaciones OLE de colocar si el objeto DataObject contiene datos en un formato que reconoce. En este caso, en el 0 vbOLEDropNone

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 23

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 informacin tanto en destino como en origen. Estando en Automtico, la informacin 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 informacin 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 parmetro Source que tenamos 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 aplicacin externa (Word por ejemplo). Ese parmetro Source lo emplebamos para saber si un control poda recibir o no la informacin, dependiendo del origen de la misma. En el OLE Drag & Drop solamente podemos basarnos para eso en el tipo de informacin que transporta el DataObject, tipo que podemos determinar mediante el mtodo GetFormat. Evento OLEStartDrag Se produce cuando se ejecuta el mtodo OLEDrag de un componente o cuando un componente inicia una operacin 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 parmetro el objeto datos que es del tipo DataObject. Por lo tanto podemos realizar sobre este objeto el mtodo 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 parmetro EfectosPermitidos va a determinar lo que ocurre con el dato en el control origen. Acepta 3 valores: 0 1 2 vbDropEffectNone vbDropEffectCopy vbDropEffectMove No se inicia el OLE Drag & Drop Los datos se copian en el destino y no se modifican en el control origen. 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 ratn pasa por encima de un control durante una operacin de OLE Drag & Drop. Sintaxis

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 24

Private Sub nombredelcontrol_OLEDragOver(datos As DataObject, efecto As Long, botn As Integer, maysculas 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 ratn, en el que se produce el evento OLEDragOver.

datos efecto boton mayusculas

x, y estado

Objeto tipo DataObject que transporta los datos Este parmetro es similar al AllowedEffects del evento OLEStartDrag y tiene los mismos valores. Indica el botn que se est pulsando: 1 = izdo. 2 = Dcho. 4 = Central. Si est pulsado ms de uno, ser la suma de los valores de cada uno. Indica el estado de pulsacin de las teclas MAYUSCULAS, CTRL y ALT 1 = MAY, 2 = CTRL, 4 = ALT. Si hay ms de una tecla pulsada, ser la suma de los valores de cada una. Posicin del puntero del ratn dentro del control destino, medidas en las unidades de medida del formulario. Valor que indica uno de los tres estados siguientes: 0 1 2 vbEnter vbLeave vbOver El ratn est entrando al control El ratn est saliendo del control El ratn est dentro del control

Evento OLEDragDrop Se produce cuando se termina la operacin de OLEDrag&Drop sobre el control. Para que se pueda terminar la operacin de OLEDrag&Drop el componente destino tienen que permitirlo. Nota Este evento slo se produce cuando OLEDropMode est establecido a 1 (Manual). Sintaxis Private Sub objeto_OLEDragDrop(datos As DataObject, efecto As Long, botn As Integer, maysculas As Integer, x As Single, y As Single) En este evento podemos escribir el cdigo 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 parmetros pasados por este evento son iguales al del evento anterior.

Evento OLECompleteDrag Se produce en el origen cuando se ha completado la operacin de arrastre (cuando se levanta el botn del ratn), e informa al componente de origen de que se ha completado o cancelado dicha operacin. Sintaxis Private Sub objeto_OLECompleteDrag([efecto As Long])

Efecto es idntico a los eventos anteriores. En el ejemplo siguiente, el control origen (Text1) se pone rojo cuando se termina el OLEDrag&Drop:

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 25

Private Sub Text1_OLECompleteDrag(Effect As Long) Text1.BackColor = 255 End Sub

Evento OLEGiveFeedback Este evento se produce en el control Origen. Se produce despus de cada evento OLEDragOver. OLEGiveFeedback permite al componente de origen proporcionar al usuario una indicacin visual, como cambiar el cursor del mouse para indicar lo que ocurrir si coloca el objeto o sealar visualmente la seleccin (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 captulo hemos visto tres formas de transvasar informacin, bien de una aplicacin a otra, bien dentro de la misma aplicacin. Es posible que le haya llamado la atencin estas herramientas. Y posiblemente piense en un enorme nmero de posibilidades de aplicacin. 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 dems no se usan con la profusin que se debera, vistas a priori las ventajas que tienen. Como siempre en programacin, lo bueno es lo que acepta y le gusta al usuario. Y el realizar un arrastre con el ratn es una operacin que no todos terminan con xito. Quizs sea esa la razn de no usarlo tan profusamente.

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 26

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 27

EL EDITOR DE MENUS El Men o Barra de Men es la segunda lnea 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 ningn cdigo en su procedimiento, ya que estn ah justamente para desplegar otras palabras. Ser en las palabras finales donde se colocar el cdigo 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 lnea que separa las palabras Guardar Como y SALIR. Esta lnea separadora es muy prctica 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 aplicacin. Para crear un men debe usarse el Editor de Men, que se encuentra en la Barra de Men de VB en Herramientas | Editor de mens. Le aparecer el siguiente cuadro. (En principio vaco)

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 28

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 mens. Para colocar el cursor de escritura en una u otra casilla, puede hacerse bien con el cursor del ratn, bien con el tabulador. Para pasar a la siguiente lnea de edicin (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 nmero 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 ejecucin, por lo que esta propiedad puede usarse para deshabilitar ciertas funciones de la aplicacin, dependiendo de la evolucin de la propia aplicacin. La presentacin en el men cuando est deshabilitada es con color plido. Visible. de ejecucin. Como su nombre indica, que sea visible o no lo sea. Puede cambiarse en tiempo

WindowList Indica si esa palabra es la que va a mostrar todos los formularios abiertos en una aplicacin de documentos mltiples (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 ejecucin. Para cambiar una de estas propiedades en tiempo de ejecucin, basta con citar por su nombre a esa palabra (por su Name, no por su Caption), e igualar a True o False su valor :

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 29

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 solucin 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 ratn. 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 lnea que la contiene. Esta combinacin de teclas aparecer en el men, al lado de la palabra (Vase figura siguiente, SALIR Ctrl + X) NegotiatePosition. Establece un valor que determina si los controles Menu de nivel superior se muestran en la barra de mens mientras un objeto vinculado o incrustado de un formulario est activo y mostrando sus mens. No est disponible en tiempo de ejecucin. Puede tener los valores 0 (Predeterminado) Ninguno. El men no se muestra en la barra de mens cuando el objeto est activo. 1 Izquierda. El men se muestra a la izquierda de la barra de mens cuando el objeto est activo. 2 Medio. El men se muestra en medio de la barra de mens cuando el objeto est activo. 3 Derecha. El men se muestra a la derecha de la barra de mens cuando el objeto est activo. El men editado con los datos de la figura anterior tendr esta forma en tiempo de ejecucin :

Observe que tiene cuatro palabras en la lnea superior, y que colgando de la primera aparece un men desplegable. Para conseguir un men desplegable fjese en la figura del Editor, en la parte de abajo donde estn todos los Caption de las palabras del men. Observar que algunas de ellas (&Edicion, Documentos, Ayuda - Hay otra que no se v, &Archivo) estn completamente a la izquierda de la ventana, y las dems estn separadas de la parte izquierda por unos guiones. Las palabras que estn completamente a la izquierda son las que figurarn en la barra de men de forma permanente. Las que estn separadas (tabuladas) corresponden a las que aparecern en los mens desplegables. Como es lgico, 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.

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 30

Para tabular las palabras, hay que hacer click en el botn en forma de flecha a la derecha que est sobre la ventana de edicin:

Situandonos sobre una de las lneas ya editadas, y haciendo click sobre el botn con flecha hacia la izquierda, quitamos la tabulacin. Los botones con flecha hacia arriba o abajo nos permiten variar el orden de las lneas ya editadas. Podemos hacer varios niveles de submens a base de introducir varias tabulaciones. Al comienzo de este captulo puede ver un ejemplo de ello. Quedan un par de cosas. Una de ellas es el carcter & que est delante de los Caption de Archivo y Edicin. Este carcter nos permite acceder al procedimiento click de esa palabra pulsando la tecla Alt + la tecla correspondiente a la letra que est detrs del carcter &. Justamente la letra que est subrayada en la palabra del men. El carcter & 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 lnea entre Guardar Como y SALIR. Esta lnea, que solamente tiene efectos estticos, se logra introduciendo como Caption un guin ( - ). El editor de mens solamente le permite el guin en una palabra de men desplegable (Tabulada). No se olvide de poner el Name incluso para este guin.

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 lnea separadora. (Vea The Windows Interface Guidelines for Software Design, pg.124)

POPUP MENS 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 botn derecho del ratn, donde aparecen las tres palabras mgicas 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, exista una palabra Edicin, de la que se desplegaba el Submen Copiar, Cortar y Pegar. Si analizamos la edicin realizada, las palabras tenan el siguiente Caption y Name :

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 31

Caption Edicin 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 aparecan en el men desplegable. Esas mismas sern las que aparezcan en el PopUpMenu. Para ello utilizaremos el Mtodo PopupMenu. Este mtodo pesenta un men emergente en un objeto MDIForm o Form en la posicin actual del mouse o en las coordenadas especificadas.

La sintaxis de este mtodo 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 parmetro 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. Parmetro opcional. Un valor o constante que especifica la posicin y el comportamiento del men emergente, como se describe a continuacin : Constante (posicin) vbPopupMenuLeftAlign Valor 0 Descripcin (Predeterminado) El lado izquierdo del men se sita en x. El men emergente se centra en x. El lado derecho del men se sita en x. Valor 0 Descripcin (Predeterminado) Los elementos del men emergente slo reaccionan a los clic del mouse cuando se use el botn primario del mouse. Los elementos del men emergente reaccionan a los clic del mouse cuando se usen los botones primario o secundario.

vbPopupMenuCenterAlign 4 vbPopupMenuRightAlign 8 Constante (comportamiento) vbPopupMenuLeftButton

vbPopupMenuRightButton

Para combinar la los valores de indics de posicin y comportamiento basta con sumar los valores. Nota El parmetro indics no tiene efecto en las aplicaciones que se ejecuten bajo Microsoft Windows versin 3.0 o anteriores. X, y Parmetro(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. Parmetro opcional que especifica el nombre de un control men del men emergente para presentar su ttulo en negrita. Si se omite, ningn control del men aparece en negrita.

LSB

Visual Basic

Guia del Estudiante

Capitulo 5

Pgina 32

Nota. Este argumento funciona solamente en las aplicaciones que se ejecuten bajo Windows 95. La aplicacin 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 botn derecho del ratn. Concretamente en el editor Word que estoy utilizando para escribir estos apuntes ocurre cuando se levanta el botn derecho del ratn. Es decir, en el evento MouseUp, con la condicin 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 Edicin. (Vea mas atrs). Queremos tambin que la palabra Copiar salga resaltada en negrita. Iramos al procedimiento MouseUp del Formulario y escribiramos : 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 parmetro indics, y las coordenadas x e y (el men emergente aparecer donde est situado el cursor del ratn). Observe tambin que las comas separadoras de los parmetros hay que colocarlas. Cuando se presenta un men emergente, el cdigo que sigue a la llamada al mtodo PopupMenu no se ejecuta hasta que el usuario elige un comando del men (en cuyo caso se ejecuta antes el cdigo del procedimiento de evento Click) o cancela el men. Adems, slo puede presentarse un men emergente al mismo tiempo; por lo tanto, las llamadas a este mtodo 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 vern en el men emergente. Puede aprovechar esta circunstancia para hacer mens emergentes con mas o menos elementos, segn las necesidades de su aplicacin. Tambin 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 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

Pgina 33

S-ar putea să vă placă și