TRUCO 1: AÑADIR CONTROLES DINAMICAMENTE EN FORMULARIOS
Hasta Visual Basic 5.0 si se quería añadir un control a un formulario
se utilizaba la función Load, que permitía añadir un control a un
array ya existente.
Esta limitación se ha eliminado de Visual Basic 6.0, y ya es posible
añadir y borrar controles a la colección "Controls", sin necesidad de
que exista un array ya creado.
Además, el nuevo control puede responder a eventos si se define con la
palabra "WithEvents".
Como muestra, un sencillo ejemplo que crea un botón y se añade código
al evento:
Dim WithEvents cmdObj1 As CommandButton
Private Sub cmdObj1_Click()
MsgBox "Esto es un control dinámico"
End Sub
Private Sub Form_Load()
Set cmdObj1 = Form1.Controls.Add("VB.CommandButton", "cmdBoton1")
cmdObj1.Caption = "Púlsame"
cmdObj1.Left = 1500
cmdObj1.Top = 1000
cmdObj1.Visible = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
Form1.Controls.Remove "cmdBoton1"
End Sub
TRUCO 2: EJECUTAR COMO PROCEDIMIENTO EL CONTENIDO DE UN STRING
En Visual Basic se está avanzando en la posibilidad de ejecutar el
código apuntado por un puntero a función, tal y como se permite en
Visual C++.
Ya en Visual Basic 5.0 se incorporaba la función AddressOf, que
permitía obtener la dirección de una función. Pasando esa dirección a
un programa C++, éste podía ejecutar la función.
En Visual Basic 6.0 se avanza un paso más y se crea la función
CallByName, que permite ejecutar una función si se conoce su nombre en
tiempo de ejecución. Basta con pasar a CallByName una cadena (string)
como argumento, conteniendo el nombre de la función a ejecutar.
Los argumentos que recibe CallByName son: el objeto contenedor de la
función (por ejemplo, un Formulario), la cadena que contiene el nombre
de la función, el tipo de función y los argumentos de ésta.
El siguiente ejemplo crea dos funciones (Divide y Multiplica).
Si en Text2 y Text3 colocamos los argumentos, al pulsar el botón se
ejecuta la operación que hallamos escrito en Text1 (Multiplica o
Divide).
Public Function Divide(arg1 As Long, arg2 As Long)
Divide = arg1 / arg2
End Function
Public Function Multiplica(arg1 As Long, arg2 As Long)
Multiplica = arg1 * arg2
End Function
Private Sub Command1_Click()
MsgBox CallByName(Me, Text1.Text, VbMethod, Text2.Text, Text3.Text)
End Sub
TRUCO 3: COMO CERRAR CONEXIONES IMPL+CITAS EN VB6
En Visual Basic 6.0 es posible abrir objetos recordsets independientes
sin asociarlos a ninguna conexión. Esto es posible gracias al carácter
no jerárquico del modelo de programación de ADO.
No obstante, cada vez que se abre un recordset de este tipo, se crea
una conexión implícita. Esto supone que si el objeto recordset se
cierra y se abre varias veces en el código del proyecto, se crearán
tantas nuevas conexiones como veces se haya abierto el objeto
recordset. Estas conexiones permanecerán abiertas hasta cerrar el
proyecto.
Para impedir esto, y conseguir cerrar la conexión implícita a cada
recordset independiente, se puede utilizar la siguiente técnica, que
asocia a una variable Connection la conexión implícita a un recordset
independiente, cerrando dicha conexión antes de reabrir el recordset.
Dim rst1 As New ADODB.Recordset
Dim cnn As New ADODB.Connection
Set cnn = rst1.ActiveConnection
rst1.Close
cnn.Close
rst1.Open "publishers","Provider = sqloledb;Data Source=myServer;" & _
"Initial Catalog=pubs;User Id=sa;Password=;", adOpenStatic, _
adLockOptimistic
End Sub
TRUCO 4: LANZAR S+NCRONAMENTE COMANDOS DE MS-DOS
A veces interesa lanzar comandos MS-DOS desde Visual Basic y esperar a
que éstos acaben. Una situación habitual es lanzar ficheros por lotes
(.BAT), o comandos "net XXX", que realizan exploración por distintos
servidores en la red y que pueden tardar varios segundos en ser
ejecutados.
A continuación se incluye un ejemplo de cómo lanzar un comando
MS-DOS y esperar a que éste acabe. Se utilizan dos funciones del API
de Windows. La declaración de éstas se ha obtenido del Visor de Texto
API, un icono que aparece en el grupo de programas de Visual Basic.
Estas funciones son:
OpenProcess(): A partir del identificador de un proceso en
ejecución, esta función devuelve el handle de dicho proceso.
GetExitCodeProcess(): recupera el código de salida de un proceso
lanzado.
Por otra parte, en el código de ejemplo se incluye una referencia a
Environ$("Comspec") & " /c "
Esta instrucción fuerza a que se cierre la ventana MS-DOS de Windows
95 o Windows 98 después de que el comando MS-DOS se haya ejecutado.
En realidad la anterior instrucción se traduce en
"COMMAND.COM /C"
La utilización de la función Environ con el parámetro Comspec asegura
que el command.com se encontrará aunque no esté en el path.
El ejemplo necesita un proyecto con un Textbox y un Command button,
con las propiedades por defecto. Al ejecutar el proyecto, teclear el
comando MS-DOS en el Textbox y pulsar Command1. Pasados unos segundos
(depende del comando a ejecutar), aparecerá el mensaje "El comando ha
acabado".
El código del formulario es el siguiente:
Option Explicit
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const STILL_ACTIVE = &H103
Private Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess&, ByVal bInheritHandle&, ByVal dwProcessId&) _
As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" _
(ByVal hProcess As Long, lpExitCode As Long) _
As Long
Sub EsperarShell(sCmd As String)
Dim hShell As Long
Dim hProc As Long
Dim codExit As Long
' esperar a que se complete el proceso
hProc = OpenProcess(PROCESS_QUERY_INFORMATION, False, hShell)
Do
GetExitCodeProcess hProc, codExit
DoEvents
Loop While codExit = STILL_ACTIVE
MsgBox "El comando ha acabado"
End Sub
Private Sub Command1_Click()
EsperarShell (Text1.Text)
End Sub
TRUCO 5: FORMATO PARA CELDAS NUMÉRICAS EN EL CONTROL DBGRID
A las columnas numéricas de un dbgrid se les puede aplicar un formato
de visualización de los números. Para establecer este formato a través
de código debe utilizarse la propiedad NumberFormat, pero en base al
formato americano.
Por ejemplo, imaginemos que la tercera columna en un dbgrid es una
columna numérica en la que aparecen cifras de ventas con valores
decimales, y queremos visualizar el punto para las unidades de millar
y dos decimales tras la coma. Tenderemos a escribir el siguiente
código:
DBGrid1.Columns(2).NumberFormat = "#.###,##"
Pues bien, el resultado será que una vez ejecutado este código esa
columna aparecerá en blanco.
La razón es que esta propiedad debe utilizarse en base al formato
americano, o dicho de otro modo, el punto decimal debe ser una coma
(",") y la separación de decimales un punto (".") .
De esta forma, si utilizamos el siguiente código
DBGrid1.Columns(2).NumberFormat = "#,###.##"
el resultado sí será el correcto, y veremos los valores numéricos en
dicha columna, y además con el formato deseado (por ejemplo,
10.235,27).
TRUCO 6: COMO CREAR UN SALVAPANTALLAS CON VB
La forma de crear un salvapantallas con Visual Basic es muy simple.
Basta con crear un proyecto con un formulario al que se le añadirán
los controles que conformarán el interfaz del salvapantallas, junto al
código que se quiera incluir.
Al generar el fichero ejecutable se debe dar la extensión SCR, y el
fichero debe guardarse en el directorio por defecto de Windows.
Un ejemplo: crear un proyecto estándar en VB y asignar las siguientes
propiedades al formulario por defecto:
WindowState = 2 'Maximized
BorderStyle = 0 'None
Incluir en el formulario una etiqueta con un texto descriptivo.
Incluir a continuación el siguiente código:
Private Sub Form_Click()
'El salvapantallas se desactiva al hacer click sobre el formulario
Unload Me
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
'El salvapantallas se desactiva al pulsar una tecla
Unload Me
End Sub
Private Sub Form_Load()
'No se permita más de una instancia del salvapantallas
If App.PrevInstance Then Unload Me
End Sub
Generar el fichero ejecutable con la extensión SCR, y guardarlo en el
directorio por defecto de Windows.
Si a continuación indicamos éste como salvapantallas por defecto en
las propiedades del escritorio de Windows, cuando se venza el retardo
de tiempo indicado, el formulario maximizado será visualizado como
salvapantallas. Para volver al escritorio bastará con pulsar una tecla
o hacer click con el ratón.
TRUCO 7: ABRIR UNA BD CON SEGURIDAD DESDE ADO
La seguridad utilizada convencionalmente por Microsoft Access es una
seguridad a nivel de usuario, controlada desde los ficheros .MDB y
.MDA o .MDW (según versión de Microsoft Access).
Microsoft Access 7.0 y Microsoft Access 97 también incorporan otro
tipo de seguridad, asociada a la base de datos (se protege la base de
datos con una contraseña que forma parte del fichero .MDB, y que
solamente es solicitada al abrir ésta).
El código aquí incluido permite abrir desde Visual Basic una base de
datos cuando hay establecida seguridad a nivel de usuario.
Previamente, desde el entorno de Microsoft Access se ha asignado al
usuario Administrador (que es por defecto el propietario de todas las
bases de datos) una contraseña ("ejemplo"). Esto se hace en Access 97
en la opción de menú Herramientas | Seguridad | Cuentas de usuario y
de grupo, y una vez ahí accediendo a la pestaña Cambiar contraseña de
conexión. A partir de entonces, al abrir Access será necesario
proporcionar el usuario y la contraseña.
También a partir de entonces, para abrir un MDB desde VB será
necesario pasarle el usuario y la contraseña.
Este es el código VB que utiliza objetos de ADO 2.0 para abrir el MDB:
Dim Cn As New ADODB.Connection
Dim strCn As String