8. 1.- UTILIZACIÓN DEL PORTAPAPELES.
El portapapeles de Windows permite intercambiar información, tanto textos como gráficos, entre las aplicaciones Windows. Visual Basic dispone de un objeto global, llamado Clipboard, mediante el cual, se podrá acceder al portapapeles de Windows. Para vaciar el contenido del portapapeles, se utilizará el método Clear.
Clipboard.Clear
Las órdenes que permiten copiar texto al portapapeles y; pegar texto del portapapeles son, respectivamente:
Clipboard.SetText origen
destino = Clipboard.GetText()
Si se desea copiar una imagen gráfica al portapapeles, se utilizará el método SetData facilitando como parámetro el gráfico a copiar. Si se desea recuperar una imagen, el método utilizado será GetData. Antes de recuperar la información, se debe conocer el tipo de imagen almacenada y, lo mismo para transferir imágenes al portapapeles. Si se necesita conocer el tipo de datos almacenado en el portapapeles, se utilizará el método GetFormat que devolverá True o False según el portapapeles tenga o no el tipo de información que se indica.
Clipboard.GetFormat(Formato%)
Clipboard.GetData(Formato%)
Clipboard.SetData(Formato%)
EJEMPLOS:
|
OBJETO |
PROPIEDAD |
VALOR |
|
Label1 |
Caption |
Texto |
|
Label2 |
Caption |
lblImagen |
|
Text1 |
Text |
(Nada) |
|
Multiline |
True |
|
|
ScrollBars |
2 - Vertical |
|
|
Picture1 |
Name |
Picture1 |
|
Command1 |
Caption |
Copiar Texto |
|
Name |
cmdCopiarTexto |
|
|
Command2 |
Caption |
Obtener Texto |
|
Name |
cmdObtenerTexto |
|
|
Command3 |
Caption |
Copiar Imagen |
|
Name |
cmdCopiarImagen |
|
|
Command4 |
Caption |
Obtener Imagen |
|
Name |
cmdObtenerImagen |
Private Sub cmdCopiarTexto_Click ()
If Text1.Text = "" Then
MsgBox "No hay texto que copiar"
Else
Clipboard.Clear
Clipboard.SetText Text1.Text
End If
End Sub
Private Sub cmdObtenerTexto_Click ()
If Clipboard.GetFormat(1) Then 'Texto
Text1.Text = Clipboard.GetText()
Else
MsgBox "No hay texto en el portapales"
End If
End Sub
Private Sub cmdCopiarImagen_Click ()
Clipboard.Clear 'Como mapa de bits
Clipboard.SetData Picture1.Picture, 2
End Sub
Private Sub cmdObtenerImagen_Click ()
If Clipboard.GetFormat(1) Then 'Texto
MsgBox "Solo hay texto en el portapales"
ElseIf Clipboard.GetFormat(2) Then 'Archivo BMP
Picture1.Picture = Clipboard.GetData(2)
ElseIf Clipboard.GetFormat(3) Then 'Archivo WMF
Picture1.Picture = Clipboard.GetData(3)
ElseIf Clipboard.GetFormat(8) Then 'Archivo DIB
Picture1.Picture = Clipboard.GetData(8)
Else
MsgBox "La imagen del portapapeles no es reconoible"
End If
End Sub
|
OBJETO |
PROPIEDAD |
VALOR |
|
Label1 |
Caption |
(Nada) |
|
Name |
lblTexto |
|
|
Picture1 |
Name |
picGrafico |
|
Command1 |
Caption |
Prueba |
|
Name |
cmdPrueba |
|
|
Command2 |
Caption |
Limpiar |
|
Name |
cmdLimpiar |
|
|
Command3 |
Caption |
Actualizar |
|
Name |
cmdActualizar |
|
|
Command4 |
Caption |
Cerrar |
|
Name |
cmdCerrar |
|
|
Label2 |
Caption |
Cualquier Texto |
|
Name |
lblTextoPrueba |
|
|
Visible |
False |
|
|
Image1 |
Name |
imgPrueba |
|
Picture |
Cualquier gráfico |
|
|
Visible |
False |
Private Sub cmdActualizar_Click ()
‘Comprobar el contenido del portapapeles
If Clipboard.GetFormat(vbCFText) Then ‘Hay texto en el portapapeles
lblTexto = Clipboard.GetText
Else
lblTexto = ""
End If
If Clipboard.GetFormat(vbCFBitmap) Or Clipboard.GetFormat(vbCFMetafile)Then
‘Hay un gráfico en el portapapeles
picGrafico = Clipboard.GetData
Else
picGrafico = LoadPicture
End If
End Sub
Pivate Sub cmdLimpiar_Click()
Clipboard.Clear
cmdActualizar_Click
End Sub
Private Sub cmdPrueba_Click()
‘Copiar en el portapapeles un texto y una imagen de prueba
Clipboard.SetText lblTextoPrueba
Clipboard.SetData imgPrueba
cmdActualizar_Click
End Sub
8. 2.- ENLACES DINÁMICOS Y COMUNICACIONES DDE.
DDE es un mecanismo soportado por Windows que permite a dos aplicaciones mantener una conversación durante la cual, la información es intercambiada automáticamente. DDE automatiza el cortar y pegar información entre aplicaciones Windows. La forma en la que trabaja DDE consiste en que una aplicación Windows llamada destino (cliente en versiones anteriores), que es la aplicación que inicia la conversación DDE, le dice a otra aplicación Windows, llamada fuente (servidor en versiones anteriores), que quiere información, es decir, que quiere establecer una conversación DDE o un enlace DDE. Una aplicación puede mantener varias conversaciones DDE al mismo tiempo. En Visual Basic los formularios pueden ser fuentes DDE o destinos DDE cambiando su propiedad LinkMode a vbLinkNone o vbLinkSource. Las cajas de texto, las de figuras (picture box) y las etiquetas, pueden ser destinos DDE. Normalmente, la información fluye de la fuente al destino. Es necesario conocer el nombre de la aplicación origen a la que se va a llamar. A continuación, se necesita conocer el tema de la conversación DDE, que suele ser una unidad de información que reconoce la fuente. Con la aplicación y el tema, se identifica una conversación. Y, por último, queda establecer el elemento de conversación DDE o pieza de información que se va a pasar en la conversación, significativa para ambas aplicaciones.
Cada aplicación que puede actuar de fuente DDE tiene un nombre único. Normalmente es el nombre del fichero ejecutable sin la extensión. Antes de poder establecer una conversación DDE, es necesario que las dos aplicaciones se estén ejecutando.
Se pueden tener tres clases de conversaciones DDE. Enlace Automático (vbLinkAutomatic) significa que la fuente envía la información al destino, siempre que cambie el dato en la aplicación fuente. Este tipo de enlace transcurre en tiempo real. Enlace Manual (vbLinkManual) significa que la fuente envía información cuando el destino la solicita, cuando hay demanda. Enlace de Notificación (vbLinkNotify) es aquel en el que la fuente le dice al destino que el dato ha cambiado, pero no se envía hasta que el destino lo solicite.
Cada vez que la fuente DDE actualiza la información de un control de Visual Basic que actúa como destino DDE, se genera el evento Change.
Las propiedades importantes en una conversación DDE son:
LinkTopic (tema del enlace)
El valor de esta propiedad tiene siempre el formato: Aplicación|Tema, donde Aplicación es el nombre de la aplicación fuente y Tema es la información empleada en la conversación. Normalmente, es el nombre de un archivo, incluyendo su ruta.
LinkItem (elemento del enlace)
El valor de esta propiedad identifica el dato que realmente se va a pasar desde la fuente al destino, un registro, una hoja de cálculo, una celda, un marcador en Word, etc.
LinkMode (modo del enlace)
Modo de establecer la conversación DDE. Puede ser vbLinkNone, vbLinkAutomatic, vbLinkManual y vbLinkNotify.
LinkTimeout (tiempo sin enlazar)
Indica cuánto tiempo tiene que tratar Visual Basic de establecer el enlace o lo que es lo mismo, el tiempo que debe esperar respuesta a una conversación. El valor por omisión es 50 décimas de segundos (5 seg.). Si no se puede establecer la conversación, se produce un error.
CREAR ENLACES DDE DURANTE EL DISEÑO (UTILIZACIÓN DEL PORTAPAPELES)
Los enlaces creados en tiempo de diseño, son enlaces automáticos, ya que son reestablecidos al ejecutar la aplicación. Para explicar este apartado, utilizaremos Excel. Crearemos un formulario con una etiqueta y una caja de texto. A continuación, se arrancará Excel y, estableceremos un enlace automático con Excel como fuente DDE, siendo el contenido de la celda A1 el tema de conversación DDE. Los pasos a seguir son:
Si ahora se accede a la ventana de Excel y, se introduce un valor en la celda A1, el valor aparecerá en la caja de texto de Visual Basic.
LOS SUCESOS DDE
Los sucesos de enlace que se pueden generar son: LinkOpen (abrir enlace) se genera cuando se crea un enlace DDE. LinkClose (cerrar enlace) se genera cuando se termina un enlace DDE. LinkError (error en el enlace) se genera cuando sucede un error en una conversación DDE y no se está ejecutando código Visual Basic. LinkNotify (notificación de enlace) se genera cuando la propiedad LinkMode está establecida a 3 - Notify y se actualiza la información en la fuente. LinkExecute (ejecutar) ocurre en la aplicación fuente cuando el destino de la conversación envía un comando para se ejecutado por la fuente DDE.
LOS MÉTODOS DDE
Los métodos de enlace que se pueden utilizar con los controles Visual Basic que estén actuando como destinos en un enlace DDE, son:
LinkPoke (introducir)
Es la única forma que tiene un destino DDE de enviar datos a la fuente. Se puede usar para transferir el contenido de un control destino DDE a la fuente. La sintaxis es:
NombreControl.LinkPoke
LinkRequest (petición)
Se emplea para pedir a la fuente DDE que envíe la información al control, que la actualice. Solo es necesario si se ha puesto la propiedad LinkMode a 2. Su sintaxis es:
NombreControl.LinkRequest
LinkSend (enviar)
Se emplea cuando se tiene un formulario como fuente DDE y se quiere enviar el contenido de una caja de figuras a la aplicación destino. La sintaxis es:
NombreCajaFiguras.LinkSend
CREAR ENLACES DDE MEDIANTE CÓDIGO
NOTA: Los ejemplos funcionan con Visual Basic 4.0 y con Office 97.
Supongamos que queremos establecer un enlace automático DDE con una hoja de cálculo Excel 97 (debe estar ejecutándose). Se debe permitir al usuario que proporcione la ruta completa de la hoja de cálculo, así como la fila y la columna a la que se quiere acceder. El formulario estará compuesto por 3 etiquetas, 3 cajas de texto y un botón de comando. En la primera caja de texto se escribirá la fila a explorar, en la 2ª, la columna y, en la 3ª aparecerá el contenido de la celda.
Sub Command1_Click ()
On Error GoTo GestorDeErrores
Text3.LinkMode = vbLinkNone
Tema$ = "Excel|C:\[Prueba.xls] Hoja1"
Text3.LinkTopic = Tema$
Elemento$ = "F" + LTrim$(RTrim$(Text1.Text))
Elemento$ = Elemento$ + "C" + LTrim$(RTrim$(Text2.Text))
Text3.LinkItem = Elemento$
Text3.LinkMode = vbLinkAutomatic
Salir:
Exit Sub
GestorDeErrores:
MsgBox Err.Description
Resume Salir
End Sub
EJEMPLOS:
|
CONTROL |
PROPIEDAD |
VALOR |
|
Form |
Caption |
Fuente |
|
Name |
frmFuente |
|
|
BorderStyle |
3 - Fixed Dialog |
|
|
LinkMode |
1 - Source |
|
|
LinkTopic |
frmFuente |
|
|
Text Box |
Text |
(Ninguno) |
|
Name |
txtCaja |
|
|
MultiLine |
True |
|
|
ScrollBars |
2 - Vertical |
Private Sub Form_Load()
Dim Título As String
If App.PrevInstance Then ‘Evitar que se ejecute dos veces la aplicación
Título = App.Title
App.Title = "... instancia duplicada."
FrmPrincipal.Caption = "... instancia duplicada."
AppActivate Título ‘Activa la aplicación
SendKeys "% R", True ‘Envía pulsaciones de las teclas ALT+R a la ventana activa
End
End If
End Sub
Crearemos un nuevo proyecto Destino.vbp, formado por:
|
CONTROL |
PROPIEDAD |
VALOR |
|
Form |
Caption |
Destino |
|
Name |
frmDestino |
|
|
BorderStyle |
3 - Fixed Dialog |
|
|
LinkTopic |
frmDestino |
|
|
Text Box |
Text |
(Ninguno) |
|
Name |
txtDestino |
|
|
MultiLine |
True |
|
|
ScrollBars |
2 - Vertical |
|
|
Frame |
Caption |
Tipo de Enlace |
|
Option Button |
Caption |
Enlace Automático |
|
Name |
optAutomatico |
|
|
Option Button |
Caption |
Enlace Manual |
|
Name |
optManual |
|
|
Option Button |
Caption |
Enlace Notificación |
|
Name |
optNotificacion |
|
|
Command Button |
Caption |
Poke |
|
Name |
cmdPoke |
|
|
Command Button |
Caption |
Request |
|
Name |
cmdRequest |
Private Sub optAutomatico_Click()
cmdPoke.Visible = True
cmdRequest.Visible = False
txtDestino.LinkMode = vbLinkNone
txtDestino.LinkMode = vbLinkAutomatic
End Sub
Private Sub optManual_Click()
cmdPoke.Visible = True
cmdRequest.Visible = True
txtDestino.LinkMode = vbLinkNone
txtDestino.LinkMode = vbLinkManual
End Sub
Private Sub optNotificacion_Click()
cmdPoke.Visible = False
cmdRequest.Visible = True
cmdRequest.Enabled = False
txtDestino.LinkMode = vbLinkNone
txtDestino.LinkMode = vbLinkNotify
End Sub
Private Sub txtDestination_LinkNotify()
Beep
MsgBox "¡Atención: Tienes un mensaje!"
Beep
cmdRequest.Enabled = True
End Sub
Private Sub Form_Load()
Dim I As Long
I = Shell("C:\TRABAJOS\FUENTE.EXE", vbNormalFocus)
I = DoEvents()
txtDestino.LinkMode = vbLinkNone ‘Limpiar el enlace DDE si existe
txtDestino.LinkTopic = "Fuente|frmFuente"
txtDestino.LinkItem = "txtCaja"
txtDestino.LinkMode = vbLinkManual ‘Establecer enlace
optManual.Value = True
End Sub
Private Sub cmdPoke_Click()
txtDestino.LinkPoke
End Sub
Private Sub cmdRequest_Click()
txtDestino.LinkRequest
End Sub
|
CONTROL |
PROPIEDAD |
VALOR |
|
Text1 |
Text |
(Nada) |
|
Name |
txtCelda |
|
|
ReadOnly |
True |
|
|
Text2 |
Text |
(Nada) |
|
Name |
txtContenido |
|
|
ReadOnly |
True |
|
|
4 controles Image |
Name |
imgMovimiento |
|
Index |
0, 1, 2, 3 |
|
|
Picture |
ARW01DN.ICO, ARW01LT.ICO, ARW01RT.ICO, ARW01UP.ICO |
|
|
Command1 |
Caption |
[=] |
|
Name |
cmdActualizar |
|
|
Default |
True |
Const Abajo = 0
Const Izquierda = 1
Const Derecha = 2
Const Arriba = 3
Dim Columna As Integer, Fila As Integer
Private Sub cmdActualizar_Click ()
txtContenido.LinkRequest ‘Solicitar a Excel una actualización
End Sub
Private Sub txtContenido_LinkClose()
MsgBox "Se va a cerrar el enlace DDE"
End Sub
Private Sub txtContenido_LinkNotify()
txtContenido.LinkRequest ‘Actualizar el contenido
End Sub
Private Sub txtContenido_LinkOpen(Cancel As Integer)
MsgBox "Se va a establecer un enlace DDE"
End Sub
Private Sub Form_Load()
Columna = 1
Fila = 1
On Error Resume Next
‘Establecer la información necesaria para establecer un enlace
txtContenido.LinkTopic = "Excel|Hoja1"
txtContenido.LinkItem = "F1C1"
txtContenido.LinkMode = vbLinkNotify
If Err = 282 Then ‘Si la aplicación no ha respondido
Err.Clear
Shell "Excel" ‘Cargar la aplicación
txtContenido.LinkMode = vbLinkNotify ‘Intentar el enlace
End If
If Err Then ‘Si ha habido un error
MsgBox "Se ha producido el error : " & Err.Description
End
End If
txtCelda = Fila & "," & Columna
On Error GoTo 0
End Sub
Private Sub Form_Unload(Cancel As Integer)
txtContenido.LinkMode = vbLinkNone
End Sub
Private Sub imgMovimiento_Click(Index As Integer)
Select Case Index
Case Derecha
Columna = Columna + 1
Case Izquierda
Columna = Columna - 1
Case Arriba
Fila = Fila - 1
Case Abajo
Fila = Fila + 1
End Select
txtCelda = Fila & "," & Columna
txtContenido.LinkItem = "F" & Fila & "C" & Columna ‘Actualizar el enlace
End Sub
|
CONTROL |
PROPIEDAD |
VALOR |
|
Formulario |
Caption |
Cálculo de Préstamos |
|
LinkMode |
1-Source |
|
|
LinkTopic |
frmCalculoPrestamos |
|
|
Name |
frmCalculoPrestamos |
|
|
Text1 |
Text |
(Nada) |
|
Name |
txtCapital |
|
|
Text2 |
Text |
(Nada) |
|
Name |
txtTipo |
|
|
Text3 |
Text |
(Nada) |
|
Name |
txtAños |
|
|
Text4 |
Text |
(Nada) |
|
ReadOnly |
True |
|
|
TabStop |
False |
|
|
BorderStyle |
0-None |
|
|
Name |
txtPlazo |
|
|
Text5 |
Text |
(Nada) |
|
ReadOnly |
True |
|
|
TabStop |
False |
|
|
BorderStyle |
0-None |
|
|
Name |
txtPrincipal |
|
|
ListBox1 |
Name |
lstListaDatos |
|
Command1 |
Caption |
Calcular |
|
Name |
cmdCalcular |
|
|
Default |
True |
Private Sub cmdCalcular_Click()
Dim nPlazos As Integer, I As Integer
nPlazos = txtAños * 12 ‘Obtener el número de meses
lstListaDatos.Clear
‘Añadir cabecera
lstListaDatos.AddItem "Plazo" & Chr(9) & "Principal" & Chr(9) & "Interés" & Chr(9)
For I = 1 To nPlazos
‘Recorrer los meses añadiendo el principal y los intereses mensuales
lstListaDatos.AddItem I & Chr(9) & Abs(CLng(PPmt(txtTipo / 100 / 12, I, nPlazos _
txtCapital))) & Chr(9) & Abs(CLng(IPmt(txtTipo / 100 / 12, I, nPlazos _
txtCapital)))
Next I
End sub
Private Sub lstListaDatos_Click() ‘Al pulsar sobre un dato de la lista
If lstListaDatos.ListIndex <> 0 Then ‘Se ha elegido una fila de datos
txtPlazo = lstListaDatos.ListIndex
‘Mostra los datos correspondientes a la fila
txtPrincipal = Abs(CLng(PPmt(txtTipo / 100 / 12, lstListaDatos.ListIndex, _
txtAños * 12, txtCapital)))
txtInteres = Abs(CLng(IPmt(txtTipo / 100 / 12, lstListaDatos.ListIndex, _
txtAños * 12, txtCapital)))
End If
End sub
Private Sub Form_LinkExecute(CmdStr As String, Cancel As Integer)
‘La aplicación destino envia un comando que puede ser
‘Activa n para activar el elemento n de la lista, o
‘Calcula, que realizará los cálculos
If Left(UCase(CmdStr), 6) = "ACTIVA" Then
Dim I As Integer
I = Mid(CmdStr, 8) ‘Tomar el número de plazo a activar
If I > 0 And I <= txtAños * 12 Then ‘El plazo existe
lstListaDatos.ListIndex = I ‘Activarlo
Cancel = False ‘e indicar que el comando se ha ejecutado
End If
End If
If UCase(CmdStr) = "CALCULA" Then
cmdCalcular_Click
Cancel = False ‘Indicar que el comando se ha ejecutado
End If
End Sub
Private Sub cmdCalcular_Click()
‘Establecer conversación DDE fijando como elemento de datos, el control txtCapital
txtDatoDDE.LinnkTopic = "CALCULAP|frmCalculoPrestamos"
txtDatoDDE.LinkItem = "txtCapital"
On Error Resume Next
txtDatoDDE.LinkMode = vbLinkAutomatic ‘Intentar establecer conversación
If Err Then
Shell "CALCULAP"
Err.Clear
txtDatoDDE. LinkMode = vbLinkAutomatic
If Err Then
MsgBox "No es posible establecer enlace"
On Error GoTo 0
Exit Sub
End If
End If
On Error GoTo 0
txtDatoDDE = txtCapital ‘Tomar el capital tecleado
txtDatoDDE.LinkPoke ‘Enviarlo a CalculaP
‘Repetir el proceso con el tipo y los años
txtDatoDDE.LinkItem = "txtTipo"
txtDatoDDE.LinkPoke
txtDatoDDE.LinkItem = "txtAños"
txtDatoDDE.LinkPoke
txtDatoDDE.LinkExecute = "Calcula" ‘Pedir a CalculaP que realice los cálculos
txtDatoDDE.LinkExecute = "Activa 1" ‘Y que seleccione el primer palzo
‘tomar el principal e interés del primer plazo para obtener la cuota mensual
Dim Intereses As Long, Principal As Long
txtDatoDDE.LinkItem = "txtPrincipal"
Principal = txtDatoDDE
txtDatoDDE.LinkItem = "txtInteres"
Intereses = txtDatoDDE
txtCuotaMensual = Principal + Intereses ‘Calcular y mostrar la cuota mensual
‘Poner a 0 los dos controles de comparación de préstamos
txtInteresesTotales = 0
txtTotalPagado = 0
Dim I as Integer
For I = 1 To txtAños * 12
txtDatoDDE.LinkExecute = "Activa " & I ‘Pedir a CalculaP que active el plazo I
txtDatoDDE.LinkItem = "txtPrincipal" ‘Tomar el principal
txtTotalPagado = txtTotalPagado + CLng(txtDatoDDE) ‘y sumarlo
txtDatoDDE.LinkItem = "txtInteres"
txtTotalPagado = txtTotalPagado + CLng(txtDatoDDE)
txtInteresesTotales = txtInteresesTotales + CLng(txtDatoDDE)
Next
txtDatoDDE.LinkMode = vbLinkNone ‘terminar la conversación
End Sub
Private Sub cmdCrearEnlace_Click()
Text1.LinkMode = vbLinkNone ‘Liberar enlace
Text.LinkTopic = "Winword|Prueba.doc"
Text1.LinkItem = "DDE" ‘Nombre del marcador
Text1.LinkMode = vbLinkAutomatic
End Sub
8. 3.- INCRUSTACIÓN Y COMUNICACIÓN ENTRE APLICACIONES. OLE2.
OLE es una técnica de comunicación entre aplicaciones Windows que hace posible la creación de documentos (destino) compuestos con datos procedentes de una variedad de fuentes. Por tanto, permite la cooperación entre aplicaciones Windows, p.e. usar el corrector de Word desde Visual Basic. La tecnología OLE presenta en forma de objetos varias prestaciones clave del sistema operativo, como la gestión de ficheros, asignación de memoria y la transferencia de datos. Para acceder a estas prestaciones, el usuario debe conocer totalmente las interfaces (conjunto de funciones relacionadas semánticamente con un objeto, accesibles públicamente para el usuario) que soporta cada objeto.
TERMINOLOGÍA OLE
OBJETO OLE. Es cualquier dato con el que un control OLE pueda trabajar. Unidad de datos suministrada por una aplicación Windows que soporta OLE. Puede ser texto, hojas de cálculo, celdas de una hoja de cálculo, gráficos,... Un control OLE puede contener solo un objeto cada vez.
CLASE OLE Es la aplicación que produce el objeto OLE. Toda aplicación que soporta OLE, tiene un único nombre de clase OLE.
APLICACIÓN CLIENTE O APLICACIÓN CONTENEDORA. Contiene el objeto creado por otra aplicación (el objeto OLE).
SERVIDOR OLE. Es la aplicación original que ha permitido crear el objeto OLE. A veces se llama Aplicación Fuente.
OBJETO VINCULADO. Los datos de un objeto pueden ser vinculados a una aplicación, es decir, pueden ser añadidos de forma que cuando se modifique el objeto original, se actualizará en todas las aplicaciones en las que haya sido vinculado ya que sólo existe la copia original de los datos. A este tipo de objeto también se le suele llamar Enlazado. Un enlace ocupa menos espacio, pero tiene la desventaja de la potencial pérdida del enlace. Por tanto, solo se mantiene una referencia al objeto.
OBJETO INCRUSTADO. Los datos de un objeto pueden incrustarse en una aplicación, de forma que si cambian en la fuente, el destino no sufrirá ningún cambio. En este caso, cada aplicación tiene una copia de los datos, independiente del original.
Algunas propiedades del control OLE son: DisplayType (tipo de presentación) permite mostrar la infomación como un icono. SizeMode (modo de tamaño) permite cambiar la forma en que aparecerán los datos durante la ejecución. Si su valor es 0 (vbOLESizeClip), se recortarán los datos. Si se quieren estirar los datos para que ocupen el tamaño actual del control OLE, el valor será 1 (vbOLESizeStretch). Si se quiere que el control modifique automáticamente de tamaño, el valor será 2 (vbOLESizeAutoSize). El valor 3 (vbOLESizeZoom) permite que el objeto cambie de tamaño para rellenar el control contenedor OLE tanto como fuera posible manteniendo las proporciones. Class, especifica la aplicación que contiene los datos, para un objeto incrustado. OleType devuelve el estado del objeto (vinculado o incrustado). SourceDoc (documento fuente) proporciona el nombre del objeto enlazado o el archivo a emplear para los objetos incrustados. SourceItem (elemento fuente) se emplea en los objetos enlazados para especificar qué parte del documento enlazado puede trabajar con la aplicación en Visual Basic. Action (acción) especifica qué se quiere hacer exactamente con el objeto OLE. El control OLE opera de manera similar al control CommonDialog, en tanto a que la asignación de ciertos valores a esta propiedad produce que se ejecuten las operaciones asociadas. Se recomienda utilizar los métodos equivalentes, p.e. CreateLink, CreateEmbed, etc.
EJEMPLO: Crear un objeto durante el diseño
Nota.- Cuando se añade a un formulario un control OLE, aparecerá el cuadro de diálogo Insertar Objeto. Este cuadro proporciona los nombres de todas las aplicaciones Windows a las que se puede conectar. Si se desea establecer las propiedades durante la ejecución, se deberá pulsar el botón de Cancel.
1.- Crearemos un nuevo proyecto al que se añadirá un control OLE al formulario. En la caja de diálogo Insertar Objeto, seleccionaremos como tipo de datos a incluir, "Hoja de cálculo de Microsoft Excel". A continuación, si se ejecutara la aplicación y se hiciera doble clic sobre el objeto OLE, Excel se arrancaría para poder realizar las modificaciones pertinentes.
Para que al hacer doble clic sobre un objeto contenedor OLE, aparezca el menú de la aplicación Visual Basic, es necesario definirlo en tiempo de diseño y establecer el valor de la propiedad NegotiatePosition del menú, a la opción adecuada.
EJEMPLO: Crear un objeto durante la ejecución.
Se necesita escribir el código utilizando las propiedades del control OLE. Si se quiere crear un objeto enlazado, se deberá establecer la propiedad SourceDoc con el nombre del archivo y la propiedad Action con CreateLink. Si se quiere crear un objeto incrustado, se deberá establecer la propiedad Class para determinar el objeto a emplear, la propiedad SourceDoc con el nombre del archivo y la propiedad Action con CreateEmbed.
TRABAJANDO CON FICHEROS
Cuando se cierra una aplicación que incluye un objeto OLE, los datos se pierden. Para solucionar este problema, se podrá utilizar la propiedad Action tanto para guardar los datos como para recuperarlos. Para guardar los datos se seguirán los pasos:
Para recuperar los datos de un fichero, los pasos a seguir son:
VERBOS DE UN OBJETO
Cuando la propiedad AutoVerbMenu tiene un valor True, permite, durante la ejecución, hacer clic con el botón derecho sobre el control OLE y, mostrar un menú con las acciones posibles a ejecutar sobre dicho objeto. Estas acciones reciben el nombre de Verbos. Cada objeto soporta su propia conjunto de verbos y, se utilizarán las propiedades ObjectVerbs y ObjectVerbsCount para acceder al conjunto de verbos soportados por un objeto. Este conjunto depende del estado del objeto, por lo que antes de mostrar la lista de verbos, habrá que actualizarla, utilizando el método FetchVerbs del objeto OLE. Cuando la propiedad AutoVerbMenu tiene el valor True, la lista es actualizada automáticamente antes de visualizar el menú contextual.
Cuando se activa un objeto, automáticamente se ejecuta una acción sobre dicho objeto utilizando el valor por defecto de la propiedad Verb. Para especificar el primer verbo de l conjunto de verbos de un objeto, se asignará a la propiedad Verb el valor 1, para el segundo el valor 2, ... Para utilizar un verbo se utilizará el método DoVerb.
AUTOMATIZACIÓN DE OLE
La Automatización es la tecnología clave de OLE 2.0. Esta técnica permite que cualquier objeto exponga un conjunto de órdenes y de funciones que puedan ser utilizadas en el código de otra aplicación. Ésto permite manipular objetos de otras aplicaciones sin tener que crear un objeto vinculado o incrustado. Cuando una aplicación soporta la automatización, los objetos expuestos por ella pueden ser accedidos por Visual Basic utilizando propiedades y métodos relacionados con esos objetos. Para saber qué métodos y propiedades soporta un objeto, hay que recurrir a la documentación de la aplicación que lo creó o, a través del examinador de objetos de Visual Basic (Ver/Examinador de Objetos). Para utilizar la automatización no sirven los contenedores OLE.
Para acceder a un objeto OLE de otra aplicación sin tener que crear un objeto enlazado o incluido, hay que utilizar la función CreateObject, con la sintaxis:
Set VariableObjeto = CreateObject("Aplicación.Objeto")
donde VariableObjeto es una variable de tipo Object utilizada para referenciar al objeto creado y, Aplicación es la aplicación que produce el objeto y, Objeto es el objeto producido por la aplicación (Aplicación.Objeto = Clase).
Acceder a objetos de otras aplicaciones
Los pasos que se deben seguir para crear un objeto OLE automatizado y asignarlo a una variable objeto son:
Al ejecutarse esta sentencia, se arranca la aplicación que proporciona el objeto (en este caso, Word) y se crea un objeto OLE automatizado. A diferencia de cuando se enlaza o incluye un objeto, en este caso no se visualiza una imagen de los datos asociados, ni los datos son mantenidos por Visual Basic. Este objeto es parte de la aplicación que lo ha creado y puede ser referenciado por Visual Basic utilizando la variable objeto.
Activando un objeto OLE guardado en un fichero
Muchas aplicaciones que soportan la automatización permiten guardar objetos en ficheros. Posteriormente, para activar estos objetos, hay que utilizar la función GetObject, cuya sintaxis es:
Set VariableObjeto = GetObject(Fichero[,"Aplicación.Objeto"] )
NOTA: Cuando el objeto de automatización deja de ser útil, hay que cerrarlo con Set Objeto = Nothing
Automatizando objetos OLE almacenados en controles OLE
Los pasos que se deben seguir son: