分享

INI问题 帮帮忙.郁闷一晚上了..找到原因了.但是没办法解决问题!

 quasiceo 2014-08-27

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;

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多