一?前言

  尽管Visual Basic并不是我最喜欢的开发工具,但我喜欢它简单而又丰富的库集。每当开发一个需要处理大量文本数据的应用程序时,需要具有拼写错误纠正功能,例如,微软的Word程序,当运行"拼写检查"时,将提供给你一个改正错误的机会(尽管是建议),它同时也提供了"查找替换"工具,用以进行用户定义的单词替换。这篇文章我将解释如何在VB应用程序中实现"查找替换"功能。

二?前提条件

  在解释代码的时候,我假定读者朋友们已经有使用Visual Basic的经验,熟悉Visual Studio开发环境中各种内置的控件及库函数(尽管我使用的不多)。我已经尝试着尽可能地简化程序代码,用不了多久你就可以明白程序的逻辑。如果想对一些库函数(如参数,语法)进一步详细地理解,可以参阅MSDN。图一是程序运行后的效果图:

图一、程序实现"查找替换"功能时的效果图

三?基础工作

  首先创建一个标准的EXE类型的VB工程,将默认窗体更名为frmMainForm ,在默认窗体上增添一个菜单,具体设置如下(符号"&"用于加速键,单词mnu后的名字用来说明菜单项的名字(在代码中使用)):

  &Edit
  ...&Find and Replace mnuFindandreplace
  E&xit mnuExit

  向默认窗体添加一个TextBox控件,命名为txtClientArea。使用鼠标调整控件位置和尺寸,使它覆盖窗体的整个客户区,在属性窗口将这个TextBox控件的 MultiLine属性设置为"True"。

  使用Project > Add Form菜单向工程中添加另外一个窗体,将这个窗体命名为"frmFindReplace",并在属性窗口中将它的BorderStyle属性设置为"4 - FixedToolWindow"。现在,添加两个TextBox控件,并分别命名为"txtSearchTerm"和"txtReplaceWithString"。添加一个复选框,命名为chkCaseSense。最后,添加一个命令按钮控件,命名为"cmdReplace"。

在frmMainForm窗体中添加如下代码:

Private Sub mnuExit_Click()
  End
End Sub

Private Sub mnuFindandreplace_Click()
  frmFindReplace.FindnReplace txtClientArea
End Sub

  从上面代码中可以非常明显地看出, 当点击Exit菜单时,我们想终结应用程序,当点击"Find and Replace"菜单时,想通过共用接口frmFindReplace及FindnReplace()方法来激活frmFindReplace窗体。这个公用的接口使查找算法具有普遍性,使用这个接口时,需要提供一个TextBox作为参数(在这里面,搜寻将被执行)。通过使用你自己的TextBox的名字来代替txtClientArea的名字,可以在多个文本框内执行"查找替换"功能,而不用更改代码。"查找和替换"的实现代码主要是在frmFindReplace窗体内,这个模块的代码如下:

' This variable is used for making the algorithm generic.
Dim txtClient As TextBox

' This method is the public interface to SnR functionality.

Public Sub FindnReplace(ByRef Tb As TextBox)
  Set txtClient = Tb
  Me.Show , txtClient.Parent
End Sub

Private Sub cmdReplace_Click()
  Dim CaseSense As Integer
  Dim SourceText As String
  Dim SourceTextCopy As String
  Dim Cnt As Integer

' Check for the case sensitivity options
  If (chkCaseSense.Value = vbChecked) Then
    CaseSense = 0
  Else
    CaseSense = 1
  End If

' One contains the original text and another contains replaced
  ' (updated) one.
  ' Used to check whether a replacement was done or not.
  SourceText = txtClient.Text
  SourceTextCopy = SourceText

If Len(SourceText) = 0 Then
    Exit Sub
  End If

On Error GoTo ErrHandler
  Dim SearchTermLen As Integer
  Dim FndPos As Integer

SearchTermLen = Len(txtSearchTerm.Text)
 
  ' Search from the begining of the document.
  Cnt = 1

' This is endless loop (terminated on a condition checked inside
  ' the loop body).
  While (1)

FndPos = InStr(Cnt, SourceText, txtSearchTerm.Text, CaseSense)
 
  ' When a match is found, replace it appropriately.
  If (FndPos > 0) Then
    SourceText = ReplaceFun(SourceText, FndPos, Len(txtSearchTerm.Text), txtReplaceWithString.Text)
    Cnt = FndPos + SearchTermLen
  Else
    Cnt = Cnt + 1
  End If

' Whether a replacement was done at all or not
  If (Cnt >= Len(SourceText)) Then
    txtClient.Text = SourceText
    If (SourceTextCopy <> SourceText) Then
      MsgBox "Finished replacing all occurrences.", vbInformation + vbOKOnly, "Replaced All"
    Else
      MsgBox "No matching strings found. No text replaced.", vbInformation + vbOKOnly, "No Replacement"
    End If
    Unload Me
    Exit Sub
  End If
  ' Else Restart from henceforth
  Wend
  Exit Sub

