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 SubgsDlgBR.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 FunctionLo 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 SubEsto es todo por el momento, si tienes alguna duda o comentario, me lo dices por mail: [email protected]