INI问题 帮帮忙.郁闷一晚上了...缓冲区太小
2009-05-31 20:59:14 来自:魔幻红 浏览数:81次
|
procedure TForm1.Button29Click(Sender:TObject); var t:TStringList; ini:TIniFile; begin t:=TStringList.Create; ini:=TIniFile.Create('d:\client.ini'); ini.ReadSection('1',t); ShowMessage(IntToStr(t.Count));//这里得到的是694 应该得到750才对 t.Clear; t.LoadFromFile('d:\client.ini'); ShowMessage(IntToStr(t.Count));//这里得到的确是751 //client绝对只有一个小节..... end; 这到底是怎么回事呀..郁闷得很...
|
wq6307回复于31日21点06分
procedure TIniFile.ReadSection(const Section: string; Strings: TStrings); const BufSize = 16384;//太小了 var Buffer, P: PChar; begin GetMem(Buffer, BufSize); try Strings.BeginUpdate; try Strings.Clear; if GetPrivateProfileString(PChar(Section), nil, nil, Buffer, BufSize, PChar(FFileName)) <> 0 then begin P := Buffer; while P^ <> #0 do begin Strings.Add(P); Inc(P, StrLen(P) + 1); end; end; finally Strings.EndUpdate; end; finally FreeMem(Buffer, BufSize); end; end; 解决办法,在环境设置里面加入\Borland\Delphi7\Source\Rtl\Common,然后修改inifiles单元 或者你把这个inifiles拷贝出来修改一下名字inifilesEx,在修改这个文件,然后添加到你的项目里面,uses inifilesEx;
|
|
陆地上的鱼回复于31日21点13分
学习中。。。以前也用过inifile,因为数据量小没有碰到这样的问题提
|
|
kelly栗回复于31日21点34分
第一個是因為取的大小問題, 第二個是因為節點也被載入了。
|
|
陈妙然回复于31日21点42分
楼主直接用TStringList读取
|
|
陈道宇回复于31日21点49分
hongqi162 的回答完全正确... INI确实有读取大小限制... 分给你80% 呵呵
|
|
心想事成回复于31日21点56分
使用TMemIniFile,速度快而且没有大小限制
|
|
黄功琪回复于31日22点03分
补充一点 所有配置文件都经过手动检查全部有 = 号 没有任何问题... 但是前后得到的数字就是不一样...
|
|
cathy2008回复于31日22点10分
mark
|
|
lovelygril回复于31日22点16分
你所贴出的ini内容,是386行,读出正确, t.Clear; t.LoadFromFile('d:\client.ini'); ShowMessage(IntToStr(t.Count));//这里得到是387 ,因为LoadFromFile后,会包括小节的那一行,即[1]的那行,所以多一行
|
|
猪是的念来过倒回复于31日22点24分
delphi的IniFiles,基本没什么用(注册表读写也一样是鸡肋)!其实用API简单包装几个函数即可,而且使用时省掉了这个罗嗦过程! Ini := TIniFile.Create() try ..... finally Ini.Free; end; 我个人是十分讨厌读写Ini和注册表也要 Create; try finally free; end; 明明很简单的东西,也要搞得如此罗嗦,应该象Sysutils、Math一样包装几个函数即可。 function ReadSection(Sectname, IniFilename :string; Sections :TStrings) :Integer; var Buffer :array[0..High(Word)] of Char; i, L :Integer; begin L := GetPrivateProfileString(PChar(Sectname), nil, nil, Buffer, High(Word), PChar(IniFilename)); for i := 0 to L - 1 do if Buffer[i] = #0 then Buffer[i] := #13; Sections.SetText(Buffer); Result := Sections.Count; end; 调用时多简单: var TS :TStringList; begin TS := TStringList.Create; ShowMessage(IntToStr(ReadSection('1', 'd:\client.ini', TS))); end;
|
|