详细谈谈如何保存文本框里的信息(转)

来源:互联网 发布:淘宝的运费险怎么退款 编辑:程序博客网 时间:2024/05/22 14:17

 

代码为蓝色,红色为背景知识)
呵,第一次在这里发贴,我这两天整理了下如何保存文本框中的信息,写出来和大家交流下,也不知道我说得清楚不清楚,(从小到大我语文就不好)。这些信息都是从网上找来的,并加入了我的一些理解,有不对的地方希望大家可以指出,在后面我付上一个VB程序和Excel例子,希望对大家有用吧。其它控件类似,如checkbox,只要保存checkbox.value就行了
在程序中经常要用到设置或者其他少量数据的存盘,以便程序在下一次执行的时候可以使用,比如说保存本次程序执行时窗口的位置、大小、一些用户设置的数据,文本框内容等等,在 Dos 下编程的时候,我们一般自己产生一个文件,由自己把这些数据写到文件中,然后在下一次执行的时候再读出来使用。在 Win32 编程中当然你也可以这样干,但 Windows 已经为我们提供了两种方便的办法,那就是使用注册表或者 ini 文件(Profile)来保存少量数据,下面讲解如何使用 INI 文件来保存和读取内容。假设当前有 Text1、Text2、Text3三个文本框的内容需要保存,INI文件名为 ABC.INI。 (默认路径为c:/Windows)
先来说一下INI文件,
ini 文件是文本文件,中间的数据格式一般为(打开一个INI文件就可以看到了):
[Section1 Name]
KeyName1=value1
KeyName2=value2
...

[Section2 Name]
KeyName1=value1
KeyName2=value2

