VB应用程序中实现“查找和替换”功能_VB.net_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

VB应用程序中实现“查找和替换”功能

作者:黑客防线网安VB教程基地 来源:黑客防线网安VB教程基地 浏览次数:0

黑客防线网安网讯:下载本文源代码    一、前言    尽管VisualBasic并不是我最喜欢的开发工具,但我喜欢它简单而又丰富的库集。每当开发一个需要处理大量文本数据的应用程序时,需要具有拼写错误纠正功...
下载本文源代码
  
  一、前言
  
  尽管VisualBasic并不是我最喜欢的开发工具但我喜欢它简单而又丰富的库集每当开发一个需要处理大量文本数据的应用程序时需要具有拼写错误纠正功能,例如,微软的Word程序,当运行"拼写检查"时,将提供给你一个改正错误的机会(尽管是建议),它同时也提供了"查找替换"工具,用以进行用户定义的单词替换这篇文章我将解释如何在VB应用程序中实现"查找替换"功能。
  
  二、前提条件
  
  在解释代码的时候,我假定读者朋友们已经有使用VisualBasic的经验,熟悉VisualStudio开发环境中各种内置的控件及库函数(尽管我使用的不多)。我已经尝试着尽可能地简化程序代码,用不了多久你就可以明白程序的逻辑。如果想对一些库函数(如参数,语法)进一步详细地理解,可以参阅MSDN。图一是程序运行后的效果图:
  
  ->
  图一、程序实现"查找替换"功能时的效果图->

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

  向默认窗体添加一个TextBox控件,命名为txtClientArea。使用鼠标调整控件位置和尺寸,使它覆盖窗体的整个客户区,在属性窗口将这个TextBox控件的MultiLine属性设置为"True"。
  
  使用Project>AddForm菜单向工程中添加另外一个窗体,将这个窗体命名为"frmFindReplace",并在属性窗口中将它的BorderStyle属性设置为"4-FixedToolWindow"。现在,添加两个TextBox控件,并分别命名为"txtSearchTerm"和"txtReplaceWithString"。添加一个复选框,命名为chkCaseSense。最后,添加一个命令按钮控件,命名为"cmdReplace"。
  
  在frmMainForm窗体中添加如下代码:
  
  ->PrivateSubmnuExit_Click()
   End
  EndSub
  
  PrivateSubmnuFindandreplace_Click()
   frmFindReplace.FindnReplacetxtClientArea
  EndSub->

  从上面代码中可以非常明显地看出,当点击Exit菜单时,我们想终结应用程序,当点击"FindandReplace"菜单时,想通过共用接口frmFindReplace及FindnReplace()方法来激活frmFindReplace窗体。这个公用的接口使查找算法具有普遍性,使用这个接口时,需要提供一个TextBox作为参数(在这里面,搜寻将被执行)。通过使用你自己的TextBox的名字来代替txtClientArea的名字,可以在多个文本框内执行"查找替换"功能,而不用更改代码。"查找和替换"的实现代码主要是在frmFindReplace窗体内,这个模块的代码如下:
  
  ->'Thisvariableisusedformakingthealgorithmgeneric.
  DimtxtClientAsTextBox
  
  'ThismethodisthepublicinterfacetoSnRfunctionality.
  
  PublicSubFindnReplace(ByRefTbAsTextBox)
   SettxtClient=Tb
   Me.Show,txtClient.Parent
  EndSub
  
  PrivateSubcmdReplace_Click()
   DimCaseSenseAsInteger
   DimSourceTextAsString
   DimSourceTextCopyAsString
   DimCntAsInteger
  
   'Checkforthecasesensitivityoptions
   If(chkCaseSense.Value=vbChecked)Then
  CaseSense=0
   Else
  CaseSense=1
   EndIf
  
   'Onecontainstheoriginaltextandanothercontainsreplaced
   '(updated)one.
   'Usedtocheckwhetherareplacementwasdoneornot.
   SourceText=txtClient.Text
   SourceTextCopy=SourceText
  
   IfLen(SourceText)=0Then
  ExitSub
   EndIf
  
   OnErrorGoToErrHandler
   DimSearchTermLenAsInteger
   DimFndPosAsInteger
  
   SearchTermLen=Len(txtSearchTerm.Text)
   'Searchfromthebeginingofthedocument.
   Cnt=1
  
   'Thisisendlessloop(terminatedonaconditioncheckedinside
   'theloopbody).
   While(1)
  
   FndPos=InStr(Cnt,SourceText,txtSearchTerm.Text,CaseSense)
  
   'Whenamatchisfound,replaceitappropriately.
   If(FndPos>0)Then
  SourceText=ReplaceFun(SourceText,FndPos,Len(txtSearchTerm.Text),txtReplaceWithString.Text)
  Cnt=FndPos SearchTermLen
   Else
  Cnt=Cnt 1
   EndIf
  
   'Whetherareplacementwasdoneatallornot
   If(Cnt>=Len(SourceText))Then
  txtClient.Text=SourceText
  If(SourceTextCopy<>SourceText)Then
   MsgBox"Finishedreplacingalloccurrences.",vbInformation vbOKOnly,"ReplacedAll"
  Else
   MsgBox"Nomatchingstringsfound.Notextreplaced.",vbInformation vbOKOnly,"NoReplacement"
  EndIf
  UnloadMe
  ExitSub
   EndIf
   'ElseRestartfromhenceforth
   Wend
   ExitSub
  
  ErrHandler:
   Response=MsgBox("Anerrorocurredwhilesearching.Informthedeveloperwithdetails.",_
  vbExclamation vbOKOnly,"ErrorSearching")
  EndSub
  
  PrivateSubForm_Load()
   'DefaultSearchTermmustbetheoneselectedbytheuserin
   'MainForm
   IfLen(txtClient.SelText)<>0Then
  txtSearchTerm.Text=txtClient.SelText
   EndIf
  EndSub
  
  FunctionReplaceFun(SourceAsString,FromPosAsInteger,_
  LengthAsInteger,StringTBReplaced_
  AsString)AsString
   'Replacesasourcestringwithnewoneappropriately
   DimResultStrAsString
  
   ResultStr=Left(Source,FromPos-1)
   ResultStr=ResultStr&StringTBReplaced
   ResultStr=ResultStr&Right(Source,Len(Source)-FromPos-Length 1)
  
   ReplaceFun=ResultStr
  EndFunction
  
  PrivateSubtxtReplaceWithString_Change()
   CallEnableDisableReplaceButton
  EndSub
  
  PrivateSubtxtReplaceWithString_GotFocus()
   'Selectthecontentsofthetextbox
   IfLen(txtReplaceWithString.Text)<>0Then
  txtReplaceWithString.SelStart=0
  txtReplaceWithString.SelLength=Len(txtReplaceWithString.Text)
   EndIf
  EndSub
  
  PrivateSubtxtSearchTerm_Change()
   CallEnableDisableReplaceButton
  EndSub
  
  PrivateSubEnableDisableReplaceButton()
   IfLen(txtSearchTerm.Text)<>0_
  AndLen(txtReplaceWithString.Text)<>0Then
  cmdReplace.Enabled=True
   Else
  cmdReplace.Enabled=False
   EndIf
  EndSub
  
  PrivateSubtxtSearchTerm_GotFocus()
   'Selectthecontentsoftextbox
   IfLen(txtSearchTerm.Text)<>0Then
  txtSearchTerm.SelStart=0
  txtSearchTerm.SelLength=Len(txtSearchTerm.Text)
   EndIf
  EndSub->

  四、代码说明
  
  公用接口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被添加到结果的后面,它将代替所匹配的源字符串。最后,所有的保留的源字符(排除所要更换的子字符串)被添加到这个结果中去,并作为结果返回。五、结论
  
  有很多方法来实现这一功能,但我认为我所使用的方法是最简单也是最直接的,通过例子程序,你可以在应用程序中实现自己的"查找替换"功能。->

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-14633-1.html
网站维护教程更新时间:2012-04-03 01:11:08  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer