王朝网络
分享
 
 
 

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

王朝厨房·作者佚名  2007-01-04
宽屏版  字体: |||超大  

作者:土人

内容:讨论如何在用VB编写的记事中实现 自动将日志添加到文档尾部、判断保存还是另存为、确认文件是否需要保存 等功能。

Windows自带的记事本即Notepad有一些功能还是颇具吸引力的,比如自动在特定的文档尾部加入计算机时钟的时间和日期,截取已经打开或者保存了的纯文档名[见记事本的标题栏]以及搜索等,给用户带来许多方便。本文就TextBox控件讨论如何实现这些功能。

一、将日志添加到文档

在Windows中,如果文档的第一行最左边有".LOG"字样,那么每次用记事本打开此文时,记事本会自动在文档尾部加入时间日期。

".LOG"共占四个字节,又置于文档第一行顶格处,因此可以用VB的Left函数来读取这个字符串,如有,则用CStr函数来自动添加时间和日期。

我们可以在打开文件的程序加入以下代码:

Dim a As String

a = Left(Text1.Text, 4) ’取得头4个字节

If a = ".LOG" Then ’若有则:

Text1.SelStart = Len(Text1.Text) ’光标移到文件尾

Text1.SelText = vbCrLf & CStr(Now) ’加入换行和时间

Else ’若无,退出过程

Exit Sub

End If

这样,我们用VB编写的记事本就和Windows的Notepad一样具有自动将日志添加到文档的功能了。

二、截取FileName中的纯文档名

如若我们用Notepad打开文件D:\VBFILE\NEW\Textbox控件用法举例.txt,Notepad的标题栏的Caption变为:TextBox控件用法举例 - 记事本。这个,我们用VB来完成还是比较容易的。

为了方便在程序的各处使用,我们不妨编写一个截取字符串的函数:

’截取纯文栏名函数

Function GetFileTitle(OldStr As String) As String

On Error Resume Next

Dim n As Integer, m As Integer ’声明字符串变量

Dim i As String, r As String

Dim p As Integer

i = "\" ’要查找的指定字符

For n = 1 To Len(OldStr) ’用Len函数计算已知字符串的字节数

m = InStrRev(OldStr, i, -1) ’"\"所在的位置(其中的-1是默认的)

Next n ’找下去!

’截取最后一个"\"后面的字符串

r = Right(OldStr, Len(OldStr) - m) ’获取Title

p = InStrRev(r, ".", -1) ’"."所在位置

GetFileTitle = Left(r, p - 1) ’去掉后缀

End Function

现在我们来调用这个函数以获取纯文档名:

Dim MyStr As String, Result As String

MyStr = "d:\games\6do\oldtucom\heart\Story001.TXT"

Result = GetFileTitle(MyStr)

Me.Caption = Result & " - 记事本"

执行之,则窗体的标题变为:Story001 - 记事本,与NotePad的效果无异!

三、判断保存还是另存为

通常,我们通过使用CommonDialog控件来保存文件,不过,VB的公共对话框提供的ShowSave其实只是Save As,如不作处理则在运行程序中每次保存文件都会跳出另存为对话框,为避免这种不便,我们可以声明一个窗体级或模块级的文件名变量[类型:String],并在每一次相关操作中给此变量赋值且保存于内存之中,然后在保存文件时给予识别,如变量不为空则直接保存文件,否则调出另存为对话框,让用户输入文件名。

试看:

Dim SaveFileName As String ’窗体或模块级变量

’在打开文件事件加入:

SaveFileName = CommonDialog1.FileName

’保存文件

If SaveFileName <> "" Then

Open SaveFileName For Input As #1

Print #1, Text1.Text

Close #1

Else

’此处写上用公共对话框保存文件的代码

End If

这样,我们的记事本变得象Notepad一样聪明了:那令人讨厌的另存为对话框不会总是弹出来了!

四、从“我的电脑”拖动文件并打开

当从“我的电脑”拖动文件到Notepad编辑界面,文件格式正确的话则自动打开。在VB中,我们可以这样处理:

1.在Form_Load事件中加入:

Text1.OLEDropMode = 1 ’令Text1成为可接受文件拖放的OLE容器

