再试一次。根据建议,添加我理解的代码片段。我很好,我必须在两行中保存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)。
答案 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文件的典型应用是保存程序设置。例如,当您退出文本编辑器时,它可能会将设置保存到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;
现在......这远远不是“好的代码”,但现在你知道至少有一种方法来做你的事情。希望有所帮助。