阅读IniFile的2行

时间:2011-02-23 22:27:34

标签: delphi ini

再试一次。根据建议,添加我理解的代码片段。我很好,我必须在两行中保存4位信息,如下所示:

IniFile.WriteString('TestSection','Name','Country');
IniFile.WriteString('TestSection','City','Street');

我的问题更多的是将此信息重新加载到表单中。如果在我的IniFile中我保存了例如以下代码

[TestSection]
John=Uk
London=barlystreet
Mike=Spain
Madrid=eduardostrata
Emma=USA
New York=1st Avenue

在IniFile中填写信息。通过上面的代码添加。 现在我的问题是:当我输入编辑框Mike时,我可以加载其他所有信息。(西班牙,马德里,eduardostrata)。

3 个答案:

答案 0 :(得分:15)

这不是INI文件的工作原理。您保存name=value对,并且必须有办法将它们关联起来。

也许这可以帮助您入门:

Ini := TIniFile.Create(YourIniFileName);
try
  Ini.WriteString('Mike', 'Country', 'Spain');
  Ini.WriteString('Mike', 'City', 'Madrid');
  Ini.WriteString('Mike', 'Street', 'EduardoStrata');
finally
  Ini.Free;
end;

包含以下内容的INI文件中的结果:

[Mike]
Country=Spain
City=Madrid
Street=EduardoStrata

加载回来:

var
  Country, City, Street: string;
  Ini: TIniFile;
begin
  Ini := TIniFile.Create(YourIniFilename);
  try
    Country := Ini.ReadString('Mike', 'Country', '<None>');
    City := Ini.ReadString('Mike', 'City', '<None>');
    Street := Ini.ReadString('Mike', 'Street', '<None>');
  finally
    Ini.Free;
  end;
  // Country, City, and Street now equal the values for 'Mike',
  // or they contain '<None>' if the section 'Mike' doesn't
  // exist or has no values for the variable.
end;

所以你可以弄清楚它是如何工作的。部分([]中的部分)是人名,名称/值对是位置及其对应的值(例如,“Country = Spain”)。

答案 1 :(得分:3)

您显然不了解INI文件的工作原理。如果约翰和戴夫都住在纽约怎么办?在INI文件中不能有两个具有相同名称的键。 (此外,您不应该依赖每个部分内的行的顺序。)

因此,您需要重新考虑如何保存数据。一个非常简单的解决方案是使用纯文本文件,其中每一行都是数据库中的项目,并且字段由例如垂直线(|)分隔:

John|Uk|London|barlystreet
Mike|Spain|Madrid|eduardostrata
Emma|USA|New York|1st Avenue.

如何阅读此文件?嗯,这是微不足道的,你应该知道如何做到这一点。如果您有一个非常具体的问题,请随时提问。

的INI文件

但是什么是INI文件呢?嗯,INI文件的典型应用是保存程序设置。例如,当您退出文本编辑器时,它可能会将设置保存到settings.ini:

[Font]
Name=Consolas
Size=10

[Behaviour]
AutoIndent=1
AutoReplace=1
AutoBrackets=1
BracketHighlight=1
SyntaxHighlight=1

[Window]
Width=800
Height=600
Maximized=0

等。这是由

完成的
WriteString('Font', 'Name', Editor.Font.Name);
WriteInteger('Font', 'Size', Editor.Font.Size);

等。当您下次启动应用程序时,它将读取文件以恢复设置:

Editor.Font.Name := ReadString('Font', 'Name', 'Consolas');
Editor.Font.Size := ReadInteger('Font', 'Size', 10);

等,其中最后一个参数是默认值(如果INI文件中缺少该字段)。请注意,在每个部分中,键都是唯一(并且需要),并且我们不关心每个部分内部键的相对顺序。

答案 2 :(得分:2)

创建所需关系的最简单方法是在1行文本中包含所有用户的详细信息。这不是INI文件的工作。您的问题是如何解析字符串。

首先,为什么需要保存“重复密码”?这对我没有意义。通常,UI会要求用户重复密码作为一种验证形式,但这一切都很有用。存储它以便以后检索没有任何好处。

我认为你需要保存用户的first_name,last_name和密码(3个字符串)。看看下面这段代码。

procedure SaveUserDetails(sFileName: string);
var
  sFirstName, sLastName, sPassword: string;
  slUsers: TStringList;
begin
  sFirstName := txtFirstName.Text;  // these could be from TEdit controls for example
  sLastName := txtLastName.Text;
  sPassword := txtPassword.Text;
  slUsers := TStringList.Create;
  slUsers.Add(sFirstName + ',' + sLastName + ',' + sPassword);
  slUsers.SaveToFile(sFileName);  // that has saved your stringlist to a file
  slUsers.Free;
end;

该文件将显示此

Shane,Warne,cricket

现在,如何加载它......

procedure LoadUserDetails(sFileName: string);
var
  sFirstName, sLastName, sPassword: string;
  sTemp: string;
  slUsers: TStringList;
  iPos: integer;  // string position marker we'll use to split the string in 3
begin
  slUsers := TStringList.Create;
  slUsers.LoadFromFile(sFileName); // this loads the file's contents into stringlist
  sTemp := slUsers[0];
  if (Length(sTemp) > 0) then // just to check that there is data there
  begin
    iPos := pos(',', sTemp); // get position of first comma (our "delimiter")
    sFirstName := Copy(sTemp, 0, iPos-1);  // firstName everything upto 1st comma
    sTemp := Copy(sTemp, iPos + 1, Length(sTemp)); // chop off bit we just read
    iPos := pos(',', sTemp); // get position of second comma
    sLastName := Copy(sTemp, 0, iPos-1);  // LastName everything upto 2nd comma
    sTemp := Copy(sTemp, iPos + 1, Length(sTemp)); // chop off bit we just read
    sPassword := sTemp; // that's it
  end;
  slUsers.Free;
end;

现在......这远远不是“好的代码”,但现在你知道至少有一种方法来做你的事情。希望有所帮助。