ErrHandler:
  Response = MsgBox("An error ocurred while searching. Inform the developer with details.", _
vbExclamation + vbOKOnly, "Error Searching")
End Sub

Private Sub Form_Load()
  ' Default SearchTerm must be the one selected by the user in
  ' MainForm
  If Len(txtClient.SelText) <> 0 Then
    txtSearchTerm.Text = txtClient.SelText
  End If
End Sub

Function ReplaceFun(Source As String, FromPos As Integer, _
Length As Integer, StringTBReplaced _
As String) As String
  ' Replaces a source string with new one appropriately
  Dim ResultStr As String

ResultStr = Left(Source, FromPos - 1)
  ResultStr = ResultStr & StringTBReplaced
  ResultStr = ResultStr & Right(Source, Len(Source) - FromPos - Length + 1)

ReplaceFun = ResultStr
End Function

Private Sub txtReplaceWithString_Change()
  Call EnableDisableReplaceButton
End Sub

Private Sub txtReplaceWithString_GotFocus()
  ' Select the contents of the textbox
  If Len(txtReplaceWithString.Text) <> 0 Then
    txtReplaceWithString.SelStart = 0
    txtReplaceWithString.SelLength = Len(txtReplaceWithString.Text)
  End If
End Sub

Private Sub txtSearchTerm_Change()
  Call EnableDisableReplaceButton
End Sub

Private Sub EnableDisableReplaceButton()
  If Len(txtSearchTerm.Text) <> 0 _
    And Len(txtReplaceWithString.Text) <> 0 Then
    cmdReplace.Enabled = True
  Else
    cmdReplace.Enabled = False
  End If
End Sub

Private Sub txtSearchTerm_GotFocus()
  ' Select the contents of textbox
  If Len(txtSearchTerm.Text) <> 0 Then
    txtSearchTerm.SelStart = 0
    txtSearchTerm.SelLength = Len(txtSearchTerm.Text)
  End If
End Sub

四?代码说明

  公用接口SearchnReplace的"查找替换"算法带有普遍性,使用这种方法,"查找替换"功能可以在任何应用程序中实现,而不用更改frmFindReplace的代码。只是在调用公用接口的地方需要做一些小的改动。

  "查找和替换"代码在cmdReplace_Click()过程与ReplaceFun() 函数下,让我们从cmdReplace_Click()过程开始。

  首先,变量CaseSense用于跟踪用户的选择,是否是大小写敏感,如果用户选择大小写敏感的话,它的值设置为0,否则,设置为1。变量SourceText和SourceTextCopy用于保存frmMainForm窗体中 txtClientArea的内容(或者是用户在主窗体中为TextBox提供的内容,对于本程序来说,它就是txtClientArea),两个变量保存同样的内容将在下面进行解释(一个是临时变量)。变量Cnt用来跟踪文档的结束,当重新从文档开始处进行"查找替换"时它将非常有用。这个变量含蓄地说明了当前光标的位置,下次的"查找替换"将从这个位置开始。
  主要的算法在while循环内,只要替换或是源TextBox被扫描时,这个循环都将被激活。

  第二步,我使用了InStr()库函数,它将从第一个参数规定的位置处开始搜索,如果在第二个参数字符串中发现与第三个字符串相匹配的子串,将返回该子串的位置。最后一个参数是大小写敏感选项。

  InStr()函数的返回值传递给FndPos,如果在源文档中发现了所要查找的字符串,这个值将大于0,否则将返回一个0值。在紧接着的IF语句中,首先替换SourceText变量,然后是通过FndPos + SearchTermLen语句修改Cnt变量,这是必须的, 因为下一次的"查找和替换"要从新的位置开始。另一方面,在Else部分,Cnt变量加一,说名查找和替换要从下一个字符开始。紧接着的几个语句用来通知用户查找结果,它们非常容易理解,也非常容易实现。可以直接跳过它们。

  最后,ReplaceFun()函数进行实际的替换工作,它从源字符串的左边开始,挑选出所有的字符,直到发现所搜索的字符串位置处为止。紧接着,StringTBReplace被添加到结果的后面,它将代替所匹配的源字符串。最后,所有的保留的源字符(排除所要更换的子字符串)被添加到这个结果中去,并作为结果返回。

五?结论

  有很多方法来实现这一功能,但我认为我所使用的方法是最简单也是最直接的,通过例子程序,你可以在应用程序中实现自己的"查找替换"功能。