2.采用OLE技术实现拖放并打开功能:

’当文件拖到文本框

Private Sub Text1_OLEDragOver(data As DataObject, effect As Long, _

Button As Integer, Shift As Integer, X As Single, Y As Single, _

State As Integer)

If data.GetFormat(vbCFFiles) Then ’如是文件则显示可放下图标

effect = vbDropEffectCopy And effect

Else ’否则显示不可放下图标

effect = vbDropEffectNone

End If

End Sub

’当文件被放下

Private Sub Text1_OLEDragDrop(data As DataObject, effect As Long, _

Button As Integer, Shift As Integer, X As Single, Y As Single)

Dim sFileName$ As String ’放下的文件名变量

’检查放下的东西是不是文件名

If data.GetFormat(vbCFFiles) = True Then ’如是则 sFileName = data.Files(1) ’只读取第一个文件信息

On Error Resume Next ’出错处理:不予理睬

’在TextBox中打开文件

Open sFileName For Input As #1

If mnuComb(0).Checked Then Text1.Text = Text1.Text & StrConv(InputB$ _

(LOF(1), 1), vbUnicode): MyLen = Len(Text1.Text)

If mnuComb(1).Checked Then Text1.Text = StrConv(InputB$(LOF(1), 1), _

vbUnicode): MyLen = Len(Text1.Text)

Close #1

End If

End Sub

注意:可要记得写出错处理代码,否则……你知道的。

五、确认文件是否需要保存

从当前状态退出程序或转移到其它状态如新建文件、打开文件等,如若当前文件已经改变而用户又没有保存,应该提醒用户要不要保存已做的改变。这一点Notepad是有的,在VB中该怎么办呢?

我们可以声明一个布尔变量,用来记录文本框是否有了改变,并利用TextBox控件的Change事件来监视文本框的状态,若有变化,则改变变量值。

1.模块或窗体级声明:

Dim Ask As Boolean

2.在Form_Load中:

Ask = False ’初值

3.在Text1_Change中加入:

Ask = True

4.退出程序或转移到新的状态时:

If Ask = True then

Dim Flag As Integer,MsgStr As String

MsgStr = "文件已经改变,是否要存盘?" ’提示语

Flag = MsgBox(MsgStr, vbYesNoCancel, "提示") ’给予提示

If Flag = vbYes Then SaveIt ’选择了确定则保存之:这里假定已有了一个保存文件的子过程SaveIt

If Flag = vbCancel Then Exit Sub

If Flag = vbNo Then Cancel = False

End If

’...... 这里写上其它主要处理事件代码

Ask = False ’操作结束令其为假,以免老提示

六、搜索功能

Notepad提供了查找和继续查找字符串的功能。VB中,控件TextBox并不象RichTextBox控件那样提供了Find方法。这样我们只好求助于VB的一些内部函数了。以下是笔者自行编写的一个专用于TextBox控件中查找字符串的函数,函数中用上了VB的InStr等内部函数,这里就不多作解释了。

’查找字符串函数[可置于模块或窗体级中]

Function FindMyStr(MyName As TextBox, SearchStr As String) As Integer

Dim Where ’获取需要查找的字符串变量

Dim Start As Integer

MyName.SetFocus ’文本框获得焦点,以显示所找到的内容

Start = MyName.SelStart + MyName.SelLength + 1

Where = InStr(Start, MyName.Text, SearchStr) ’在文本中查找字符串

If Where Then

’若找到则设置选定的起始位置并使找到的字符串高亮

’FindStr = Where - 1

MyName.SelStart = Where - 1

MyName.SelLength = Len(SearchStr)

’否则给出提示

Else: MsgBox "未找到所要查找的字符串。", vbInformation, "提示"

End If

End Function

有了这个函数,我们可以这样查找和继续查找字符串:

1.在窗体级声明:

Dim Search As String ’声明要查找的变量

2.第一次查找:

Dim sFind As String

’若光标不在开头处则令其回到开头

If Text1.SelStart <> 0 Then Text1.SelStart = 0

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

sFind = FindMyStr(Text1, Search)

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

Dim sFind As String

sFind = FindMyStr(Text1, Search)

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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有