Mis Utilidades

Diálogo para Buscar y Reemplazar

 

Actualizado: 22/Mar/97


Baja los listados y el ejemplo (gsdbr.zip 6.21 KB)


Esta utilidad es para implementar un diálogo al estilo de buscar/reemplazar, aunque sólo procesa los textos a usar, no hace la búsqueda ni el reemplazo de las cadenas especificadas.

Hay varias constantes y variables globales para las distintas acciones/opciones. Asimismo existen dos funciones para las acciones de Buscar y Reemplazar.
Las constantes/variables globales que se suelen usar son:

'Variables globales
iDBRAccion		Especifica la acción a tomar/Devuelve la acción tomada.
sDBRIni			Archivo o clave del registro en el que se almacenarán
			los últimos datos especificados en las cajas de buscar y reemplazar.

'Constantes para la acción a realizar o el botón pulsado

cDBRAc_IDLE		Ninguna acción
cDBRAc_Buscar		Se ha pulsado en Buscar o Siguiente
cDBRAc_BuscarSiguiente	Si se debe mostrar Siguiente en lugar de Buscar
cDBRAc_Reemplazar	Se ha pulsado en el botón de Reemplazar
cDBRAc_ReemplazarTodo	Se ha pulsado en el botón de Reemplazar todo
cDBRAc_Cancelar		Se ha cancelado el proceso.

El modo de usar las funciones es:

iAccion = gsBuscar(QueBusco [, Acción] [, "Caption"])
iAccion = gsReemplazar(QueBusco, QuePongo [, Acción] [, "Caption"])

Bien, vamos a ver como quedan los forms y el código usado tanto el del diálogo como en el ejemplo.

Los módulos necesarios para esta implementación son:
gsDlgBR.Frm (form para la entrada de datos)

El código de este form:

'----------------------------------------------------
'Form genérico para diálogo Buscar/Reemplazar
'
'©Guillermo Som Cerezo, 1996-97
'----------------------------------------------------
Option Explicit

Const NumeroMaximoDeItems = 100
Dim bBuscandoEnCombo As Boolean


Private Sub cmdCancel_Click()
    ActualizarCombo
    
    iDBRAccion = cDBRAc_Cancelar
    Unload Me
End Sub


Private Sub cmdFindNext_Click()
    ActualizarCombo
    sDBRBuscar = txtFind.Text
    sDBRPoner = ""
    
    iDBRAccion = cDBRAc_BuscarSiguiente
    Unload Me
End Sub


Private Sub cmdReplace_Click()
    ActualizarCombo
    sDBRBuscar = txtFind.Text
    sDBRPoner = txtReplace.Text
    If Len(sDBRPoner) = 0 Then
        iDBRAccion = cDBRAc_Buscar
    Else
        iDBRAccion = cDBRAc_Reemplazar
    End If
    Unload Me
End Sub


Private Sub cmdReplaceAll_Click()
    ActualizarCombo
    sDBRBuscar = txtFind.Text
    sDBRPoner = txtReplace.Text
    If Len(sDBRPoner) = 0 Then
        iDBRAccion = cDBRAc_Buscar
    Else
        iDBRAccion = cDBRAc_ReemplazarTodo
    End If
    Unload Me
End Sub


Private Sub Combo1_Change(Index As Integer)
    
    If bBuscandoEnCombo Then Exit Sub
    
    If Index = 0 Then
        txtFind = Combo1(0).Text
    Else
        txtReplace = Combo1(1).Text
    End If
End Sub


Private Sub Combo1_Click(Index As Integer)
    
    If bBuscandoEnCombo Then Exit Sub
    
    If Combo1(Index).ListIndex Then
        Combo1(Index).Text = Combo1(Index).List(Combo1(Index).ListIndex)
    End If
    If Index = 0 Then
        txtFind = Combo1(Index).Text
    Else
        txtReplace = Combo1(Index).Text
    End If
End Sub


Private Sub Form_Load()
    Dim j As Integer
    Dim i As Integer
    Dim n As Integer
    Dim vTmp
    Dim sTmp As String
    Dim sTag As String
    
    'Posicionar en el centro de la ventana principal
    Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
    'asignar los valores anteriores del combo
    For i = 0 To 1
        sTag = Trim$(Combo1(i).Tag)
        n = 0
        n = GetSetting(sDBRIni, sTag, "NumEntradas", n)
        If n > NumeroMaximoDeItems Then n = NumeroMaximoDeItems
        For j = 0 To n - 1
            vTmp = "Entrada" & CStr(j)
            sTmp = GetSetting(sDBRIni, sTag, vTmp, "")
            If Len(sTmp) Then
                Combo1(i).AddItem sTmp
            End If
        Next
    Next
    Combo1(0).Text = ""
    Combo1(1).Text = ""
