用VB实现象Windows记事本的一些功能

超越衣切

超越衣切

2016-02-19 21:46

有一种朋友不在生活里,却在生命力;有一种陪伴不在身边,却在心间。图老师即在大家的生活中又在身边。这么贴心的服务你感受到了吗?话不多说下面就和大家分享用VB实现象Windows记事本的一些功能吧。
内容:讨论如何在用VB编写的记事中实现自动将日志添加到文档尾部、判断保存还是另存为、确认文件是否需要保存等功能。
  
  Windows自带的记事本即Notepad有一些功能还是颇具吸引力的,比如自动在特定的文档尾部加入计算机时钟的时间和日期,截取已经打开或者保存了的纯文档名[见记事本的标题栏]以及搜索等,给用户带来许多方便。本文就TextBox控件讨论如何实现这些功能。
  
  一、将日志添加到文档
  
  在Windows中,如果文档的第一行最左边有".LOG"字样,那么每次用记事本打开此文时,记事本会自动在文档尾部加入时间日期。
  ".LOG"共占四个字节,又置于文档第一行顶格处,因此可以用VB的Left函数来读取这个字符串,如有,则用CStr函数来自动添加时间和日期。
  我们可以在打开文件的程序加入以下代码:
  
  DimaAsString
  a=Left(Text1.Text,4)'取得头4个字节
  Ifa=".LOG"Then'若有则:
  Text1.SelStart=Len(Text1.Text)'光标移到文件尾
  Text1.SelText=vbCrLf&CStr(Now)'加入换行和时间
  Else'若无,退出过程
  ExitSub
  EndIf
  
  这样,我们用VB编写的记事本就和Windows的Notepad一样具有自动将日志添加到文档的功能了。
  
  二、截取FileName中的纯文档名
  
  如若我们用Notepad打开文件D:VBFILENEWTextbox控件用法举例.txt,Notepad的标题栏的Caption变为:TextBox控件用法举例-记事本。这个,我们用VB来完成还是比较容易的。
  
  为了方便在程序的各处使用,我们不妨编写一个截取字符串的函数:
  
  '截取纯文栏名函数
  FunctionGetFileTitle(OldStrAsString)AsString
  
  OnErrorResumeNext
  DimnAsInteger,mAsInteger'声明字符串变量
  DimiAsString,rAsString
  DimpAsInteger
  i=""'要查找的指定字符
  Forn=1ToLen(OldStr)'用Len函数计算已知字符串的字节数
  m=InStrRev(OldStr,i,-1)'""所在的位置(其中的-1是默认的)
  Nextn'找下去!
  
  '截取最后一个""后面的字符串
  r=Right(OldStr,Len(OldStr)-m)'获取Title
  p=InStrRev(r,".",-1)'"."所在位置
  GetFileTitle=Left(r,p-1)'去掉后缀
  
  EndFunction
  
  现在我们来调用这个函数以获取纯文档名:
  
  DimMyStrAsString,ResultAsString
  MyStr="d:games6dooldtucomheartStory001.TXT"
  Result=GetFileTitle(MyStr)
  Me.Caption=Result&"-记事本"
  
  执行之,则窗体的标题变为:Story001-记事本,与NotePad的效果无异!
  
  三、判断保存还是另存为
  
  通常,我们通过使用CommonDialog控件来保存文件,不过,VB的公共对话框提供的ShowSave其实只是SaveAs,如不作处理则在运行程序中每次保存文件都会跳出另存为对话框,为避免这种不便,我们可以声明一个窗体级或模块级的文件名变量[类型:String],并在每一次相关操作中给此变量赋值且保存于内存之中,然后在保存文件时给予识别,如变量不为空则直接保存文件,否则调出另存为对话框,让用户输入文件名。
  试看:
  
  DimSaveFileNameAsString'窗体或模块级变量
  
  '在打开文件事件加入:
  SaveFileName=CommonDialog1.FileName
  
  '保存文件
  IfSaveFileName""Then
  OpenSaveFileNameForInputAs#1
  Print#1,Text1.Text
  Close#1
  Else
  '此处写上用公共对话框保存文件的代码
  EndIf
  
  这样,我们的记事本变得象Notepad一样聪明了:那令人讨厌的另存为对话框不会总是弹出来了!
  
  四、从“我的电脑”拖动文件并打开
  
  当从“我的电脑”拖动文件到Notepad编辑界面,文件格式正确的话则自动打开。在VB中,我们可以这样处理:
  
  1.在Form_Load事件中加入:
  
  Text1.OLEDropMode=1'令Text1成为可接受文件拖放的OLE容器
  
  2.采用OLE技术实现拖放并打开功能:
  
  '当文件拖到文本框
  PrivateSubText1_OLEDragOver(dataAsDataObject,effectAsLong,_
  ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle,_
  StateAsInteger)
  Ifdata.GetFormat(vbCFFiles)Then'如是文件则显示可放下图标
  effect=vbDropEffectCopyAndeffect
  Else'否则显示不可放下图标
  effect=vbDropEffectNone
  EndIf
  EndSub
  
  '当文件被放下
  PrivateSubText1_OLEDragDrop(dataAsDataObject,effectAsLong,_
  ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
  
  DimsFileName$AsString'放下的文件名变量
  '检查放下的东西是不是文件名
  Ifdata.GetFormat(vbCFFiles)=TrueThen'如是则sFileName=data.Files(1)'只读取第一个文件信息
  OnErrorResumeNext'出错处理:不予理睬
  '在TextBox中打开文件
  OpensFileNameForInputAs#1
  IfmnuComb(0).CheckedThenText1.Text=Text1.Text&StrConv(InputB$_
  (LOF(1),1),vbUnicode):MyLen=Len(Text1.Text)
  IfmnuComb(1).CheckedThenText1.Text=StrConv(InputB$(LOF(1),1),_
  vbUnicode):MyLen=Len(Text1.Text)
  Close#1
  EndIf
  EndSub
  
  注意:可要记得写出错处理代码,否则……你知道的。
  
  五、确认文件是否需要保存
  
  从当前状态退出程序或转移到其它状态如新建文件、打开文件等,如若当前文件已经改变而用户又没有保存,应该提醒用户要不要保存已做的改变。这一点Notepad是有的,在VB中该怎么办呢?
  我们可以声明一个布尔变量,用来记录文本框是否有了改变,并利用TextBox控件的Change事件来监视文本框的状态,若有变化,则改变变量值。
  
  1.模块或窗体级声明:
  
  DimAskAsBoolean
  
  2.在Form_Load中:
  
  Ask=False'初值
  
  3.在Text1_Change中加入:
  
  Ask=True
  
  4.退出程序或转移到新的状态时:
  
  IfAsk=Truethen
  DimFlagAsInteger,MsgStrAsString
  MsgStr="文件已经改变,是否要存盘?"'提示语
  Flag=MsgBox(MsgStr,vbYesNoCancel,"提示")'给予提示
  IfFlag=vbYesThenSaveIt'选择了确定则保存之:这里假定已有了一个保存文件的子过程SaveIt
  IfFlag=vbCancelThenExitSub
  IfFlag=vbNoThenCancel=False
  EndIf
  '......这里写上其它主要处理事件代码
  Ask=False'操作结束令其为假,以免老提示
  
  六、搜索功能
  
  Notepad提供了查找和继续查找字符串的功能。VB中,控件TextBox并不象RichTextBox控件那样提供了Find方法。这样我们只好求助于VB的一些内部函数了。以下是笔者自行编写的一个专用于TextBox控件中查找字符串的函数,函数中用上了VB的InStr等内部函数,这里就不多作解释了。
  
  '查找字符串函数[可置于模块或窗体级中]
  FunctionFindMyStr(MyNameAsTextBox,SearchStrAsString)AsInteger
  DimWhere'获取需要查找的字符串变量
  DimStartAsInteger
  MyName.SetFocus'文本框获得焦点,以显示所找到的内容
  Start=MyName.SelStart MyName.SelLength 1
  Where=InStr(Start,MyName.Text,SearchStr)'在文本中查找字符串
  IfWhereThen
  '若找到则设置选定的起始位置并使找到的字符串高亮
  'FindStr=Where-1
  MyName.SelStart=Where-1
  MyName.SelLength=Len(SearchStr)
  '否则给出提示
  Else:MsgBox"未找到所要查找的字符串。",vbInformation,"提示"
  EndIf
  EndFunction
  
  有了这个函数,我们可以这样查找和继续查找字符串:
  
  1.在窗体级声明:
  
  DimSearchAsString'声明要查找的变量
  
  2.第一次查找:
  
  DimsFindAsString
  '若光标不在开头处则令其回到开头
  IfText1.SelStart0ThenText1.SelStart=0
  Search=InputBox("请输入要查找的字词:")
  sFind=FindMyStr(Text1,Search)
  
  3.继续查找[就简单了]:
  
  DimsFindAsString
  sFind=FindMyStr(Text1,Search)
  
  这样,搜索功能就基本具备了,如再提供向上查找功能,则更令人满意。
  
  以上是笔者在学习、探索中的一些体会,在PWin98、VB中文企业版6.0下调试成功。如有不妥当之处,敬请各位高手斧正!->

展开更多 50%)
分享

猜你喜欢

用VB实现象Windows记事本的一些功能

编程语言 网络编程
用VB实现象Windows记事本的一些功能

用authorwre做记事本

设计软件 平面设计软件 广告设计软件
用authorwre做记事本

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

QQ邮箱正式推出记事本功能

聊天软件
QQ邮箱正式推出记事本功能

用Java编写的记事本程序

编程语言 网络编程
用Java编写的记事本程序

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

天天记事删除记事本方法

手机软件 应用软件
天天记事删除记事本方法

傲游浏览器记事本功能

浏览器
傲游浏览器记事本功能

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

用Excel做数据说明——移动平均

用Excel做数据说明——移动平均

最新QQ签名档:只是再也回不去 源于精选QQ签名

最新QQ签名档:只是再也回不去 源于精选QQ签名
下拉加载更多内容 ↓