ini 文件可以分为几个 Section,每个 Section 的名称用 [] 括起来,在一个 Section 中,可以有很多的 Key,每一个 Key 可以有一个值并占用一行,格式是 Key=value,Win32 对 ini 文件操作的 api 中,有一部分是对 win.ini 操作的,有一部分是对用户自定义的 ini 文件操作的。Win.in 和 system.ini 是Windows的两个非常重要的初始化文件,Windows将用户所作的选择以及各种变化的系统信息记录在这两个文件中。System.ini 描述了系统硬件的当前状态,Win.ini 文件则包含了Windows 系统运行环境的当前配置。
可以用API函数来对INI文件进行读写,下面根据这个例子来具体讲一下吧。
   首先新建一个Module,然后,在此Module中声明 API 函数:
   Declare Function WritePrivateProfileString Lib ″kernel32″ Alias ″WritePrivateProfileStringA″ (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
这里是声明一个公共API函数。
声明的语法是:
Private Declare Function ...
Private Declare Sub.....
采用Private声明,则这个API函数只能被一个窗体内的程序所调用。
如果我们的程序有多个窗体构成,而且我们需要在多个窗体中使用同一个API函数,就需要在模块中声明了。
然后采用如下语法声明:
Public Declare Function....
Public Declare Sub....
Public声明的含义是把API函数作为一个公共函数或过程,在一个工程中的任何位置(包括所有的窗体和模块)都能直接调用它。 声明完毕我们就能在程序中使用此API函数了。
WritePrivateProfileString就是API函数名了,具体用法如下:
WritePrivateProfileString - 将一个 Key 值写入 ini 文件的指定 Section 中,它的原形是:
WritePrivateProfileString(
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址
LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址
LPCTSTR lpString // 要写的字符串地址
LPCTSTR lpFileName // ini 文件的文件名
);

如果 ini 中没有指定的 Section,API 会新建 Section,如果没有指定的 Key 则新建一个 Key 并写入数据,如果已经存在,则用字符串代替原来的值。当指定的 ini 也不存在的时候,API 会自动建立一个新的文件,所以使用 ini 的好处是我们不必为了保存少量的数据涉及到文件操作,就连查找文件是否存在的操作都不必要。

声明中的Lib 和 Alias 是怎么回事
一般情况下WIN32API函数总是包含在WINDOWS系统自带的或是其它公司提供的动态连接库DLL中,而Declare语句中的Lib关键字就用来指定DLL(动态连接库)文件的路径,这样VB才能找到这个DLL文件,然后才能使用其中的API函数。如果我们只是列出DLL文件名而不指出其完整的路径的话,VB会自动到.EXE文件所在目录、当前工作目录、WINDOWS/SYSTEM目录、WINDOWS目录下搜寻这个DLL文件。所以如果所要使用DLL文件不在上述几个目录下的话,我们应该指明其完整路径。 这里的kernel32,代表的就是kernel32.dll—处理低级任务(比如内存和任务管理)的API
Alias用于指定API函数的别名,如果我们调用的API函数要使用字符串(参数中包含String型)的话,Alias关键字是必须的。这是因为在ANSI和Unicode字符集中同一API函数的名称可能是不一样的,为了保证不出现声明错误,我们使用Alias关键字指出API函数的别名,一般来说在WIN9X平台下我们把API函数名后加一个大写A作为别名即可。
声明中的ByVal是作什么用的
这跟VB的参数传递方式有关,在默认情况下VB是通过地址传递方式传递函数的参数、而有些API函数要求必须采用传值方式来传递函数参数(这两种参数传递方式是不同的,前者传递的是一个指针,而后者要求是参数真实的值)。这样就会发生错误,解决的办法是在API函数参数声明的前面加上ByVal关键字,这样VB就采用传值方式传递参数了。所以这里采用ByVal就是说是传递的是参数真实值。

使用要点:

在我们实际使用的时候,用的最多的是 GetPrivateProfileString 和 WritePrivateProfileString,但在对自定义 ini 文件操作的时候要注意的是,如果 lpFileName 指定的文件没有路径的话,Api 会去 Windows 的安装目录(默认路径为c:/Windows)去找而不会在当前目录找,但是每次用到 ini 函数要获取当前路径显然太麻烦了,这里有一个变通的办法,你只要在 ini 文件名前面加上 ./ 就可以了,比如说要对本目录下的 user.ini 操作,那么文件名就是 './user.ini' 这样显然比较方便。另外,当你要把一个 Key 清除的时候,可以使用把 lpString 指向一个空的字符串然后使用 WritePrivateProfileString。当你要把一个 section 的全部内容清空的时候,也不必把 key 一个个的清除,可以使用把 lpString 指向一个空的字符串然后使用 WritePrivateProfileSection。

  Declare Function GetPrivateProfileString Lib ″kernel32″ Alias ″GetPrivateProfileStringA″ (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long   
所以这一段,我想大家根据上面应该也就都知道了,下面给只给出GetPrivateProfileString的用法:
GetPrivateProfileString - 从 ini 文件的某个 Section 取得一个 key 的字符串,它的原形是:
GetPrivateProfileString(
LPCTSTR lpAppName, // 指向包含 Section 名称的字符串地址
LPCTSTR lpKeyName, // 指向包含 Key 名称的字符串地址
LPCTSTR lpDefault, // 如果 Key 值没有找到,则返回缺省的字符串的地址
LPTSTR lpReturnedString, // 返回字符串的即返回值的地址
DWORD nSize // 缓冲区的长度
LPCTSTR lpFileName // ini 文件的文件名
);

为了简化工作,最好定义好几个函数,给程序提供更简单的操作,首先定义一个用于输入的函数WriteOneString:
   Private Function WriteOneString(ByVal Section As String, ByVal Key As String, ByVal value As String) As Boolean
   Dim x As Long, buff As String * 128, I As Integer
   buff = value + Chr(0)
   x = WritePrivateProfileString(Section, Key, buff, ″ABC.INI″)
   WriteOneString = x
   End Function

可以看出,这个函数有三个参数要传递,第一个是Section名称字符串,第二个是Key名称字符串,第三个是要保存内容Value的字符串。然后定义x为长整形,定义buff为可存128个字符的字符串,定义I为整型。给buff赋值,为传来的字符串Value,这里Chr(0)是换行符号。令x为函数WritePrivateProfileString的返回值,返回值为长整型,非零表示成功,零表示失败。而这个就是函数WriteOneString的返回值。

   然后定义一个用于输出的函数 ReadOneString :
   Private Function ReadOneString(ByVal Section As String, ByVal Key As String) As String
   Dim x As Long, buff As String * 128, I As Integer
   x = GetPrivateProfileString(Section, Key, ″″, buff, 128, ″ABC.INI″)
   I = InStr(buff, Chr(0))
   ReadOneString = Trim(Left(buff, I - 1))
   End Function

这里和上面定义的函数类似,只说一下这里不同的地方,在GetPrivateProfileString(Section, Key, ″″, buff, 128, ″ABC.INI″)中,buff,是要取得buff的地址,应该就是前面你赋给buff字符串的地址,而InStr(buff,Chr(0))是代表的在buff这个字符串中,得到换行符号的位置,并将其赋与I。ReadOneString = Trim(Left(buff, I - 1))中,Trim(Left(buff, I - 1))其实就是从buff这个字符串最左边,一直选到换行符号的前一个字符,即要选中要在文本框里显示的字符串,而这个字符串,就是函数ReadOneString的返回值。
InStr([start, ]string1, string2[, compare])
  返回指定一字符串在另一字符串中最先出现的位置。在字符串string1中,从start开始找string2,省略start时从string1头开始找。找不到时,函数值为0。
Left(string, length)
从字符串左边选择长度为length的字符串,string 字符串表达式,其最左边的字符被返回。如果 string 参数中包含 Null,则返回 Null。 length 数值表达式,指明要返回的字符数目。如果是 0,返回零长度字符串 ("");如果大于或等于 string 参数中的字符总数,则返回整个字符串。
        
   这时,你就可以在 Form 的 Load 和 UnLoad 事件里分别进行保存和读取操作。
   Private Sub Form_Load()
   Text1 = ReadOneString(″Option″,″Text1″)
   Text2 = ReadOneString(″Option″,″Text2″)
   Text3 = ReadOneString(″Option″,″Text3″)
   End Sub
   Private Sub Form_Unload(Cancel As Integer)
   Text1 = WriteOneString(″Option″,″Text1″,Text1)
   Text2 = WriteOneString(″Option″,″Text2″,Text2)
   Text3 = WriteOneString(″Option″,″Text3″,Text3)
   End Sub
http://club.excelhome.net/thread-467428-1-1.html
原创粉丝点击