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: