Programas y Utilidades
para Visual Basic
Actualizado el 03/Nov/2006
Nota:
Esta página está ya obsoleta... salvo que sigas usando las primeras versiones de Visual Basic (particularmente para 16 bits), por tanto te recomiendo que veas la página de Mis Utilidades para Visual Basic 6.0 y anteriores.
Programas incluidos en esta página desde el ya "remoto" 15/Dic/1997:
Link a la página con la mayoría de Mis Utilidades...
NOTA del 30/Mar/98:
Te recomiendo que te pases por las páginas de Gratisware y Mis Utilidades
ya que en esas páginas estarán los programillas y utilidades, con los listados, que he puesto en mis páginas.
Así que seguramente estarán más "actualizados" que esta página.
Programas y utilidades (rutinas y otras cosillas que son algo más que un simple truco)
Nuevo contenido con utilidades y otros programas (22/Mar/97)Actualizado el 15-Dic-1997
Actualizado el 04/Jun/2004
Actualizado el 03/Nov/2006
Salva pantallas de Joe LeVasseur. (Protpant.zip 8.667 bytes)
Ejemplo de un salva pantallas (screen saver) de Joe LeVasseur.
En sus páginas personales, (ya no existe esa página), podrás encontrar un salva-pantallas que muestra el icono en la barra de tareas. Joe ha prometido que enviará el código para mostrar un programa en la barra de tareas. Estás obligado a hacerlo. 8-)
En el fichero comprimido encontrarás el código fuente y el ejecutable con la extensión .SCR
Copia el fichero Protpant.scr en el directorio System de Windows y podrás usarlo desde el diálogo de Propiedades de Pantalla, solapa Protector de pantalla.Listados y fichero ejecutable del salva pantallas, nueva versión, (Protpan1.zip 8.890 bytes)
Reinicia Windows y muestra los recursos y la memoria disponible. (22/Mar/97)
Sólo para 16 bits.
El listado:
'----------------------------------------------------------
' gsIniW (Reiniciar Windows) Versión 16 bits
'
' (c) Guillermo Som Cerezo (18/May/95)
'
' Utilidad para reiniciar windows.
' Muestra también la memoria y recursos libres. ( 1/Sep/96)
'
' Este programa es de libre distribución y
' puedes modificarlo, (para eso envío los listados).
'
'----------------------------------------------------------
Option Explicit
Declare Function ExitWindows Lib "User" (ByVal ReStartCode As Long, ByVal DosReturnCode As Integer) As Integer
'Obtener la memoria y recursos libres ( 1/Sep/96)
Declare Function GetFreeSpace Lib "Kernel" (ByVal wFlags As Integer) As Long
Declare Function GetFreeSystemResources Lib "User" (ByVal fuSysResource As Integer) As Integer
Const GFSR_SYSTEMRESOURCES = &H0
Sub Main()
#If Win32 Then
MsgBox "Este programa sólo funciona compilado con 16 bits.", vbInformation
#Else
Dim Memoria&, m$
Memoria& = GetFreeSpace(0)
m$ = "Recursos libres: " & GetFreeSystemResources(GFSR_SYSTEMRESOURCES) & "%"
m$ = m$ & " - Memoria libre: " & Format$(Memoria& \ 1024, "###,###,###") & " KB"
If MsgBox(m$ & vbCrLf & vbCrLf & "¿Quieres reiniciar Windows?", 4 + 16 + 256, "Reiniciar Windows") = 6 Then
Memoria& = ExitWindows(66, 0)
End If
End
#End If
End Sub
Reinicia
Windows (16 y 32 bits) (22/Mar/97)
Esta utilidad reiniciará Windows. Sirve tanto para 16 como para 32 bits.
Nota:
En la página del API tienes otros ejemplos,
incluso para Windows NT/2000
Reiniciar Windows (listados para 16 y 32
bits)
Reiniciar Windows (2ª parte) revisado
para Windows NT
El listado:
Option Explicit
'--------------------------------------------------
' ReIniWin (Reiniciar Windows) ( 8/Nov/95)
'
'(c) Guillermo Som
'--------------------------------------------------
#If Win32 Then
'Para usar con ExitWindowsEx
Public Const EWX_LOGOFF = 0 'Termina la sesión actual
Public Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
'ExitWindows termina la sesión actual e inicia una nueva
'(es decir reiniciar windows)
'Public Declare Function ExitWindows Lib "user32" (ByVal dwReserved As Long, ByVal uReturnCode As Long) As Long
#Else
Public Declare Function ExitWindows Lib "user" (ByVal ReStartCode As Long, ByVal DosReturnCode As Integer) As Integer
#End If
Public Sub Main()
Dim msg As String
Beep
#If Win32 Then
msg = "Estás ejecutando Windows en modo 32bits," & vbCrLf & "(seguramente Windows 95, conectado en red)," & vbCrLf & "y e"
#Else
msg = "E"
#End If
msg = msg & "ste programa reiniciará Windows."
If MsgBox(msg & vbCrLf & vbCrLf & "¿Seguro que quieres reiniciar Windows?", 4 + 16 + 256, "¡ ATENCIÓN !") = 6 Then
'ReStart Windows
#If Win32 Then
If ExitWindowsEx(EWX_LOGOFF, 0&) Then
#Else
If ExitWindows(66, 0) Then
#End If
End If
Else
End
End If
End Sub
Convertir
Números en Letras (22/Mar/97)
Función para convertir un número en letra.
Por ejemplo: 125 sería "ciento veinticinco"
Listado y form de prueba. (gsnum2text.zip 2.98 KB)
Nota:
Échale un vistazo a la página de la clase
cNum2Text.
El listado:
'---------------------------------------------------------------------------
' gsNumero.BAS Módulo para procedimientos numéricos ( 1/Mar/91)
' Versión para Windows (25/Oct/96)
'
' (c)Guillermo Som, 1991-97
'---------------------------------------------------------------------------
Option Explicit
Option Compare Text
Public Function Numero2Letra(ByVal strNum As String, Optional vLo) As String
'----------------------------------------------------------
' Convierte el número strNum en letras (28/Feb/91)
' Versión para Windows (25/Oct/96)
'----------------------------------------------------------
Dim lngA As Long
Dim Negativo As Boolean
Dim L As Integer
Dim Una As Boolean
Dim Millon As Boolean
Dim Millones As Boolean
Dim vez As Integer
Dim MaxVez As Integer
Dim k As Integer
Dim strQ As String
Dim strB As String
Dim strU As String
Dim strD As String
Dim strC As String
Dim iA As Integer
'
Dim strN() As String
Dim lo As Integer
'
'Si no se especifica el ancho...
If IsMissing(vLo) Then
lo = 255
Else
lo = vLo
End If
Dim unidad(0 To 9) As String
Dim decena(0 To 9) As String
Dim centena(0 To 9) As String
Dim deci(0 To 9) As String
Dim otros(0 To 15) As String
'Asignar los valores
unidad(1) = "Una"
unidad(2) = "dos"
unidad(3) = "tres"
unidad(4) = "cuatro"
unidad(5) = "cinco"
unidad(6) = "seis"
unidad(7) = "siete"
unidad(8) = "ocho"
unidad(9) = "nueve"
'
decena(1) = "diez"
decena(2) = "veinte"
decena(3) = "treinta"
decena(4) = "cuarenta"
decena(5) = "cincuenta"
decena(6) = "sesenta"
decena(7) = "setenta"
decena(8) = "ochenta"
decena(9) = "noventa"
'
centena(1) = "ciento"
centena(2) = "doscientas"
centena(3) = "trescientas"
centena(4) = "cuatrocientas"
centena(5) = "quinientas"
centena(6) = "seiscientas"
centena(7) = "setecientas"
centena(8) = "ochocientas"
centena(9) = "novecientas"
'
deci(1) = "dieci"
deci(2) = "veinti"
deci(3) = "treinta y "
deci(4) = "cuarenta y "
deci(5) = "cincuenta y "
deci(6) = "sesenta y "
deci(7) = "setenta y "
deci(8) = "ochenta y "
deci(9) = "noventa y "
'
otros(1) = "1"
otros(2) = "2"
otros(3) = "3"
otros(4) = "4"
otros(5) = "5"
otros(6) = "6"
otros(7) = "7"
otros(8) = "8"
otros(9) = "9"
otros(10) = "10"
otros(11) = "once"
otros(12) = "doce"
otros(13) = "trece"
otros(14) = "catorce"
otros(15) = "quince"
'
On Error GoTo 0
lngA = Abs(Val(strNum))
Negativo = (lngA <> Val(strNum))
strNum = LTrim$(RTrim$(Str$(lngA)))
L = Len(strNum)
If lngA = 0 Then
strNum = Left$("cero" & Space$(lo), lo)
Exit Function
End If
'
Una = True
Millon = False
Millones = False
If L < 4 Then Una = False
If lngA > 999999 Then Millon = True
If lngA > 1999999 Then Millones = True
strB = ""
strQ = strNum
vez = 0
ReDim strN(1 To 4)
strQ = Right$(String$(12, "0") & strNum, 12)
For k = Len(strQ) To 1 Step -3
vez = vez + 1
strN(vez) = Mid$(strQ, k - 2, 3)
Next
MaxVez = 4
For k = 4 To 1 Step -1
If strN(k) = "000" Then
MaxVez = MaxVez - 1
Else
Exit For
End If
Next
For vez = 1 To MaxVez
strU = "": strD = "": strC = ""
strNum = strN(vez)
L = Len(strNum)
k = Val(Right$(strNum, 2))
If Right$(strNum, 1) = "0" Then
k = k \ 10
strD = decena(k)
ElseIf k > 10 And k < 16 Then
k = Val(Mid$(strNum, L - 1, 2))
strD = otros(k)
Else
strU = unidad(Val(Right$(strNum, 1)))
If L - 1 > 0 Then
k = Val(Mid$(strNum, L - 1, 1))
strD = deci(k)
End If
End If
If L - 2 > 0 Then
k = Val(Mid$(strNum, L - 2, 1))
strC = centena(k) & " "
End If
If strU = "uno" And Left$(strB, 4) = " mil" Then strU = ""
strB = strC & strD & strU & " " & strB
If (vez = 1 Or vez = 3) And strN(vez + 1) <> "000" Then strB = " mil " & strB
If vez = 2 And Millon Then
If Millones Then
strB = " millones " & strB
Else
strB = "un millón " & strB
End If
End If
Next
strB = LTrim$(RTrim$(strB))
If Right$(strB, 3) = "uno" Then strB = Left$(strB, Len(strB) - 1) & "a"
Do 'Quitar los espacios que haya por medio
iA = InStr(strB, " ")
If iA = 0 Then Exit Do
strB = Left$(strB, iA - 1) & Mid$(strB, iA + 1)
Loop
If Left$(strB, 6) = "una un" Then strB = Mid$(strB, 5)
If Left$(strB, 7) = "una mil" Then strB = Mid$(strB, 5)
If Right$(strB, 16) <> "millones mil una" Then
iA = InStr(strB, "millones mil una")
If iA Then strB = Left$(strB, iA + 8) & Mid$(strB, iA + 13)
End If
If Right$(strB, 6) = "ciento" Then strB = Left$(strB, Len(strB) - 2)
If Negativo Then strB = "menos " & strB
'
strC = Space$(lo)
LSet strC = strB
Numero2Letra = strC
End Function
Aceptar
archivos con Drag & Drop (23/Mar/97)
Ejemplo del uso de una clase para aceptar archivos "soltados" en un
formulario.
Aceptará tanto imágenes BMP, ICO y WMF, así como archivos de texto. En caso que sea otro
tipo de archivo, si se puede asignar (mostrar) en un textbox, se mostrará, si no se
producirá un error y el error será indicado en el label.
Esta clase está sacada (sin autorización) del libro de Francisco Charte:
Programación Profesional con Visual Basic 4.0 de la editorial Anaya Multimedia.
Aunque me expongo a "cualquier cosa" y confiando en que al ser por el tema
divulgativo no haya problemas.
Nota del 15/Dic/97:
Según el autor, Fco. Charte, mientras haga referencia de dónde está
sacada, la cosa va bien. Muchas gracias.
Creo que es un ejemplo interesante del modo de realizar esta función que a más de
uno, incluido yo, nos gustaría implementar en sus programas.
Pues ahí queda eso y espero que "le saques provecho"
Baja los listados de la clase y el ejemplo (dragdrop.zip 4.55 KB)
Este es el listado de la clase DragDrop
'----------------------------------------------------------
'
'cDragDrop.Cls
'
' Esta clase facilitará la creación de aplicaciones
' que acepten archivos de arrastrar-y-soltar desde
' el Explorador
'
'Clase de ejemplo del Capitulo 8 del libro:
'Programación Profesional con Visual Basic 4.0
'de Francisco Charte (Anaya Multimedia)
'
'Adaptada por Guillermo Som, 23/Mar/97
'----------------------------------------------------------
Option Explicit
' Referencia a la ventana oculta
Private MiVentana As frmOculto
' Referencia a la ventana que recibirá los archivos
Private VentanaDragDrop As Form
Private Termina As Boolean ' indicador interno
'Constantes para las funciones del API
'Const PM_NOREMOVE = &H0
Const PM_REMOVE = &H1
'Const PM_NOYIELD = &H2
Const WM_DROPFILES = &H233
'Declaraciones de las funciones del API
Private Declare Function DragQueryFile Lib "shell32.dll" Alias "DragQueryFileA" (ByVal hDrop As Long, ByVal UINT As Long, ByVal lpStr As String, ByVal ch As Long) As Long
'Private Declare Function DragQueryPoint Lib "shell32.dll" (ByVal hDrop As Long, lpPoint As POINTAPI) As Long
Private Declare Sub DragFinish Lib "shell32.dll" (ByVal hDrop As Long)
Private Declare Sub DragAcceptFiles Lib "shell32.dll" (ByVal hwnd As Long, ByVal fAccept As Long)
'
Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (lpMsg As Msg, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long
Private Declare Function WaitMessage Lib "user32" () As Long
'Tipos de datos para las funciones del API
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type Msg
hwnd As Long
message As Long
wParam As Long
lParam As Long
time As Long
pt As POINTAPI
End Type 'MSG
' Este método activa la recepción de archivos
' en la ventana que se pasa como parámetro
Public Sub Activa(Ventana As Form)
' Guardamos la referencia a la ventana
Set VentanaDragDrop = Ventana
' Activamos la recepción de archivos
DragAcceptFiles VentanaDragDrop.hwnd, True
' Creamos una ventana oculta
Set MiVentana = New frmOculto
' y la asociamos con nosotros mismos
Set MiVentana.MiObjeto = Me
' activando el envío de un mensaje en 500 milisegundos
MiVentana.Timer.Enabled = True
' lo cual nos permite devolver el control
' al cliente que nos esté utilizando
Termina = False
End Sub
' Esta función será llamada desde el formulario
' oculto, y se estará ejecutando mientras Termina
' no tome el valor True
Public Sub Proceso()
' Para leer mensajes de la cola
Dim Mensaje As Msg, N As Integer ' contador
' Bytes y Cadena para leer nombres de archivo
Dim Bytes As Integer, Cadena As String
' Mientras Termina no sea True
Do While Not Termina
WaitMessage ' esperamos a que llegue un mensaje
' Si ese mensaje es WM_DROPFILES
If PeekMessage(Mensaje, VentanaDragDrop.hwnd, WM_DROPFILES, WM_DROPFILES, PM_REMOVE) Then ' lo leemos
With Mensaje ' obtenemos el número total de archivos
For N = 0 To DragQueryFile(.wParam, -1, Cadena, 0) - 1
' consultamos la longitud del nombre N
Bytes = DragQueryFile(.wParam, N, Cadena, 0)
' asignamos el espacio necesario
Cadena = String(Bytes + 1, 0)
' y obtenemos el nombre
DragQueryFile .wParam, N, Cadena, Bytes + 1
' que pasamos al formulario cliente
VentanaDragDrop.Archivo Cadena
Next
DragFinish .wParam ' hemos terminado
End With
End If
DoEvents ' permitimos el trabajo de otros procesos
Loop ' y continuamos
End Sub
' Este método será llamado para desactivar
' el funcionamiento del objeto
Public Sub Desactiva()
Termina = True ' Provocamos el fin de la ejecución de Proceso
' desactivamos la recepción de archivos
DragAcceptFiles VentanaDragDrop.hwnd, False
Unload MiVentana ' descargamos la ventana oculta
Set VentanaDragDrop = Nothing ' y liberamos referencias
Set MiVentana = Nothing
End Sub
' Al destruir el objeto
Private Sub Class_Terminate()
' si no ha sido previamente desactivado
If Not Termina Then Desactiva ' lo desactivamos
End Sub
El listado del form oculto que usa la clase
'
' frmOculto.frm
'
' Este formulario oculto tiene como única finalidad
' enviar un mensaje al objeto asociado una vez
' ha trancurrido un periodo de 500 milisegundos.
' Esto permite que el objeto devuelva el control
' al formulario que ha llamado al método Activa
'
Option Explicit
' Referencia al objeto
Public MiObjeto As DragDrop
' Al descargar el formulario
Private Sub Form_Unload(Cancel As Integer)
Set MiObjeto = Nothing ' eliminamos la refrencia
End Sub
' Cuando se produzca el evento
Private Sub Timer_Timer()
Timer.Enabled = False ' desactivamos el timer
MiObjeto.Proceso ' y llamamos a Proceso
End Sub
Por último el listado del form de prueba
'-------------------------------------------------------------
'Prueba de Drag & Drop aceptando archivos de texto (23/Mar/97)
'
'Proceso y clase basado en el ejemplo del libro:
'Programación Profesional con Visual Basic 4.0
'de Francisco Charte (Anaya Multimedia)
'-------------------------------------------------------------
Option Explicit
' Referencia al objeto de arrastrar y soltar
Dim MiObjeto As DragDrop
' Este procedimiento público será llamado
' por el objeto DragDrop cada vez que se
' reciba un archivo de arrastrar y soltar
Public Sub Archivo(Nombre As String)
Dim nFic As Integer
Desactivar
On Local Error Resume Next
'Si es un archivo gráfico
Picture1.Picture = LoadPicture(Nombre)
If Err = 0 Then
Picture1.Enabled = True
Picture1.Visible = True
Else
Err = 0
'Si no se asigna al text
Text1.Enabled = True
Text1.Visible = True
nFic = FreeFile
Open Nombre For Input As nFic
Text1 = Input$(LOF(nFic), nFic)
Close nFic
End If
AjustarTamaño
Label1 = Nombre
If Err Then
Label1 = "ERROR: " & Error$
Text1 = ""
Err = 0
End If
On Local Error GoTo 0
End Sub
Private Sub cmdSalir_Click()
Unload Me
End
End Sub
Private Sub Form_Load()
'Inicializar
' Creamos el objeto
Set MiObjeto = New DragDrop
MiObjeto.Activa Me ' lo activamos
Desactivar
End Sub
Private Sub Form_Resize()
'No ajustar las posiciones, si se minimiza el form
If WindowState = vbMinimized Then Exit Sub
AjustarTamaño
End Sub
Private Sub Form_Unload(Cancel As Integer)
MiObjeto.Desactiva ' desactivamos el objeto
Set MiObjeto = Nothing ' y lo liberamos
'Liberar recursos
Set Form1 = Nothing
End Sub
Private Sub AjustarTamaño()
Dim alto As Integer
cmdSalir.Top = ScaleHeight - 495
cmdSalir.Left = ScaleWidth - 1380
alto = cmdSalir.Top - (Label1.Top + Label1.Height) - 240
If Text1.Enabled Then
Text1.Move 90, 480, ScaleWidth - 180, alto
End If
If Picture1.Enabled Then
Picture1.Move 90, 480, ScaleWidth - 180, alto
End If
End Sub
Private Sub Desactivar()
Picture1.Enabled = False
Picture1.Visible = False
Text1.Enabled = False
Text1.Visible = False
End Sub
Una
función para saber si existe un archivo (24/Mar/97)
Esta es una función que me ha enviado mi amigo Joe LeVasseur y es para saber si un archivo existe, aunque sea oculto o del sistema.
Option Explicit
' Ejemplo de probar si existe un archivo sin abrir
Private Sub Command1_Click()
Dim ValDev As Boolean, UnArchivo As String
UnArchivo = "c:\autoexec.bart"
ValDev = ExisteArchivo(UnArchivo)
MsgBox "ExisteArchivo=" & ValDev & vbCrLf & UnArchivo
End Sub
Private Sub Command2_Click()
Dim ValDev As Boolean, UnArchivo As String
UnArchivo = "c:\autoexec.bat"
ValDev = ExisteArchivo(UnArchivo)
MsgBox "ExisteArchivo=" & ValDev & vbCrLf & UnArchivo
End Sub
Private Function ExisteArchivo(sNombreArchivo As String) As Boolean
Dim AttrDev%
On Error Resume Next
AttrDev = GetAttr(sNombreArchivo)
If Err.Number Then
Err.Clear
ExisteArchivo = False
Else
ExisteArchivo = True
End If
End Function
Hacer
Scroll en un Picture y en varios controles (26/Mar/97)
Dos ejemplos para hacer Scroll. Uno es en un Picture con una imagen y el otro usando
varios controles.
Espero que te sirva y lo puedas adaptar para tus necesidades.
En el ejemplo de varios controles también incluyo como restar horas y adaptándolo
puedes usarlo para restar fechas.
En el ejemplo de la imagen, incluyo una función para leer la línea de comandos y
quitarle las comillas, si es que se incluyen junto con el nombre del programa.
Baja los ejemplos que están en este archivo comprimido: (t_scroll.zip 5.62 KB)
(13/May/97) Los archivos están "corregidos" para que no
falle cuando la ventana se reduce "demasiado".
Gracias a "David Sans" dsans@abaforum.es
por la "aclaración".
Ejecutar
archivos con su programa asociado usando DDE (26/Mar/97)
En este ejemplo incluyo un módulo que hace tiempo vi por ahí, está en alemán, creo,
pero como las instrucciones de VB son "internacionales", por llamarlas de alguna
forma, pues es válido.
Para usarlo deberás tener un control Text o Label para aceptar DDE, en el ejemplo
siguiente es DDESystem
'Ejecutar el archivo o el programa asociado
If Exec(DDESystem, AddBSlash(File1.Path) & File1, False) = False Then
'No está asociado...
'MsgBox "'" & File1 & "' konnte nicht ausgeführt werden."
'Si no está asociado, mostrar la información...
MsgBox "'" & File1 & "' no está asociado a ningún programa."
End If
Este es el listado completo del archivo: Starter.Bas que es el que tiene las rutinas para ejecutar los programas, así como otras cosillas interesantes.
Baja los listados del ejemplo original, para VB3. (regdb.zip 9.25 KB)
Option Explicit
Global Const MB_RETRYCANCEL = 5
Global Const MB_ICONSTOP = 16
Global Const IDCANCEL = 2
Global Const IDRETRY = 4
'Declaraciones del API de Windows
#If Win32 Then
Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long
Declare Function RegQueryValue Lib "advapi32.dll" Alias "RegQueryValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpValue As String, lpcbValue As Long) As Long
Declare Function FindExecutable Lib "shell32.dll" Alias "FindExecutableA" (ByVal lpFile As String, ByVal lpDirectory As String, ByVal lpResult As String) As Long
Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
#Else
Declare Function GetProfileString% Lib "Kernel" (ByVal lpAppName$, ByVal lpKeyName$, ByVal lpDefault$, ByVal lpReturnedString$, ByVal nSize%)
Declare Function RegQueryValue& Lib "shell.dll" (ByVal hKey&, ByVal subkey$, ByVal buf$, buflen&)
Declare Function FindExecutable% Lib "shell.dll" (ByVal file$, ByVal dr$, ByVal result$)
Declare Function GetModuleHandle% Lib "Kernel" (ByVal lpModuleName$)
#End If
'Añade barra de directorio si no la tiene
Function AddBSlash(ByVal t As String) As String
If Len(t) Then
If Right$(t, 1) <> "\" Then
AddBSlash = t & "\"
Else
AddBSlash = t
End If
Else
AddBSlash = ""
End If
End Function
' Prüft, ob eine Anwendung für eine DDE-Kommunikation
' angemeldet wurde.
Function CanExtDDE(ByVal fext$, ByVal tp$) As Boolean
Dim dde$, class$
On Error Resume Next
class = QueryRegBase("." & fext)
If Len(class) Then
dde = QueryRegBase(class & "\shell\" & tp & "\ddeexec")
If Len(dde) Then
CanExtDDE = True
Else
CanExtDDE = False
End If
Else
CanExtDDE = False
End If
End Function
Function CountChar%(ByVal t, ByVal z%)
Dim g&, zeichen$, n&
On Error Resume Next
zeichen = Chr$(z)
Do
g = InStr(g + 1, t, zeichen)
n = n + 1
Loop While g
CountChar = n - 1
End Function
' Ejecuta el programa o el erchivo con el programa
' asociado
Function Exec(c As Control, ByVal fullname$, ByVal t%) As Boolean
Dim fpath$, FName$, fbody$, fext$, res%, para$, fn$, tp$
On Error Resume Next
If t = 0 Then tp = "open" Else tp = "print"
fn = GetAvailPart(fullname, 32, 1)
para = Right$(fullname, Len(fullname) - Len(fn) - 1)
' Übergabe in ihre Bestandteile zerlegen.
SplitPathname fullname, fpath, FName
SplitFilename FName, fbody, fext
' Ist die Datei eventuell ein ausführbares Programm? Die entsprechenden
' Dateiendungen stehen in der WIN.INI.
If IsFileOfType(fext, ReadWinIniString("windows", "programs", "")) Then
Exec = ExecPrograms(fullname, para)
Else
' Unterstützt die Anwendung, die zu fext gehört, DDE?
If CanExtDDE(fext, tp) Then
' mit DDE Kontakt zur Anwendung aufnehmen
Exec = ExecDocWithDDE(c, fullname, fpath, fext, tp)
Else
' Dokument als Parameter übergeben
Exec = ExecDocWithProgram(fullname, fpath, fext, tp)
End If
End If
End Function
' Steuert den Kontakt mit einer Anwendung via DDE, um ein
' Dokument in diese Anwendung einzulesen.
Function ExecDocWithDDE(c As Control, ByVal fullname$, ByVal fpath$, ByVal fext$, ByVal tp$) As Boolean
Dim topic$, application$, ddeexec$
Dim ifexec$, cmd$, class$
Dim fpath1$, FName$, fbody$, fext1$
On Error Resume Next
' Die Klasse kann mit Hilfe der Dateierweitung gefunden werden.
' Sie wird für alle folgenden Aufrufe benötigt.
class = QueryRegBase("." & fext)
If Len(class) Then
' Lese nötige Parameter aus der Registrationsdatenbank.
cmd = QueryRegBase(class & "\shell\" & tp & "\command")
ddeexec = QueryRegBase(class & "\shell\" & tp & "\ddeexec")
ifexec = QueryRegBase(class & "\shell\" & tp & "\ddeexec\ifexec")
If Len(ifexec) = 0 Then
' Die Angabe von ifexec ist optional. Wird Sie unterlassen, dann
' muß ddeexec benutzt werden.
ifexec = ddeexec
End If
topic = QueryRegBase(class & "\shell\" & tp & "\ddeexec\topic")
If Len(topic) = 0 Then
' Wenn kein Topic angegeben wird, dann wird System als
' Topic vorausgesetzt.
topic = "System"
End If
application = QueryRegBase(class & "\shell\" & tp & "\ddeexec\application")
If Len(application) = 0 Then
' Auch der Name der Applikation muß nicht in der
' Registrationsdatenbank stehen. Leider etwas mehr
' Arbeit für den Entwickler, da für application
' der Stammteil des Programmnamens benutzt wird.
SplitPathname cmd, fpath1, FName
SplitFilename FName, fbody, fext1
application = fbody
End If
' Ist das Programm vielleicht schon aktiv?
If GetModuleHandle(cmd) = 0 Then
' Nein, dann starten
If ExecPrograms(cmd, tp) = True Then
' in das ifexec-Kommando muß nun noch der Dokumentname
' einkopiert werden. Die passende Stelle ist mit
' %1 gekennzeichnet. replacestringpart übernimmt
' die Zeichenfriemelei.
' Zur Erinnerung: ifexec kann gleich ddeexec sein,
' wenn die Anwendung hier keinen Unterschied macht.
ifexec = ReplaceStringPart(ifexec, "%1", fullname)
' Endlich: Das DDE-Kommando in loaddocwithdde wird
' aufgerufen.
ExecDocWithDDE = LoadDocWithDDE(c, application, topic, ifexec)
Else
ExecDocWithDDE = False
End If
Else
' Das Programm ist aktiv und muß nicht gestartet werden.
' Ansonsten der gleiche Ablauf wie zuvor, jedoch mit
' ddeexec.
ddeexec = ReplaceStringPart(ddeexec, "%1", fullname)
ExecDocWithDDE = LoadDocWithDDE(c, application, topic, ddeexec)
End If
Else
ExecDocWithDDE = False
End If
End Function
Function ExecDocWithProgram(ByVal fullname$, ByVal fpath$, ByVal fext$, ByVal tp$) As Boolean
Dim res As Long
Dim buffer$, class$
On Error Resume Next
buffer = Space$(144)
class = QueryRegBase("." & fext)
If Len(class) Then
buffer = QueryRegBase(class & "\shell\" & tp & "\command")
If Len(buffer) Then
res = Shell(ReplaceStringPart(buffer, "%1", fullname), 1)
If Err = 0 Then
ExecDocWithProgram = True
Else
ExecDocWithProgram = False
End If
Exit Function
End If
End If
' Sucht das passende Programm zur Anwendung.
res = FindExecutable(fullname, CurDir$, buffer)
If (res >= 32) Or (res < 0) Then
' Laufwerk und Pfad als aktuell setzen.
ChDrive fpath
ChDir fpath
Err = 0
' Programm mit commandline-Parameter starten.
res = Shell(VBStr(buffer) & " " & fullname, 1)
If Err = 0 Then
ExecDocWithProgram = True
Else
ExecDocWithProgram = False
End If
Else
ExecDocWithProgram = False
End If
End Function
' Inicia un programa
Function ExecPrograms(ByVal fullname$, ByVal p$) As Boolean
Dim res As Long
On Error Resume Next
Err = 0
If Len(p) Then fullname = fullname & " " & p
res = Shell(fullname, 1)
If Err Then
ExecPrograms = False
Else
ExecPrograms = True
End If
End Function
Function GetAvailPart(t, ByVal z%, ByVal nr%)
Dim Zaehler%
On Error Resume Next
Zaehler = CountChar(t, z) + 1
If Zaehler >= nr Then GetAvailPart = GetStringPartX(t, Chr$(z), nr)
End Function
Function GetStringPartX(ByVal t, ByVal z$, ByVal nr%)
Dim i&, p&
On Error Resume Next
If Len(t) Then
t = t & z
nr = nr - 1
For i = 1 To nr
p = InStr(p + 1, t, z)
Next i
GetStringPartX = Mid$(t, p + 1, InStr(p + 1, t, z) - p - 1)
End If
End Function
' Prüft, ob eine Dateierweiterung in einer Auswahl von Möglichkeiten vorkommt.
' Die Erweiterungen in extensions müssen durch Leerzeichen voneinander
' getrennt sein. Beispiel: "exe com pif bat". Groß-/Kleinschreibung wird
' ignoriert.
Function IsFileOfType(ByVal checkextension$, ByVal extensions$) As Boolean
On Error Resume Next
If Len(checkextension) Then
If InStr(" " & UCase$(extensions) & " ", " " & UCase$(checkextension) & " ") Then
IsFileOfType = True
Else
IsFileOfType = False
End If
Else
IsFileOfType = False
End If
End Function
' Schickt einen DDE-Befehl an eine Anwendung. Hier speziell zum Laden
' von Dokumenten.
Function LoadDocWithDDE(c As Control, ByVal application$, ByVal topic$, ByVal cmd$) As Boolean
On Error Resume Next
c.LinkMode = 0
c.LinkTimeout = -1
c.LinkTopic = application & "|" & topic
c.LinkMode = 2
c.LinkExecute cmd
c.LinkMode = 0
If Err = 0 Then
LoadDocWithDDE = True
Else
LoadDocWithDDE = False
End If
End Function
' Liest einen String aus der Registrationsdatenbank. Um die Verwaltung
' einfach zu halten, beginnt die Suche immer in der ROOT der
' Datenbank.
'
Function QueryRegBase(ByVal entry As String) As String
Dim buf As String
Dim buflen As Long
On Error Resume Next
buf = Space$(300)
buflen = Len(buf)
' 1 = von ROOT aus lesen
' buflen wird von der Funktion geändert, deshalb wäre
' RegQueryValue(1, entry, buf, len(buf)) falsch.
'HKEY_CLASSES_ROOT
If RegQueryValue(HKEY_CLASSES_ROOT, entry, buf, buflen) = 0 Then
If buflen > 1 Then
' Die Rückgabe in buflen zählt chr$(0) am Ende mit
' Also ein Zeichen abziehen, aber natürlich nur dann,
' wenn chr$(0) nicht das einzige Zeichen in der Rückgabe ist.
QueryRegBase = Left$(buf, buflen - 1)
Else
QueryRegBase = ""
End If
Else
QueryRegBase = ""
End If
End Function
' Liest einen String aus der WIN.INI
Function ReadWinIniString$(ByVal section$, ByVal entry$, ByVal default$)
Dim buffer$, l As Long
On Error Resume Next
buffer = Space$(300)
l = GetProfileString(section, entry, default, buffer, Len(buffer))
ReadWinIniString = Left$(buffer, l)
End Function
' Einfache Suchen- und Ersetzenfunktion für Stringteile.
' Wenn src mehrfach gefunden wird, dann wird es auch mehrfach durch
' rpl ersetzt. Groß-/Kleinschreibung wird ignoriert, so daß
' sich die Funktion speziell für Pfadoperationen und ähnliches anbietet.
Function ReplaceStringPart$(ByVal source$, ByVal src$, ByVal rpl$)
Dim pos&
On Error Resume Next
src = UCase$(src)
pos = InStr(UCase$(source), src)
If src <> UCase$(rpl) Then
Do While pos
source = Left$(source, pos - 1) & rpl & Right$(source, Len(source) - pos - Len(src) + 1)
pos = InStr(pos + Len(rpl), UCase$(source), src)
Loop
End If
ReplaceStringPart = source
End Function
' Zerlegt einen Dateinamen ohne Pfad in den Stammteil des Namens
' und die Dateierweiterung.
' Für kompletten Dateinamen ggf. zuerst splitpathname aufrufen
Sub SplitFilename(ByVal FName$, fbody$, fext$)
Dim p As Integer
On Error Resume Next
p = InStr(FName, ".")
If p Then
fbody = Left$(FName, p - 1)
fext = Mid$(FName, p + 1, Len(FName) - p)
Else
fbody = FName
fext = ""
End If
End Sub
' Zerlegt einen kompletten Dateiname in Pfad und Dateiname ohne Pfad
Sub SplitPathname(ByVal fullname$, fpath$, FName$)
Dim i%, p%
On Error Resume Next
Do
p = i
i = InStr(i + 1, fullname, "\")
Loop While i
If p Then
fpath = Left$(fullname, p)
End If
FName = Right$(fullname, Len(fullname) - p)
End Sub
' Funktion zum Wandeln von ASCIIZ-Strings in VB-Strings.
' Entfernt auch führende und folgende Leerzeichen.
Function VBStr$(ByVal c$)
Dim pos&
pos = InStr(c, Chr$(0))
Select Case pos
Case Is > 1
VBStr = Trim$(Left$(c, pos - 1))
Case 1
VBStr = ""
Case 0
VBStr = Trim$(c)
End Select
End Function
Mis Utilidades, bueno no todas... sólo algunas. (20/Abr)
Estas son algunas de las funciones o procedimientos que,
más o menos, incluyo o utilizo en muchos de mis programas.
Las que pongo aquí, son algunas que no están puestas ya, pero que en las consultas que
hacéis, pues lo habéis preguntado más de uno.
El archivo que las contiene está en este link,
lo he puesto aparte, para que este no sea demasiado largo...
Te indico con un título, y el link, para que te sea más fácil localizarlas: