TRUCO 1: ¿Cómo cambiar el tamaño de la caja de herramientas? (Aplicable a las versiones 3.0 y 4.0).
En Visual Basic no existe la posibilidad de cambiar de tamaño la caja de herramientas ya que la ventana no tiene borde.
Para solucionar este problema, existe un pequeño truco que consiste en situar la barra de herramientas en la zona inferior o izquierda de la pantalla, de tal forma que sólo sean visibles dos o tres filas de controles:
__________________________
| VB |
|-------------------------|
| |
| _________ |
| |Toolbox| |
| |-------| |
| | | |
| | | |
---------------------------
Al cerrar Visual Basic y volver abrirlo, automáticamente la barra de herramientas habrá cambiado de tamaño y mostrará un aspecto similar al siguiente:
__________________________
| VB |
|-------------------------|
| |
| _____________ |
| | | | |
| | | | |
| |-|---------| |
| |
---------------------------
TRUCO 2: ¿Cómo crear accesos directos (shorcuts) en Windows 95? (Aplicable a las versiones 4.0/32 bits y 5.0).
La librería STKIT432.DLL que Visual Basic 4.0 instala en el directorio SYSTEM de WINDOWS, incluye la siguiente función para crear accesos directos en el menú inicio de Windows 95.
Declare Function fCreateShellLink Lib "STKIT432.DLL" _
(ByVal lpstrFolderName As String, _
ByVal lpstrLinkName As String, _
ByVal lpstrLinkPath As String, _
ByVal lpstrLinkArgs As String) As Long
Esta función se puede utilizar para crear un acceso directo en cualquier lugar del disco.
El primer parámetro de la función (lpstrFolderName) es relativo a la carpeta Programas del Menú de Inicio. Esto quiere decir que si se pasa un cadena nula como primer parámetro, el acceso directo será creado en la propia carpeta de Programas. De igual manera, se puede navegar desde la carpeta de Programas a cualquier directorio del disco duro. Por ejemplo, el siguiente código creará un acceso directo en el escritorio del usuario:
Resultado = fCreateShellLink("..\..\Escritorio", "Bloc de _
notas", "c:\windows\notepad.exe", "")
TRUCO 3: Preguntando al usuario por un directorio en Windows 95 (Aplicable a las versiones 4.0/32 bits y 5.0).
Los diálogos predeterminados de Windows95 (common dialogs) son adecuados para seleccionar ficheros, pero ¿qué ocurre si se quiere seleccionar un directorio?. Lo que se debe hacer en este caso es utilizar la función SHBrowseForFolder de la API de Windows de 32 bits:
Option Explicit
Private Type BrowseInfo
hWndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
Private Const BIF_RETURNONLYFSDIRS = 1
Private Const MAX_PATH = 260
Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem _
As Long)
Private Declare Function lstrcat Lib "kernel32" Alias _
"lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As _
String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32" _
(lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" _
(ByVal pidList As Long, ByVal lpBuffer As String) As Long
Public Function ObtenerDirectorio(hWndPadre As Long, sTitulo _
As String) As String
Dim iNull As Integer
Dim lpIDLista As Long
Dim lResultado As Long
Dim sDirectorio As String
Dim udtBI As BrowseInfo
With udtBI
.hWndOwner = hWndPadre
.lpszTitle = lstrcat(sTitulo, "")
.ulFlags = BIF_RETURNONLYFSDIRS
End With
lpIDLista = SHBrowseForFolder(udtBI)
If lpIDLista Then
sDirectorio = String$(MAX_PATH, 0)
lResultado = SHGetPathFromIDList(lpIDLista, sDirectorio)
Call CoTaskMemFree(lpIDLista)
iNull = InStr(sDirectorio, vbNullChar)
If iNull Then
sDirectorio = Left$(sDirectorio, iNull - 1)
End If
End If
ObtenerDirectorio = sDirectorio
End Function
TRUCO 4: ¿Cómo enviar un fichero de Win95 a la papelera en VB4/32? (Aplicable a las versiones 4.0/32 bits y 5.0).
Las aplicaciones de 32-bit pueden llamar a la función SHFileOperation de la API de Windows para enviar un fichero a la papelera de reciclaje de Windows95. El siguiente ejemplo muestra cómo utilizar esta función y la instrucción ParamArray de VB:
Option Explicit
Private Type SHFILEOPSTRUCT
hWnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAborted As Boolean
hNameMaps As Long
sProgress As String
End Type
Private Const FO_DELETE = &H3
Private Const FOF_ALLOWUNDO = &H40
Private Declare Function SHFileOperation Lib "shell32.dll" _
Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
Public Function BorrarFichero(ParamArray vntNombreFichero() _
As Variant) As Long
Dim I As Integer
Dim sNombreFicheros As String
Dim SHOpFichero As SHFILEOPSTRUCT
For I = LBound(vntNombreFichero) To UBound(vntNombreFichero)
sNombreFicheros = sNombreFicheros & vntNombreFichero(I) & _
vbNullChar
Next
sNombreFicheros = sNombreFicheros & vbNullChar
With SHOpFichero
.wFunc = FO_DELETE
.pFrom = sNombreFicheros
.fFlags = FOF_ALLOWUNDO
End With
BorrarFichero = SHFileOperation(SHOpFichero)
End Function
El argumento ParamArray permite pasar cualquier número de ficheros a la función:
' Borrado de un único fichero
Resultado = BorrarFichero("BORRA.ME")
' Borrado de varios ficheros
Resultado = BorrarFichero("BORRA.ME", "PRUEBA1.DOC", _
"PRUEBA2.TXT")
TRUCO 5: ¿Cómo cancelar un AddNew/Edit sin abandonar el registro actual? (Aplicable a las versiones 3.0, 4.0 y 5.0).
La documentación de VB establece que si no se está usando un control de datos (datacontrol) y se emplea alguno de los métodos Move o Find, o se cierra el recordset habiendo algún Edit o AddNew pendiente, entonces no ocurrirá ningún error pero los cambios se perderán.
Así, un método simple para cancelar una edición es cambiar de registro. Sin embargo, es posible cancelar una edición sin abandonar el registro actual:
' En VB4...
Dim rs As Recordset
' Comienzo de un Edit
rs.Edit
...
' Cancelación
rs.Move 0
' En VB3...
Dim ds As Dynaset
Dim sBkMk As String
' Grabar bookmark del registro actual
sBkMk = ds.Bookmark
' Comienzo de un Edit
ds.Edit
' Cancelación
ds.Bookmark = sBkMk