End Sub


Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    'Si se cierra por el controlbox, o cualquier forma distinta del propio código,
    'asumir que se ha cancelado.
    If UnloadMode <> vbFormCode Then
        iDBRAccion = cDBRAc_Cancelar
    End If
End Sub


Private Sub Form_Unload(Cancel As Integer)
    Dim n As Integer
    Dim vTmp
    Dim sTmp As String
    Dim i As Integer
    Dim j As Integer
    Dim sTag As String
    
    If iDBRAccion <> cDBRAc_Cancelar Then
        ActualizarCombo
        For i = 0 To 1
            n = Combo1(i).ListCount
            sTag = Trim$(Combo1(i).Tag)
            If n > NumeroMaximoDeItems Then n = NumeroMaximoDeItems
            SaveSetting sDBRIni, sTag, "NumEntradas", n
            For j = 0 To n - 1
                vTmp = "Entrada" & CStr(j)
                sTmp = Combo1(i).List(j)
                SaveSetting sDBRIni, sTag, vTmp, sTmp
            Next
        Next
    End If
    Set gsDBR = Nothing
End Sub


Private Sub ActualizarCombo()
    '-----------------------------------------------------
    'Esta rutina actualiza el contenido de los dos combos,
    'si la entrada en el Combo.Text no está, la incluye.
    'Se podría usar la llamada al API de Windows.
    '-----------------------------------------------------
    'Actualizar el contenido del Combo
    Dim sTmp As String
    'Para más rapidez...
    Static i As Integer
    Static j As Integer
    Static hallado As Boolean
    Static k As Integer
    '
    bBuscandoEnCombo = True
    For k = 0 To 1
        hallado = False
        sTmp = Combo1(k).Text
        If Len(Trim$(sTmp)) Then
            j = Combo1(k).ListCount - 1
            For i = 0 To j
                If StrComp(Trim$(sTmp), Trim$(Combo1(k).List(i))) = 0 Then
                    hallado = True
                    Exit For
                End If
            Next
            If Not hallado Then
                Combo1(k).AddItem sTmp, 0
            End If
        End If
    Next
    bBuscandoEnCombo = False
End Sub

gsDlgBR.Bas (módulo con las funciones y declaraciones). Este es el código:

'------------------------------------------------------------------
'Módulo para el diálogo de Buscar/Reemplazar
'
'©Guillermo Som Cerezo, 1996-97
'
'Contiene las funciones necesarias para llamara al diálogo
'(este módulo se podría convertir en una clase, es una idea sólo)
'
'------------------------------------------------------------------

Option Explicit

'Declaración de variables y constantes para el diálogo de Buscar/Reemplazar
'
'Variables y constantes para buscar/reemplazar
Global sDBRBuscar As String
Global sDBRPoner As String
Global iDBRAccion As Integer

'Constantes para la acción a realizar
Global Const cDBRAc_IDLE = 0
Global Const cDBRAc_Buscar = 1
Global Const cDBRAc_BuscarSiguiente = 2
Global Const cDBRAc_Reemplazar = 3
Global Const cDBRAc_ReemplazarTodo = 4
Global Const cDBRAc_Cancelar = True
Global Const cDBRAc_Aceptar = 5

Global sDBRIni As String                     'Archivo de configuración


Public Function gsBuscar(sBuscar As String, Optional vModo, Optional vCaption) As Integer
    'Prepara el diálogo para buscar
    Dim iModo As Integer
    Dim sCaption As String
    
    If IsMissing(vModo) Then
        iModo = cDBRAc_Buscar
    Else
        iModo = vModo
    End If
    'Sólo permitir buscar y buscar-siguiente
    Select Case iModo
    Case cDBRAc_Buscar, cDBRAc_BuscarSiguiente
        'está bien, no hay nada que hacer
    Case Else
        iModo = cDBRAc_Buscar
    End Select
    
    If IsMissing(vCaption) Then
        sCaption = "Buscar"
    Else
        sCaption = CStr(vCaption)
    End If
    
    sDBRBuscar = sBuscar
    iDBRAccion = cDBRAc_IDLE
    With gsDBR
        .Caption = sCaption
        .cmdReplace.Visible = False
        .lblReplace.Visible = False
        .cmdReplaceAll.Visible = False
        .Combo1(1).Visible = False
        .cmdFindNext.Left = .cmdReplaceAll.Left
        If iModo = cDBRAc_BuscarSiguiente Then
            .cmdFindNext.Caption = "Siguiente"
            DoEvents
        End If
        .Combo1(0).Text = sDBRBuscar
	'Mostrar el form y esperar a que se tome una acción
	.Show vbModal
    End With
    'Devolver la cadena seleccionada/introducida
    sBuscar = sDBRBuscar
    'Devolver la acción
    gsBuscar = iDBRAccion
End Function


