Visual Basic - Guía del Estudiante Cap. 5 PORTAPAPELES INTERCAMBO DINAMICO DE DAT DATOS OS EL DRAG AND DROP (Drag & Drop) Arrastrar y Soltar EL OLEDRAGDROP Drag & Drop con otras aplicaciones aplicaciones MENÚS - MENUS EMERGENTES
EL PORT PORTAPAPELES. APAPELES. EL OBJETO CLIPBOARD El objeto Clipboard Clip board Proporciona acceso al Portapapeles del sistema. El portapapeles es una herramienta de windows que permite transportar texto o imág imágen enes es de una una part parte e a otra otra dent dentro ro de la mism misma a apli aplica caci ción ón,, o entr entre e dos dos aplicaciones distintas. ¿Quién no ha cortado y pegado en Windows? Pues Pues al hacerlo 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 formato diferente. 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 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 caden cadena a de text texto o en el objet objeto o Clipb Clipboar oard d usan usando do el forma formato to del del objet objeto o Clipboard especificado. No acepta argumentos con nombre. Sintaxis
Clipboard. SetText datos, formato
datos Requerido. equerido. Cadena Cadena de datos que se se va a colocar en el Portapapel Portapapeles. es. formato Opcional. Un Una a constante o valor que especifica uno de los formatos del Portapapeles reconocidos por Visual Basic, como se describe a continuación : Los valores de formato son: Constante
Valor
Descripción
vbCFLink vbCFRTF vbCFText
&HBF00 &HBF01 1
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 constantes se enumeran en la biblioteca de objetos de Visual 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. Clipboard.SetData datos, formato
Sintaxis datos tos
Requerido. do. El El gr gráfico fico que que se se va va col colo ocar en en el el obj obje eto Clipb ipboar oard.
forma formato to Opcio Opciona nal. l. Una const constan ante te o val valor or que espe especif cific ica a uno uno de los formatos del objeto Clipboard reconocidos reconocidos por Visual Basic, como se describe mas adelante. Si formato se omite, SetData determina el formato gráfico automáticamente. Los valores de formato son: Constante
Valor Descripción
vbCFBitmap vbCFMetafile vbCFDIB vbCFPalette
2 3 8 9
Mapa de bits (archivos .B .BMP) Metarchivo (archivos .WMF) Mapa de bits independiente del dispositivo (DIB) Paleta de colores
Estas constantes constantes se enumeran en la biblioteca de objetos de Visual Visual Basic (VB) del Examinador de objetos. El gráf gráfic ico o que se va coloc colocar ar en el obje objeto to Clip Clipboa board rd se define define median mediante te la funci función ón Load LoadPi Pict ctur ure e o la propi propied edad ad Pict Pictur ure e de los objet objetos os Form Form,, Imag Image e o PictureBox.
GetData Devuelve un gráfico del objeto Clipboard. No acepta argumentos con nombre. Clipboard.GetData (formato)
Sintaxis
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 form format ato o es 0 o se omit omite, e, GetD GetDat ata a usa usa auto automá máti tica came ment nte e el form format ato o apropiado. Los valores de formato son: Constante
Valor Descripción
vbCFBitmap vbCFMetafile vbCFDIB vbCFPalette
2 3 8 9
LSB Visual Basic Página 2
Mapa de bits (archivos .B .BMP) Metarchivo (archivos .WMF) Mapa de bits independiente del dispositivo (DIB) Paleta de colores
-
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. Clipboard.GetText (formato)
Sintaxis
formato Opcional. Un valor o constante que especifica el formato del objeto Clipboard, como se describe mas m as adelante. La constante o valor debe ir entre paréntesis. Los valores de formato son: Constante
Valor Descripción
vbCFLink vbCFText
&HBF00 1
Información de conversación DDE (Predeterminado) Texto
Si en el objeto Clipboard no hay ninguna cadena de texto que coincida con el formato esperado, se devuelve una cadena vacía ("").
Paste Copia datos desde el Portapapeles del sistema en un control contenedor OLE. objeto.Paste
Sintaxis
Objeto es el nombre del Panel Contenedor OLE donde se quiere depositar el contenido del Portapapeles. Comentario Para ara usar usar este este métod método, o, defina defina la propi propieda edad d OLET OLETypeAl ypeAllo lowed wed y despu después és verifique el valor de la propiedad PasteOK. No se puede pegar con éxito a menos que q ue 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 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, objeto, el contro controll contened contenedor or OLE elimina elimina cualqui cualquier er objeto objeto exist existent ente e 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
VariableBooleana = objeto. PasteOK
Sintaxis
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 propi propieda edad d OLET OLETypeA ypeAllo llowe wed d se usa para para espec especif ifica icarr el tipo tipo del objet objeto o (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 desh deshab abil ilit itan an esta establ blec ecie iend ndo o su prop propie ieda dad d Enab Enable led d a True rue o False alse,, respectivamente. Los objetos se pegan en el control contenedor OLE con el método Paste. Para Para ofrece ofrecerr mayor mayor flexib flexibilid ilidad ad al usuario usuario,, prese presente nte un cuadro cuadro de diálogo 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. VariableLong = Clipboard. GetFormat (formato)
Sintaxis
formato Requerido. Un valor o constante que especifica el formato del objeto Clipboard, como se describe mas m as adelante. La constante o valor debe ir entre paréntesis. Los valores de formato son: Constante
Valor Descripción
vbC vbCFLink Link vbCFText vbCFBitmap vbCFMetafile vbCFDIB vbCFPalette
HBF0 HBF00 0 Info Inforrmaci mación ón de conve onvers rsac ació ión n DD DDE E 1 Texto 2 Mapa de bits (archivos .B .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 co lores 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. Clipboard.Clear
Sintaxis
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. objeto.Copy
Sintaxis
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 sistem sistema. a. En el Portap Portapapel apeles es del sistema sistema se pueden pueden copiar copiar objetos objetos vinculad vinculados os 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 Error Resume Next ' Configura el controlador de error errores. es. If Clipboard.GetFormat(vbCFText) Then ClpFmt = ClpFmt + 1 If Clipboard.GetFormat(vbCFBitmap) Clipboard.GetFormat(vbCFBitmap) Then ClpFmt = ClpFmt + 2 If Clipboard.GetFormat(vbCFDIB) Clipboard.GetFormat(vbCFDIB) Then ClpFmt = ClpFmt + 4 If Clipboard.GetFormat(vbCFMetafile) 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 contie ne texto y un archivo DIB." Case 8 Msg = " El Portapapeles contiene contie ne solamente un archivo MetaFile." MetaFile." Case 9 Msg = " El Portapapeles contiene contie ne 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 Clipboard.SetText Label2.Caption End Sub Private Sub Command5_Click() Label3.Caption = Clipboard.GetText Clipboard.GetText End Sub Private Sub Command6_Click() Picture2.Picture 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 Text1.T .Text ext = Trim(T rim (Text1 ext1.T .Text) ext) If UCase(Right(Text1.Text, 3)) = "BMP" Then Check1.Value Check1.Value = 1 Else Check1.Value 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 DAT DATOS OS (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 d atos 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. inf ormación. Si no es así, se generará un error. error. Los datos a traspasar de una aplicación a otra pueden ser: • •
Textos, de un Label o un TextBox. Imágenes, de un u n PictureBox.
siempre es un formula formulario rio. Dent El orige origen n de un inte interc rcamb ambio io DDE siempre Dentro ro de este 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 Tiene distinta distinta forma si se trata de un contr control ol formulario.
(Label (Label,, TextBo extBox x y Pictu Picture reBox Box)) ó un
Para un formulario tiene dos valores posibles : 0 = None 1= Source Source de
No puede existir comunicación DDE con ese formulario El for formula mulario rio permit permite e que que exis exista ta una comunica comunicación ción DLL entre entre uno sus controles y otra aplicación.
Si se estable establece ce el valor valor de esta esta propied propiedad ad a 0 en tiem tiempo po de diseño diseño,, no podrá podrá cambiarse cambiarse en tiempo de ejecución. ejecución. Si se establece establece a 1 en tiempo de diseño, se podrá cambiar a 0 y volver a ponerla a 1 en tiempo de ejecución.
LSB Visual Basic Página 9
-
Guia del Estudiante
Capitulo 5
Para un control , la propiedad propiedad LinkMode le permite que inicie una conversación 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=Au 1=Auto tomá máti tico co Los dato datos s se se tr traspa spasará sarán n des desde de la apli aplica caci ción ón se servid rvidor or a este control de la aplicación cliente cada vez que cambie cambie el dato en la aplicación servidor (origen) 2=Man 2=Manual ual (destino),
Los Los datos datos se tra trasp spasa asará rán n cuan cuando do lo pida pida la la aplic aplicac ación ión cli client ente e mediante la orden LinkRequest.
3=N 3=Notif otify y
Cuan Cuando do ex existe iste un un camb cambio io en los los dat datos os de de la apli aplica caci ción ón orig origen en,,
ésta notifica notifica a la aplicación destino que el dato ha cambiado, cambiado, pero no le envía el dato nuevo. En el control de la aplicación destino dond donde e debe debe llev llevar arse se la info inforrmaci mación ón,, se gene genera ra el even evento to LinkNotify LinkNotify,, en cuyo procedimient procedimiento o podremos podremos escribir escribir el código necesa necesario rio dependien dependiendo do de nuestra nuestra aplicac aplicación. ión. Para ara 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 valo r. La sintaxis de esta propiedad es : objeto. objeto.LinkMode [= número] 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 LinkTopic Esta Esta propied propiedad ad es de lectur lectura a y escrit escritura ura,, tanto tanto para para los controles controles como para para los formularios. Cuando Cuando un contr control ol destino destino quiere quiere establec establecer er una comunicac comunicación ión DDE “llama “llama” ” a la aplic aplicac ación ión orig origen, en, y dent dentro ro de ella ella,, al form formul ular ario io que conti contien ene e el contr control ol cuya cuya información debe ser traspasada. (Nótese que la aplicación origen puede tener varios formularios). Al ese formulario podría llamarle llamarle por su nombre, (por su Name), pero no lo hace así. Le llama por un nombre que le debemos poner al formulario en su propiedad LinkTopic. A este nombre se le denomina Tema. La propiedad LinkTopic, para un formulario de origen, devuelve o establece el tema al que el formulario “responde” en una conversación DDE. Sintaxis
NombredelFormulario. LinkTopic [= tema]
Para un control destino, La propiedad LinkTopic LinkTopic contiene el e l nombre de la aplicación apli cació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 Visual Basic), o el nombre de la aplicación aplicación de Visual Visual Basic sin la extensión extensión .EXE (si se ejecuta como un archivo ejecutable independiente). El tema será el mismo al que “responde” “responde” el formulario formulario donde se encuentra el control que contiene la información a traspasar. traspasar. (DDE es una utilidad de Windows. Windows establece que el estándar de un vinculo DDE DD E es Ap Aplic licac ación ión | Tema | elem elemen ento. to. Véase éase para para mas mas detal detalle les s el manua manuall de Windows, enlaces DDE)
Propiedad LinkItem La propiedad LinkItem solamente la tiene el control destino de la información. No la tiene tiene el formula formulario rio origen. origen. En esta esta propied propiedad ad deberá deberá expr expresa esarse rse el nombre 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. 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. 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 un a aplicación origen orige n tarda mucho en responder.
Nota La plazo mayor de tiempo que un control 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 espere la respuesta respuesta en una conversación 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 Ocurr Ocurre e cuando cuando el orige origen n ha cambi cambiado ado el dato dato defin definido ido por el víncul vínculo o DD DDE E 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 Posiblemente no quiera depositarlo depositarlo de inmediato inmediato en el control destino, puesto que si fuese así habría puesto la propiedad 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. 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 conversación DDE como destino. LinkRequest LinkRequest provoca que la aplicación origen envíe los datos actuales al objeto, actualizando actualizando la propiedad Caption si objeto es un control control Label, la propiedad Picture si objeto es un control PictureBox o la propiedad Text si objeto es e s un control TextBox. TextBox. Si la propiedad LinkMode del objeto está definida como 1 (Automático), la aplicación orige origen n actua actualiz liza a objet objeto o autom automát átic icam ament ente e y Link LinkR Reques equestt no es nece necesa sari rio. o. 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 LinkNotify. El destino debe entonces usar el método LinkRequest para actualizar los datos.
Método LinkSend Tran Transfie sfiere re el conteni contenido do de un contro controll Pictu Picture reBox Box a la aplicac aplicación ión destino destino de una conversación DDE. Sintaxis
objeto. objeto.LinkSend
Objeto debe ser un control PictureBox de un objeto Form que sea origen de una conversación DDE. Cuando otras aplicaciones aplicaciones establecen vínculos automáticos automáticos con un objeto o bjeto Form Form de su aplicación, Visual Basic las notifica cuando el contenido de un control TextBox o Label orige origen n cambi cambia. a. Sin embar embargo, go, Visu Visual al Basic Basic no notifi notifica ca autom automát átic icam amen ente te a una aplic aplicac ación ión destin destino o DD DDE E cuand cuando o el valor valor de la propi propieda edad d Pict Pictur ure e de un contr control ol 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 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. PictureBox.
Método LinkPoke Transfiere Transfiere el contenid contenido o de un control Label, PictureBox o TextBox TextBox a la aplicación apli cación origen de una conversación DDE. Sintaxis
objeto. objeto.LinkPoke
Objeto es el nombr nombre e del del contr control ol Labe Label, l, Pict Pictur ureBo eBox x o TextB extBox ox invol involuc ucra rado do en la conversación DDE como destino. Si objeto es un control Label, LinkPoke transfiere el contenid contenido o de la propie propiedad dad Caption Caption al origen. origen. Si objeto es un contro controll Pictu Picture reBox Box,, LinkPoke transfiere el contenido de la propiedad Picture al origen. Si objeto es un control TextBox, TextBox, LinkPoke transfiere el contenido de la propiedad Text Text al origen. Normalmente Normalmente,, en una conversación DDE la información 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, dato s, se produce un u n error. 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 puntero del ratón y pulsar su botón izquierdo sobre ese algo que se quiere tomar. 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 durante la operac operación ión de arrast arrastre re 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 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 distin distinta ta.. Se contr controla ola mucho mucho mejor mejor el Drag Drag & Drop Drop ponien poniendo do esta esta propi propieda edad d 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 despla desplazán zándo dose se a lo larg largo o de la venta ventana na.. Si no se espec especifi ifica ca esta esta propi propieda edad, d, el desplazamiento se expresa mediante un rectángulo del tamaño del control origen, cosa que resulta resulta bastante desagradable desagradable en cualquier 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 Form1.Icon pondría como icono icono el del formula formulario rio Form1 Form1,, NCO. NCO.DragIcon = Text1.DragI ext1.DragIcon con pondría el mismo icono de Text1 Text1 para esta propiedad), propiedad), o cargándolo mediante la función LoadPicture : (NCO.DragIcon = LoadPicture (C :\Iconos\Icono1.ICO) El archivo que se cargue c argue debe tener la extensión .ICO y formato de icono. DragIcon (una Para Nota. Cuando quiera colocar un icono animado en la propiedad DragIcon 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 LoadPictur LoadPicture) e) cada vez que tiene que cambiar la imagen del icono. 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 aplicación (con la función LoadPictur LoadPicture) e) 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 Esto le ocupa ocupará rá mas memor memoria ia.. Es el prec precio io a pagar pagar por la rapid rapidez ez 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 S hape o Timer. 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 vbBe vbBegi ginD nDra rag g 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 vers version iones es ante anterio riore res s de Visua Visuall Basi Basic, c, Drag Drag era era un métod método o asínc asíncro rono no y las 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, produciendo, pero ese algo deberemos programarlo. 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 variab variable le debemos debemos hacerl hacerla a en el proce procedimi dimiento ento mas adecuado adecuado.. Puede 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. Dependi Dependiendo endo si se trata trata de un Formula Formulario rio convenciona convencional, l, un Formu Formular lario io MD MDII 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 _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 hacer refer referenc encia ia a sus propied propiedades ades y métodos métodos con este este argume argumento nto.. Por Por ejemplo 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úme Número ro que que espec especifi ifica ca la posic posición ión horizo horizont ntal al (x) (x) y vert vertic ical al (y) (y) actu actual al del del punter puntero o del mouse mouse dentro dentro del control control o formul formulari ario o destino destino.. Estas Estas coordena coordenadas das se expresan expresan siempre siempre en términos términos del sistema sistema de coordenadas coordenadas del destino tal y como se establece en las propiedades ScaleHeight, ScaleHeig ht, ScaleWidth, ScaleLeft y ScaleTop. 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 presente que el procedimiento procedimiento DragOver DragOver se realiza realiza cada vez que pasamos por encima de un control control o formulario formulario durante una operación 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 traspasado si este valor se sale de los márgenes márgenes aceptables. aceptables. O cambiar la propiedad DragIcon del control origen cuando ese dato no se puede depositar depositar en ese control. control. Es típico poner la señal señal de trafico de Prohibido 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 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 propied propiedad ad DragIc DragIcon on del control control origen origen a una u otra otra variabl variable, e, dependie dependiendo ndo 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 Picture que van a almacenar seis iconos distintos : En General - Declaraciones Dim pepe as string Dim icono1 As Picture, Picture, Icono2 As Picture, Icono3 As Picture Dim Icono4 As Picture, Icono5 As Picture, Icono6 As Picture Picture El Form1.Load se cargan los valores de estas variables con seis iconos existentes en el disco. El icono asignado asi gnado al control co ntrol origen (Text1) (Text1) es Icono4. Set icono1 = LoadPicture("C:\vb\icons\dragdrop\drag1pg.ico") 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 Icono 5 = LoadPicture("C:\vb\icons\dragdrop\dragfldr LoadPicture("C:\vb\icons\dragdrop\dragfldr.ico") .ico") Set Icono6 Icono 6 = LoadPicture("C:\vb\icons\dragdrop\dropfldr LoadPicture("C:\vb\icons\dragdrop\dropfldr.ico") .ico") Text1.DragIcon = Icono4 En el control control destino se cambia el icono si el valor de la variable transporta transportada da (pepe) es mayor de 999 : En el procedimiento DragOver If Val(pepe) > 999 Then Source.DragIcon = icono1 ‘Al salir de Text1 se recupera el ico no 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). Dependi Dependiendo endo de si soltamo soltamos s sobre sobre un Formu Formular lario io convenc convenciona ional, l, Formu Formular lario io MD MDII o Control, este evento captura los siguientes siguie ntes 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 _DragDrop([índice As Integer,]origen As Control, x As Sing le, y As Single) Estos parámetros son idénticos a los del Procedimiento DragOver ya comentados Utili Utilice ce un proc proced edimi imient ento o de event evento o DragDrop para para contr control olar ar qué ocur ocurre tras 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. información. El DDE permite permite llevar información desde desde una aplicacióna aplicacióna otra, otra, pero de forma rígida, rígida, es decir, decir, desde desde un control control a otro control, control, sin intervención intervención del usuario, 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 en el Formulario Formulario veíamos solamente esta última: OLEDropMode. Entre los los procedimient procedimientos os observábamos observábamos algo 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 Desde una aplicación aplicación nuestra nuestra podemos llevar texto o imágenes 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. Median Mediante te el OLE Drag Drag & Drop Drop ya podemos podemos enlazar enlazar nuestr nuestras as aplica aplicacio ciones nes a las aplicaciones compradas. Pero Pero piense piense que lo que que va a cons conseg egui uirr con con el OLE OLE Drag Drag & Drop Drop ya lo tien tiene e 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 (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 esto para pasar pasar un texto texto a Word? Debe haber haber una una “variable” que mantenga su contenido entre dos aplicaciones aplicaciones.. Esa “variable” debe debe ser ser un objet objeto o supe superi rior or a las las dos dos aplic aplicac acio ione nes s que que van a intercambiar datos. Es concretamente el DataObjet
El objeto DataObject es un contenedor contenedor de datos donde se pueden transportar 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 Text1_OLEStartDrag(Data As DataObject, AllowedEff ects As Long) Data.SetData Text1.T ext1 .Text, ext, vbCFT vbCF Text 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 meterle los datos sin necesidad necesidad de crearlo crearlo previamente. previamente. Este objeto es único único para para Windo Windows ws,, por lo que que a part partir ir de la ejec ejecuc ución ión de ese ese proc proced edimi imient ento o OLEStartDrag el texto introducido en Data está disponible para cualquier aplicación Windows que sepa recogerlo. introducir en el DataObject. En el ejemplo anterior, era el texto texto datos es el dato a introducir contenido en Text1 formato es un valor o constante que especifica el tipo de datos introducidos. Este argumento es opcional. Vea valores posibles en e n 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. 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 propi propieda edad d OLED OLEDro ropM pMode ode exis existe te este este código código para para poner poner el text texto o que lleva llevaba ba 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, RichTextLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single) RTB1.SelText RTB1.SelText = Data.GetData(vbCFT Data.GetD ata(vbCFText) ext) 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
Guia del Estudiante
Capitulo 5
vbCFRTF
-1 6 6 3 9
Formato de texto enriquecido (archivos .rtf)
Método Clear Elimina el contenido del objeto DataObject. Sintaxis
objeto. objeto.Clear
Puede Puede ejecutar ejecutar este método antes de introducir introducir nuevos datos datos en el DataObject DataObject para asegurar asegurarse se que ha borrado los datos ex istentes
Private Sub Text1_OLEStartDrag(Data Text1_OLEStartDrag(Data As DataObject, AllowedEff ects As Long) Data.Clear Data.SetData Data.Set Data Text1.Text ext1.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 u n error. error.
Método GetFormat Devuelve un valor booleano que indica si un elemento del objeto DataObject coincide con un formato especificado. Sintaxis
objeto. objeto.GetFormat formato
Ejem Ejempl plo o Puede uede aseg asegur urar arse se que que el el for forma mato to cont conten enid ido o en en el el Dat DataO aObj bjec ectt es es el el deseado antes de proceder a colocarlo en un control en la operación de Drop: Private Sub RTB1_OLEDragDrop(Data As RichTextLib.DataObject, 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 RTB1.SelText = Data.GetData(vbCFT Data.GetD ata(vbCFText) ext) End If End Sub
Propiedades del DataObject Deberíamos decir mejor, propiedad, ya que solamente tiene una:
Propiedad Files Devuelve Devuelve una colección 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 colección ón Files sólo sólo se pueb puebla la con con nomb nombrres de arch archiv ivo o cuan cuando do el obje objeto to 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 arrastre de una un a 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 procedi procedimien miento to OLEStar OLEStartDr tDrag ag donde donde debere deberemos mos colocar colocar el código código para para que VB haga haga lo que que nosotros queramos. Ya 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 procedimient procedimiento o 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 Esta propie propiedad dad va a determi determinar nar la forma forma en la que el compon component ente e desti destino no toma toma los datos datos transportados medainte OLE Drag & Drop. 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 vbOLEDropManual Manua 1 Manual. l. El compo componen nente te de destin destino o dese desenc ncade adena na los eventos eventos OLE de colocar colocar,, (Evento (Evento OLEDra OLEDragDr gDrop) op) lo que permite permite al programador programador controlar controlar la operación operación en el código.
LSB Visual Basic Página 24
-
Guia del Estudiante
Capitulo 5
vbOLEDropAutomatic 2 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 convencion convencional. al. Parece Parece normal, ya que no tenemos porque saber saber el nombre del control origen 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 Get Format.
Evento OLEStartDrag Se produce cuando se ejecuta el método OLEDrag de un componente o cuando un compon component ente e inicia inicia una opera operaci ción ón OLE de arra arrast stra rarr y coloc colocar ar,, y su propi propieda edad d 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 Text1_OLEStartDrag(Data As DataObject, AllowedEff ects As Long) Data.Clear Data.SetData Data.Set Data Text1.Text ext1.Text AllowedEffects = 1 End Sub El parámetro EfectosPermitidos va a determinar lo que ocurre con el dato en el control co ntrol origen. Acepta 3 valores: 0 1
vbDropEffectNone No se inicia el OLE Drag & Drop vbDropEffectCopy Los datos se copian copian en el destino y no se modifican en el
control origen. vbDropEffectMove Los 2 Los datos datos se colocan en el destino destino y desapar desaparecen ecen del control origen. Ocurre el efecto de mover los 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. 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. 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 ALT 1 = MAY, MAY, 2 = CTRL, CTRL, 4 = AL ALT. Si hay más de una tecla 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:
vbEnter vbLeave vbOver
0 1 2
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 permitir lo.
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) (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. 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. ocurrir.
Sintaxis Private Sub objeto_OLEGiveFeedback(efecto As Long, cursoresPredeterminados As Boolean) efecto
igual a los eventos anteriores.
CursoresPredeterminados Valor alor boolea booleano no que determi determina na si Visua Visuall Basic Basic utiliza utiliza el cursor 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 permite exportar texto texto a / desde Word, y eso le vienen muy bien al usuario usuario porque le ahorra tiempo de teclear 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 realizar un arrastre arrastre con el ratón es una operación 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 pued pueden en vers verse e dist distin into tos s nomb nombrres. es. La Bar Barra de Menú Menú es un comp compon onen ente te de un Formulario. La Barra de Menú puede tener tantas palabras como se desee, y sobre cada palabra, puede desplegarse desplegarse un Menú desplegable con mas palabras. palabras. Sobre cada una de estas puede puede a su vez desplegar desplegarse se otro otro conjunto conjunto de palabra palabras, s, etc. etc. con lo que se puede 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á 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 figura el Menú está sin desplegar desplegar. En la segunda figura puede verse verse un árbol de Menú largo, largo, desplegado desplegado en su totalidad. En la tercera tercera puede verse el Menú Menú desplegable desplegable de la palabra Archivo Archivo de la Barra de Menú. Puede Puede apreciarse apreciarse en este menú desplegabl desplegable e una línea que separa separa las palabras palabras Guardar Guardar Como y SALIR. 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á aparecerá el siguiente cuadro. (En principio vacío) LSB Visual Basic Página 30
-
Guia del Estudiante
Capitulo 5
Cada palabra palabra del menú tiene tiene su Caption (La palabra palabra que aparece aparece en el menú), 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 las casi casilla llas s al efec efecto to del del cuadr cuadro o del del edit editor or de menús menús.. Para ara coloc colocar ar el curs cursor or 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. Habilitado. Si se quita la marca de esa casilla, esa palabra palabra aparecerá 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 Como su nombr nombre e indic indica, a, que sea sea visib visible le o no lo sea. sea. Puede Puede cambiarse en tiempo de ejecución.
Indica ca si esa esa palab palabra ra es la que que va a mostr mostrar ar todos los formul formular arios ios WindowList Indi abiertos abiertos en una aplicación aplicación de documentos múltiples múltiples (MDI). (MDI). Al hacer click click sobre sobre esta palabra, se desplegará un submenú con todos los Caption de los Formularios hijo abiertos abiertos en ese momento. Solamente 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. 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 palabra se refie refiere re.. La solución solución puede ser ser cualqui cualquiera era.. El autor autor de estos estos apuntes apuntes propone poner las letras mnu (o menu - recomiendo recomiendo no usar acentos e los Names de VB), seguido del Caption de esa palabra.
Otras propiedades Shortcut
Atajo Atajo.. Esta Esta propie propiedad dad admite admite varias varias combinac combinacione iones s de teclas teclas para 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 (Véase figura siguiente, 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 ejec ejecuc ución ión.. Pued Puede e tene tenerr los valor valores es 0 (Pr (Predet edeter ermin minad ado) o) Ningu Ninguno no.. El menú 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. Medio. El menú se muestra en medio medio de la barra de menús cuando cuando el objeto está activo. 3 Derecha. Derecha. El menú se muestra muestra a la derecha derecha de la barra de menús cuando cuando el objeto está activo. El menú editado con los datos de la figura anterior tendrá esta forma en tiempo de ejecución :
Obser Observe ve que que tiene tiene cuat cuatro ro palab palabra ras s en la línea línea supe superio rior, r, y que “colg “colgand ando” o” 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é, &Archiv &Archivo) o) están complet completamen amente te a la izquierd izquierda a de la ventana, 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 forma perman permanent ente. e. Las que están están separa separadas das (tabula (tabuladas das)) corre correspond sponden en a las que aparecerá aparecerán n en los menús desplegables. desplegables. Como es lógico, un menú desplegable 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 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 Podemos hacer varios niveles de submenús a base de introducir introducir varias tabulaciones. 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 tecla Alt + la tecla correspondiente a la letra que está detrás del carácter &. &. Justamente la letra letra que está subrayada en la palabra del menú. El carácter carácter & no tiene porqué ir precisament precisamente e al comienzo de la palabra. 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 Guardar Como y S ALIR. ALIR. Esta línea, línea, que solamente tiene efectos efectos estéticos, estéticos, se logra introduciendo introduciendo como como Caption un guión ( - ). El editor de de menús solamente solamente le permit permite e el guión en una palabra de menú desplegable (Tabulada). No se olvide de poner el Name incluso para este guión.
NOTA MUY IMPORT IMP ORTANTE ANTE Siempre se recomienda recomienda poner la orden de SALIR en la primera 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 línea separ separad adora ora.. (Vea (Vea The Windo Windows ws Inte Interf rfac ace e Guidel Guideline ines s for Softw Softwar are e Desig Design, n, 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. Pegar. Para crear un menú emergente o PopUpMenu es necesario tener en el menú de ese formulario 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 palabra Edición, Edición, de la que se despleg desplegaba aba el Submenú Submenú Copiar, Copiar, Cortar Cortar y Pegar Pegar.. Si analizamos la edición realizada, las palabras tenían el siguiente Caption y Name :
Caption
Name
Tabulada
Edición Copiar Cortar Pegar
mnuEdicion mnuCopiar mnuCortar mnuPegar
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 nombre del formular formulario io donde donde presen presentam tamos os el PopUpM PopUpMenu enu.. Puede omitirse. Nombremenú. 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. Indics. Parámetro opcional. Un valor o constante que especifica la posición y el comportamiento del menú emergente, como se describe a continuación : Constante (posición)
Valor
Descripción
vbP vbPopupMenuLeftA ftAlign
0
vbP vbPopup opupM MenuC enuCen entterAl erAlig ign n 4 vbP vbPopupMenuRig RightAlign 8
(Predetermi rminado) El lado izq izquie uierdo del men menú se se sitúa en x. El menú enú emer emerg gent ente se cent centra ra en x. El la lado derecho del me menú se se sitúa en x.
Constante (comportamiento)
Valor
Descripción
vbPopupMenuLeftButton
0
(Predeterminado) Los elementos del menú emergente sólo reaccionan a los clic del mouse cuando se use el botón primario del mouse.
LSB Visual Basic Página 34
-
Guia del Estudiante
Capitulo 5
vbPopupMenuRightButton
2
Los elementos del me menú em emergente reaccionan a los clic del m ouse cuando se usen los botones primario o secundario.
Para combinar la los valores de indics de posición y comportamiento basta con sumar los va lores. 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 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 def inen mediante la propiedad ScaleMode. negrita. 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. Nota. Este argumento funciona solamente en las aplicaciones que se ejecuten bajo Windows 95. La aplicación aplicación ignora este argumento argumento cuando se ejecute ejecute bajo versiones 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. Button=2. Imaginemos Imaginemos que queremos presenta presentarr en un menú emergente las palabras palabras Cortar, Cortar, Copiar y Pegar del ejemplo anterior, que colgaban en el menú de la palabra Edición. (Vea mas atrás) atrás).. Querem Queremos os también también que la palabr palabra a Copiar Copiar salga salga resal resaltad tada a en negrita. negrita. Iríamos Iríamos al procedimiento MouseUp del Formulario y escribiríamos : Private Sub Form_MouseUp(Button As Integer, Integer, Shift As Integer, X As Single, Y As Single) If Button = 2 Then PopupMenu mnuEdicion, , , , mnuCopiar End If End Sub Observe Observe que se ha omitido omitido el nombre nombre del Formula Formulario rio (Opcion (Opcional), al), el parámet parámetro ro 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 querem queremos os presen presentar tar un menú menú emerge emergente nte es necesa necesario rio tener ese menú en el menú del formular formulario. io. El problem problema a puede puede ser que no queramo queramos s que esté esté en la barra barra de menú. 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 para hacer hacer menús menús emergen emergentes tes con mas o menos menos elemen elementos tos,, según según las necesida necesidades des de su aplicación. También También puede poner la propiedad Enabled a False 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