一级棒(Eachfun)
偷猫的个人主页
一级棒(Eachfun) - 编程园地 - 源码放送 - 自编程序解决半个汉字的问题
RSS订阅
自编程序解决半个汉字的问题
发表时间:2003-06-20 00:00:00 关键词:编程,源码,下载,VB

效果图

  前几天在网上看到一篇非常好的文章,细读之间,不禁深深被作者折服了,似有一股"胜读十年书"的感觉。不过,美中不足的是,因为半个汉字的原因,文章中有十来个字不知道究竟是什么内容。一篇几千字的文章里,少十来个字按理说也不算什么,但是文章写得太好了,我舍不得这文章中的每一个字,于是想办法来解决它。

  以前用过一款软件叫《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。欢迎来信和我讨论,包括其它软件设计方面问题。

本站特约顾问律师常州东晟律师事务所朱立律师(电话13915029670,QQ646146109)提醒您:
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
相关评论
发表评论
称呼:
QQ:
邮箱:
链接:
内容:
搜索: 百度搜索 Google搜索
Copyright©2000 - 2011 Eachfun.Com, All Rights Reserved 一级棒网络
备案号忘了带来
一级棒建站系统 http://www.eachfun.com 一级棒版权所有,未经许可不得商用!