ggyy66 发表于 2009-7-16 08:53:04

老马进来看看,谢谢.

<p><font face="Verdana">大家看看,两个从ini取信息的函数,哪个好呀? <br/>以下两个函数都是网上找的,第一个说不好来处,第二个是老马的代码(从他的论坛下的) </font></p>
<p><font face="Verdana">我想问问哪种更好些,第一种代码少,简洁很多, <br/>第二个代码,代码量大,主要是因为多了一个循环截尾的操作。因为我现在用的是第一种代码,可是看到很多网友都在用第二种代码,我不知道为什么,为何在用循环呢? <br/>是不是第一种操作的字符截尾操作有问题呀? </font></p>
<p><font face="Verdana">VB code</font></p>
<p><font face="Verdana">Public Function GetIniKey(strSection As String, strKey As String) As String<br/>&nbsp;&nbsp;&nbsp; On Error GoTo errhandle<br/>&nbsp;&nbsp;&nbsp; Dim strResult&nbsp; As String * 255&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '固定255长度<br/>&nbsp;&nbsp;&nbsp; Dim lngRet&nbsp; As Long<br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; lngRet = GetPrivateProfileString(strSection, strKey, "", strResult, Len(strResult), strINI)<br/>&nbsp;&nbsp;&nbsp; GetIniKey = Left(strResult, InStr(strResult, Chr(0)) - 1)</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; Exit Function<br/>errhandle:<br/>&nbsp;&nbsp;&nbsp; GetIniKey = ""<br/>End Function</font></p>
<p><font face="Verdana">Function GetIniS(ByVal SectionName As String, ByVal KeyWord As String, ByVal DefString As String) As String<br/>&nbsp;&nbsp;&nbsp; Dim ResultString As String * 144, Temp As Integer<br/>&nbsp;&nbsp;&nbsp; Dim S As String, I As Integer</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; Temp% = GetPrivateProfileString(SectionName, KeyWord, "", ResultString, 144, IniFileName)</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; If Temp% &gt; 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S = ""<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For I = 1 To 144<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Asc(Mid$(ResultString, I, 1)) = 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit For<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S = S &amp; Mid$(ResultString, I, 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next<br/>&nbsp;&nbsp;&nbsp; Else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Temp% = WritePrivateProfileString(SectionName, KeyWord, DefString, IniFileName)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S = DefString<br/>&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp; GetIniS = S<br/>End Function<br/></font></p>

马大哈 发表于 2009-7-16 23:04:27

<p>其实两种代码一般应用应该都是差不多的,而上面一种代码要少些,更简明.</p>
<p>&nbsp;</p>
<p>至于执行的效率,其实INI读写量一般不会太大,所以不容易出现效率问题.</p>
<p>&nbsp;</p>
<p>对于两种代码的写法谁好,我觉得都一样,INSTR函数本质上也是一个循环,只是VB封装了而已:)</p>
<p>&nbsp;</p>
<p>两种代码的问题,都是同一个问题,即不能正常返回中间带有NULL符的字符串.</p>
<p>&nbsp;</p>
<p>这样的字符串的典型应用是通用对话框进行多选时返回的文件列表,就是以NULL为分隔的,如果使用上面两种代码来返回,就会出现截断.</p>
<p>&nbsp;</p>
<p>要正常返回此类型的字符串,我的做法是,先以NULL为分隔符使用SPLIT进行拆分,再在提取各个字符串时将非空的数组成员视为有效返回内容.</p>
<p>&nbsp;</p>
<p>不过一般没人在注册表里放这样的字符串(我也不清楚系统是否有这样的字符串),所以也不用管了吧:)</p>
[此贴子已经被作者于2009-7-16 23:06:20编辑过]
页: [1]
查看完整版本: 老马进来看看,谢谢.