VB应用程序中实现查找和替换功能相关推荐

  1. 计算机上的查找替换功能快速格式化,Word2013文档中使用查找和替换功能来快速更改文本格式的方法...

    在对文档进行处理时灵活使用Word的查找和替换功能将能够取得事半功倍的效果.下面介绍Word2013文档中使用查找和替换功能来快速更改文本格式的方法. 1.在"开始"选项卡中单击& ...

  2. 两个excel文档查找相同选项后替换_看似普通的查找和替换功能,用好了,能让你的工作效率翻一番...

    关注[新精英充电站]能力提升看得见! 在Word中,查找和替换功能是编辑文档时时常要用到的重要功能,它能帮助我们快速将文档或表格中查找到的内容或格式等替换为指定的内容或格式,特别是遇到大量需要修改的相 ...

  3. c 语言字符串查找替换,c ++ - 如何在标准字符串中搜索/查找和替换?

    c ++ - 如何在标准字符串中搜索/查找和替换? 有没有办法用std::string中的另一个字符串替换所有出现的子字符串? 例如: void SomeFunction(std::string&am ...

  4. Word中查找和替换功能详细介绍

    在Word中查找和替换功能很多人都会使用,最通常是用它来查找和替换文字,但实际上还可用查找和替换格式.段落标记.分页符和其他项目,并且还可以使用通配符和代码来扩展搜索. 一.查找和替换文字 例如:将& ...

  5. PyCharm中批量查找及替换

    选中需要操作的字符 Ctrl + R 替换 Ctrl + Shift + F 全局查找 Ctrl + Shift + R 全局替换 源自: PyCharm中批量查找及替换 - Ella_Wu - 博客 ...

  6. 在VB应用程序中调用Excel2000

    Visual Basic简称(VB)是设计Windows应用程序强有力的开发工具,"全球绝大多数Windows应用程序都是用VB开发的": Excel是目前使用最广泛的办公应用软件 ...

  7. php 查找文件 替换内容,关于php:文件中查找和替换功能困扰

    我知道这不是编程问题吗? 但是我需要另一个有关在PHP代码编辑器中查找和替换功能的帮助. 我正在使用eclipse和Dreamweaver,我有大约650个php文件,并希望替换所有文件中的字符串而无 ...

  8. win10搜索计算机中所有excel,win10系统用excel表格查找和替换功能的操作方法

    很多小伙伴都遇到过对win10系统用excel表格查找和替换功能的设置方法,想必大家都遇到过需要对win10系统用excel表格查找和替换功能进行设置的情况吧,那么应该怎么设置win10系统用exce ...

  9. 计算机一级中替换,计算机省一级B等级考试的“查找和替换”功能题型分析

    摘 要: 江苏省计算机一级B等级考试的Word操作题,要考Word的"查找和替换"功能.许多学生由于对此题型不太熟悉,丢分较严重.就此,本文通过对上机模拟试题和多套操作训练题的分析 ...

最新文章

  1. 编译boost时 cmake的debug:math命令无法解析“*”号
  2. python列表按照指定顺序排序-python列表排序、字典排序、列表中字典排序
  3. 2.标签CCLabelTTF,CCLabelAtlas,CCLabelBMFont
  4. oracle字符乱码的解决方法
  5. [Unity 游戏设计的元素]
  6. 运行SpringBoot时:Type javax.xml.bind.JAXBContext not present
  7. linux不显示无线网卡驱动安装失败,Linux_Ubuntu无线网卡驱动安装方法,安装了Ubuntu后发现没有无线网 - phpStudy...
  8. 线程池,远没你想象的那么简单
  9. 【深度学习】Batch Normalization详解
  10. Python+matplotlib绘制动态更新的柱状图
  11. 腾讯云大数据团队主导Apache社区新一代分布式存储系统Ozone 1.0.0发布
  12. VBS 与 VBA 的区别
  13. 3.2 LSTM、GRU RNN概述
  14. xmpp 即时通讯
  15. 计算机视觉知识点-人脸对齐
  16. 我的所有知识都来自大富翁游戏
  17. 基于Revel+Layui框架快速入门教程
  18. Kaggle文本可读性识别大赛银牌方案复盘
  19. windows 下的CACTI的安装方法
  20. 英语思维导图大全 定语从句(十四)

热门文章

  1. 李彦宏造神路线揭秘:23万粉丝超越马云李开复
  2. C++从0到1入门编程
  3. 学习积累——利用JAVA实现身份证图片正反面信息提取
  4. 离散数学1_第1章_复合命题与联结词
  5. 我的Linux PC开发环境
  6. 架构权衡评估方法(ATAM):如何评估一个系统的质量
  7. Django框架项目之课程主页——课程页页面、课程表分析、课程表数据、课程页面、课程接口、前台、后台
  8. 对技术要始终保持敬畏之心!!
  9. 常见网络设备及其功能
  10. 有奖试读 使用share SDK实现腾讯微博授权登录分享(1.x版本)