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:\VBFILE\NEW\Textbox控件用法举例.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:\games\6do\oldtucom\heart\Story001.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.SelStart<>0ThenText1.SelStart=0

  Search=InputBox("请输入要查找的字词:")

  sFind=FindMyStr(Text1,Search)

  3.继续查找[就简单了]:

  DimsFindAsString

  sFind=FindMyStr(Text1,Search)

  这样,搜索功能就基本具备了,如再提供向上查找功能,则更令人满意。

  以上是笔者在学习、探索中的一些体会,在PWin98、VB中文企业版6.0下调试成功。如有不妥当之处,敬请各位高手斧正!http://hi.baidu.com/huazhongxu http://www.hv30.com

时间: 2024-08-31 06:41:04

VB谈WINDOWS记事本功能技术[二]的相关文章

浅谈Windows 8功能

从芯片组到用户体验,Windows 8将毫不迁就地为PC带来一系列新功能.Windows 8中的各种新功能,其中包括以下内容:触控优先用户界面.增强的基本功能.支持新一代的硬件. 触控优先用户界面: •Metro风格.Windows 8引入了专门为触控设备构建的Metro风格的新界面,该界面可显示对您很重要的信息,体现操作的简单性,并让您掌握控制权. •触控优先浏览,而不仅仅是在触控设备上浏览.通过提供快速流畅的触控浏览体验,Internet Explorer 10将网站置于新型Windows

求C#做的记事本中替换功能如何实现,网上找的代码都有bug,具体和windows记事本类似

问题描述 求C#做的记事本中替换功能如何实现,网上找的代码都有bug,具体和windows记事本类似 不一定要和windows记事本一模一样,只要没有bug 实现 替换就行 解决方案 reichtextbox.text.replace(oldstring,newsring)就可以了. 解决方案二: 查找会写吧.替换就是查找以后 textBox1..Selection = 你的替换文本 解决方案三: C#字符串替换函数就是replace,就算源代码有错,改改就行

Henry的VB.NET之旅(十二)—事件驱动

Henry的VB.NET之旅(十二)-事件驱动 韩睿 "可视继承原来这么方便!"我心中默默地感叹一声.一会儿之后,我抬头扫了一眼屏幕上的代码后,突然发现了一个新问题,按钮的单击事件程序现在已经变成了: VB.NET程序 VB程序 Private Sub btnProtected_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProtected.Click MsgBox("

利用 Windows 8 功能和 MVVM

Windows 8 引入了许多新功能,开发人员可利用这些功能创建引人注目的应用程 序和形式丰富的 UX.遗憾的是,这些功能并非总是易于进行单元测试.共享和辅助磁贴等功 能可提高应用程序的互动性和趣味,但也会变得不太易于测试. 在本文中,我将介绍 让应用程序可使用共享.设置.辅助磁贴.应用程序设置和应用程序存储等功能的多种不同 方式.通过使用模型-视图-视图模型 (MVVM) 模式.依赖注入和某些抽象,我将向您演示如 何利用这些功能,同时将表示层保持易于进行单元测试. 关于示例应用程序 为了说明将

win7怎么删除Windows Search功能

  Windows Search功能是win7旗舰版里面很多用户都会用到的一项系统功能,但是由于电脑硬件配置的问题,有些用户在老旧的电脑上运行该项功能就会导致卡甚至死机,所以这时候把这个功能卸载了也是一个优化win7旗舰版运行速度的一大方法,那今天就来跟着小编学习下win7旗舰版怎么删除Windows Search功能. 步骤一:首先我们使用鼠标的右键打开win7 64位旗舰版的桌面的"计算机",在菜单栏里面选择"属性"选项,进入了win7旗舰版的属性窗口中我们点击

保护内网安全之提高Windows AD安全性 (二)

本文讲的是保护内网安全之提高Windows AD安全性 (二),Active Directory的安全始于能确保安全地配置域控制器(DC). 在今年夏天的BlackHat USA大会上,我非常专业的提到了AD的安全,并提供了关于如何能够最好程度上保护Active Directory安全的一些提示. 这篇文章主要关注域控制器的安全性和一些跨越Active Directory的安全性.毕竟我的博客被称为"ADSecurity" - 本文将会涵盖一些通过保护域控制器(简称"域控&q

windows历史记录功能在java程序中如何实现

问题描述 windows历史记录功能在java程序中如何实现顺便问问在程序窗口外怎么捕捉鼠标事件 解决方案 解决方案二:+2++2+2+2解决方案三:这个没接触过,学学看吧

周卫林谈支付宝大数据技术实践及应用

文章讲的是周卫林谈支付宝大数据技术实践及应用,第三届Oracle技术嘉年华再度来袭!作为国内顶尖级别的Oracle数据库技术盛会,现场邀请到Jonathan Lewis,Tim Gorman等Oracle数据库领域国际级专家,特别为中国的数据库爱好者带来他们多年的总结与经验分享.另外,来自Linkedin.Salesforce.京东.1号店.百度.360.淘宝.阿里巴巴.支付宝.移动.联通等公司的核心数据库专家.架构师为各位朋友带来国内最新的数据库领域应用及最佳实践分享. ▲支付宝DW/BI高级

初学者,只需要很简单的vb.net实现的功能案例

问题描述 初学者,只需要很简单的vb.net实现的功能案例:在窗体内画直线(橡皮筋效果)画的直线能选择:删除,平移,调整,谢谢. 解决方案 解决方案二:说起来简单,做起来可不一定就简单了.解决方案三:说起来简单,做起来可不一定就简单了.解决方案四:Quote: 引用2楼rayyu1989的回复: 说起来简单,做起来可不一定就简单了.[/quot]没错,说起来简单,做起来可不一定简单了.这是我一直想说的感受.解决方案五:怎么就没大牛帮忙啊,不管是vb的还是C#都可以学习学习啊,有代码小弟定给分,如