Public Function gsReemplazar(sBuscar As String, sPoner As String, Optional vModo, Optional vCaption) As Integer
    'Prepara el diálogo de Reemplazar
    Dim iModo As Integer
    Dim sCaption As String
    
    If IsMissing(vModo) Then
        iModo = cDBRAc_Buscar
    Else
        iModo = vModo
    End If
    'Sólo permitir buscar y buscar-siguiente
    Select Case iModo
    Case cDBRAc_Buscar, cDBRAc_BuscarSiguiente
        'está bien, no hay nada que hacer
    Case Else
        iModo = cDBRAc_Buscar
    End Select
    
    If IsMissing(vCaption) Then
        sCaption = "Reemplazar"
    Else
        sCaption = CStr(vCaption)
    End If
    
    sDBRBuscar = sBuscar
    iDBRAccion = cDBRAc_IDLE
    With gsDBR
        .Caption = sCaption
        .cmdFindNext.Default = False
        .cmdFindNext.Visible = False
        .cmdReplaceAll.Default = True
        .Combo1(0).Text = sBuscar
        .Combo1(1).Text = sPoner
        'Mostrar el form y esperar a que se tome una acción
	.Show vbModal
    End With
    'Devolver la cadena a reemplazar y buscar
    sBuscar = sDBRBuscar
    sPoner = sDBRPoner
    'Si tanto buscar como poner están en blanco, devolver cancelar
    If Len(Trim$(sBuscar)) = 0 Then
        If Len(Trim$(sPoner)) = 0 Then
            iDBRAccion = cDBRAc_Cancelar
        End If
    End If
    gsReemplazar = iDBRAccion
End Function

Lo que viene a continuación es el form de prueba, no efectua ni la búsqueda ni el reemplazo de datos, sólo es un interface de comprobación del diálogo aquí descrito.
Si crees que sería conveniente hacer una rutina de ejemplo para buscar y reemplazar datos reales, comentamelo y veremos que podemos hacer.

El código usado:

'-----------------------------------------------------------
'Form de prueba para el diálogo de Buscar/Reemplazar gsFind
'©Guillermo Som Cerezo,                         (22/Mar/97)
'-----------------------------------------------------------
Option Explicit


Private Sub cmdBuscar_Click()
    'Mostrar el diálogo para buscar los datos
    '
    Static sQueBusco As String
    Dim iAccion As Integer
    Static lUltimaPosicion As Long
    
    If Len(sQueBusco) = 0 Then
        If Text1.SelLength Then
            sQueBusco = Text1.SelText
        End If
        iAccion = cDBRAc_Buscar
    Else
        iAccion = cDBRAc_BuscarSiguiente
    End If
    If gsBuscar(sQueBusco, iAccion, "Buscar en el TextBox") <> cDBRAc_Cancelar Then
        'proceder a la búsqueda
        MsgBox "El texto especificado para buscar es:" & vbCrLf & sQueBusco, vbInformation
    Else
        MsgBox "Se ha cancelado la acción de buscar", vbExclamation
    End If
    
End Sub


Private Sub cmdReemplazar_Click()
    'Mostrar el diálogo para reemplazar
    '
    Dim sQueBusco As String
    Dim sQuePongo As String
    Dim iAccion As Integer
    
    If Text1.SelLength Then
        sQueBusco = Text1.SelText
    End If
    iAccion = gsReemplazar(sQueBusco, sQuePongo, cDBRAc_Reemplazar)
    If iAccion <> cDBRAc_Cancelar Then
        'proceder a la búsqueda/reemplazo
        '
        MsgBox "El texto a buscar es: " & sQueBusco & vbCrLf _
             & "El texto a poner es: " & sQuePongo & vbCrLf _
             & "La acción a realizar es: " & CStr(iAccion), vbInformation
    Else
        MsgBox "Se ha cancelado la acción de reemplazar, o no se ha especificado nada para buscar y reemplazar.", vbExclamation
    End If

End Sub


Private Sub cmdSalir_Click()
    Unload Me
    End
End Sub


Private Sub Form_Load()
    'Archivo de configuración para buscar/reemplazar
    sDBRIni = "t_gsFind.ini"
    
End Sub


Private Sub Form_Resize()
    'Si se minimiza, ni caso
    If WindowState = vbMinimized Then Exit Sub
    
    'Ajustar el tamaño y la posición de los controles
    With cmdSalir
        .Top = ScaleHeight - 510
        .Left = ScaleWidth - 1410
        cmdBuscar.Top = .Top - 540
        cmdBuscar.Left = .Left
        cmdReemplazar.Top = .Top - 540
        cmdReemplazar.Left = .Left - 1350
        Text1.Width = ScaleWidth - 180
        Text1.Height = cmdBuscar.Top - 255
    End With
    
End Sub


Private Sub Form_Unload(Cancel As Integer)
    Set Form1 = Nothing
End Sub

Esto es todo por el momento, si tienes alguna duda o comentario, me lo dices por mail: mensaje@elguille.info