| Artículos | 01 MAR 2001

Microsoft Visual Basic

Tags: Histórico
Francisco Charte.
69- Cómo reducir las sentencias Declare
Desde una aplicación escrita con Visual Basic es posible utilizar la mayoría de las funciones que componen la API de Windows, si bien para ello antes es necesario codificar la correspondiente sentencia Declare. Con ella se indicará cuál es el nombre de la función, en qué librería de enlace dinámico se encuentra, qué parámetros toma y de qué tipo y cuál es su valor de retorno.
Existen funciones realmente sencillas cuya declaración puede realizarse a mano, pero otras pueden tomar infinidad de parámetros por valor y por referencia, usar tipos de datos que también es necesario definir con antelación, etc. Por eso es habitual que se use la herramienta conocida como Visor de texto API para generar automáticamente las sentencias Declare. Esta herramienta, a la que corresponde la figura, nos permite seleccionar funciones, constantes y tipos y copiarlos al portapapeles, desde donde podremos recuperarlos en nuestro módulo de código.
El inconveniente es que cada vez que necesitemos una función en un nuevo módulo de código, o un nuevo proyecto, tendremos que volver a crear las sentencias Declare correspondientes, repitiendo una y otra vez el mismo trabajo. La solución definitiva, para evitar las sentencias Declare, consiste en crear una librería de tipos con todas esas definiciones.
Una librería de tipos es una DLL que contiene simplemente información: definiciones de constantes y tipos de datos, funciones, interfaces COM, etc. Para crear una librería de este tipo sólo necesitará dos herramientas: el Bloc de notas de Windows y el compilador Mktyplib.exe que encontrará en la carpeta Tools\Unsupprt\Typlib del CD-ROM de Visual Basic.
El primer paso sería tomar la descripción de la función que utilicemos habitualmente. Supongamos que ésta es GetTickCount(). Recuperamos la descripción usando el Visor de texto API citado antes, tomando la sentencia Declare facilitada para definir una entrada en la librería de tipos. Ésta podría quedar así:

[uuid(9E3F3543-B6C3-11d1-A87E-004033CA9316)]
library MisFunciones {

[dllname(“kernel32.dll”)]
module Kernel32 {
[entry(“GetTickCount”),
helpstring(“Número de ticks”)]
long GetTickCount();
}
}
El uuid que hay al principio es un identificador único asignado a la librería. Puede generarlo con la herramienta guidgen. En el interior de la librería tenemos un módulo asociado a la DLL kernel32.dll. Este módulo contiene una sola definición de función, pero en la práctica podríamos incluir todas las funciones que necesitáramos de esa DLL. Lógicamente, también podemos definir varios módulos en la misma librería, definiendo funciones de múltiples DLL.
Guardado el código anterior, escrito en un lenguaje conocido como ODL, bastaría con llamar a la herramienta Mktyplib citada antes facilitando el nombre del archivo. A cambio se
creará un nuevo archivo, con el mismo nombre pero extensión TLB. Usando la opción ProyectoReferencias añadiríamos ese archivo a nuestro proyecto Visual Basic. A partir de ese momento ya podríamos usar la función GetTickCount() sin necesidad de incluir sentencias Declare. Desde el Examinador de objetos de Visual Basic,
véase la figura, puede ver el contenido de la librería de tipos.
Lógicamente, esta técnica le será tanto más útil cuantas más definiciones haya incluido en la librería de tipos.

70- Convertir Intro en Tab
Las interfaces de usuario de Windows aportaron, en su día, diversas diferencias respecto al mecanismo habitual con el que muchas personas estaban habituadas a trabajar. Una de esas costumbres, que aún hoy persiste, es la de utilizar la tecla Intro para indicar que se ha finalizado la introducción de un dato y, consecuentemente, se desea pasar al siguiente control. En un formulario diseñado con Visual Basic, sin embargo, la tecla que hay que pulsar para ir de un control al siguiente no es Intro sino Tab.
Si estamos creando una aplicación que va a ser utilizada por personas acostumbradas a programas que utilizan Intro en lugar de Tab, podemos facilitarle la adaptación y ahorrarles problemas con este sencillo truco. Lo primero que hay que hacer es dar el valor True a la propiedad KeyPreview del formulario, de tal manera que las pulsaciones de tecla generen un evento antes en el formulario que en el control que corresponda.
Acto seguido añadiríamos el código siguiente al formulario en cuestión. Como puede ver, se comprueba si la tecla pulsada ha sido Intro y, en caso afirmativo, se sustituye por una pulsación de la tecla Tab.

‘ Cada vez que se pulse una tecla
Private Sub Form_KeyPress( _
KeyAscii As Integer)
‘ Si la tecla pulsada es Intro
If KeyAscii = Asc(vbCr) Then
KeyAscii = 0 ‘ obviar esta pulsación y
SendKeys “{Tab}” ‘ convertirla en Tab
End If
End Sub
Como puede ver, se trata de un proceso muy sencillo y que permitirá pasar de un control a otro simplemente pulsando la tecla Intro, a menos que el control que tiene el foco se active mediante dicha tecla, como ocurre con los botones.

71- Controlar las unidades de CD-ROM
Los lectores de CD-ROM actuales cuentan con bandejas motorizadas que, aparte de responder a la pulsación del botón físico que hay en la propia unidad, pueden ser controladas desde cualquier programa. Con una simple función, llamada mciSendString(), podemos abrir y cerrar esa bandeja. También podríamos usarla para saber si el disco introducido es de datos o de música y, en este último caso, iniciar la reproducción.
Para poder usar esta función lo primero que hay que hacer es declararla en el módulo de código donde la necesitemos, o bien incluirla en nuestra librería de tipos tal y como se explicó en el primero de los trucos. La definición de mciSendString() es ésta:

Private Declare Function _
mciSendString Lib “winmm.dll” _
Alias “mciSendStringA” _
(ByVal lpstrCommand As String, _
ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, _
ByVal hwndCallback As Long) As Long
El primer parámetro de esta función es una cadena con la orden a ejecutar, mientras que los otros tres, para el caso que nos ocupa, podemos obviarlos ya que no esperamos valores de retorno ni resultados.
Si quisiéramos abrir la bandeja de la unidad de CD-ROM desde un programa propio, bastaría con introducir una sentencia como la siguiente:

mciSendString “Set cdaudio Door Open”, _
vbNullString, 0, 0
De forma análoga, para cerrar la bandeja usaríamos la orden Set cdaudio Door Closed. En ambos casos estaríamos actuando sobre la única unidad de CD-ROM del sistema o, en caso de existir varias, sobre la primera unidad disponible. Para trabajar con una unidad secundaria, o cualquier otra que pudiera haber en el sistema, primero tendríamos que abrirla. Suponga que tiene dos unidades de CD-ROM, una con la letra H: y otra con la I:. Podría actuar sobre la segunda de esta forma:

Open I: type cdaudio Alias MiCd
Set MiCd Door Open
Close MiCd

En estas órdenes se abre una unidad específica, indicando su letra, y asignándole un alias que, posteriormente, usamos para controlar la bandeja y cerrar la unidad. Conociendo este truco, podríamos codificar una función gen

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información