
前几天在网上看到一篇非常好的文章,细读之间,不禁深深被作者折服了,似有一股"胜读十年书"的感觉。不过,美中不足的是,因为半个汉字的原因,文章中有十来个字不知道究竟是什么内容。一篇几千字的文章里,少十来个字按理说也不算什么,但是文章写得太好了,我舍不得这文章中的每一个字,于是想办法来解决它。
以前用过一款软件叫《Read BOOK》,它有解决半个汉字的问题的功能。但是手头又没有这个软件,于是,自己编程序。
其实程序原理很简单,只要删除半个汉字,即删除一个字节就可以了。如果有C语言的话,几行程序就搞定了。但是,手头又没有C语言,只有Visual Basic。在VB中,汉字虽然是两个字节的,但是处理时只当一个字节。比如"我爱VB"的长度是四个字,如果字符串"我爱VB"保存在变量MyString中,right(MyString,len(MyString)-1)将返回"爱VB"。那怎么办呢?不如就用磁盘文件吧,用二进制方式存取。
先画界面,画两个TextBox控件,名称为"Text1"和"Text2",用来显示转换前和转换后的文本,一上一下摆放。中间放一个CommandButton控件,名称为"cmdChange",Caption为"转换"。其中两个TextBox的MultiLine属性为"True"(可以换行);为了滚动方便,再将ScrollBars属性值设为"2-Vertical"(只显示垂直滚动条)。考虑到Text2的内容不须要用户修改,可以将它的Locked属性设为"True"(不可编辑)。
这样一来最需要的控件就全有了,为了好看起见,可以在两个TextBox控件上方分别放一个Label控件,名称分别是"Label1"和"Label2",其Caption为"包含乱码的文字段"和"转换后的文字段"。"转换"按钮前再放一个Label控件作为使用说明,名称为"Label3",Caption为"如果以上文字中只有部分文字是乱码,请选择它们再单击’转换’;如果全是乱码,不用选择"。
再考虑到用户可能要把整个文件内容放入Text1,就设计一个"导入整个文件"功能,加上一个CommandButton控件,其名称为"cmdReadFromFile",Caption为"从文件导入"。本例中最多只导入32767个字节,如果文章太长,将自动截取。一般的文章也不会太长,有这么多字也差不多了。
为了能显示打开对话框,还要添加一个CommonDialog控件,在工具箱内单击右键,从弹出菜单中选择"部件"命令,出现"部件"窗口,在"Microsoft Common Dialog Control 6.0"前打上勾,单击"确定"按钮。然后将CommonDialog控件添加到窗体中,取名为"dlgRead"。
下面要编程序了。首先在代码窗的"通用声明"部分定义两个变量:
Dim Old_Str As String * 32767
Dim New_Str As String * 32766
下面是导入整个文件的代码:
Private Sub cmdReadFromFile_Click()
Dim FileNum As Integer
With dlgRead
.FileName = "" ’清空文件名,否则下面的判断可能出错
’若不清空,当用户先成功打开一个文件,第二次在打开对话框里点取消时,也会打开上一次的文件
.DialogTitle = "请找到您要的文件" ’打开对话框的标题
.Filter = "文本文件|*.txt|所有类型文件|*.*"
.Flags = cdlOFNHideReadOnly ’不显示"以只读文件打开"选项
.ShowOpen
If .FileName = "" Then Exit Sub ’如果用户点了取消
FileNum = FreeFile
Open .FileName For Binary As #FileNum
Get #FileNum, , Old_Str
Text1.Text = Old_Str
Close #FileNum
End With
End Sub
下面看程序核心功能代码:
Private Sub cmdChange_Click()
Dim File_Num As Integer
If Text1.Text = "" Then Exit Sub ’原始框内没内容,不用处理
File_Num = FreeFile
If Text1.SelText = "" Or Text1.SelText = Text1.Text Then
’用户没有选择或全部选择,这种情况下要全文转换
Old_Str = Text1.Text
Else
’用户选择了部分文本,这种情况下要转换已选内容
Old_Str = Text1.SelText
End If
Open "c:\tomorrowtemp.txt" For Binary As #File_Num
Put #File_Num, , Old_Str
Get #File_Num, 2, New_Str
Text2.Text = Trim(New_Str)
Close #File_Num
Text1.SetFocus ’用户还可以看到已选的内容
End Sub
有了这两段代码,程序应该已经完成了,但是现在的界面经不起用户挑剔。比如,如果用户将窗口调大了,你画的控件将全部缩在左上角;如果用户将窗口调小了,你画的控件将不会全部显示出来?于是,我们再加一段程序:
Private Sub Form_Resize()
If Form1.WindowState = 1 Then Exit Sub ’窗口被用户最小化,不须要处理
If Form1.Height < 5310 Then Form1.Height = 5310 ’为了程序界面不被破坏,必须规定窗口最小尺寸
If Form1.Width < 5730 Then Form1.Width = 5730
Text1.Width = Form1.Width - 435 ’控件的宽度比窗口的宽度小,差值为固定值
Text2.Width = Text1.Width
Text1.Height = (Form1.Height \ 2) - 1200 ’控件的高度比窗口高度的一半小,差值为固定值
’反斜杠\表示整除,/表示相除。这里要的是整除
Text2.Height = Text1.Height
Label3.Top = Text1.Top + Text1.Height + 105 ’下面标签的顶比上面文本框的底大,差值为固定值
cmdChange.Top = Label3.Top ’按钮和标签平
Label2.Top = Label3.Top + 600
Text2.Top = Label2.Top + 360
End Sub
到这里,这个程序就完成了,最多再加点“边角料”。以上程序在Win98、VB6中运行通过。我的E-Mail是:toumao1@sohu.com。欢迎来信和我讨论,包括其它软件设计方面问题。
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
