我知道Ini文件是用于单行信息的,不用说我试图在Ini中读取/写入多行 - 没有太大的成功(我似乎总是这样做很难!)
让我们说保存时我的Ini文件看起来像这样:
[richardmarx]
Filenames=hazard
children of the night
right here waiting
Run Code Online (Sandbox Code Playgroud)
假设Ini文件是动态构建的(即,richardmarx和文件名不知道,但是唯一 - 它们可以完全是任何东西).
我怎样才能阅读Ini文件?
在这个例子中,我怎样才能将richardmarx放入TEdit,并将与richardmarx相关联的文件名放入备忘录?
提前谢谢了.
Rem*_*eau 14
不要将多行字符串存储到INI文件中.逃避换行符,就像@RobertFrank建议的那样.不过,我不会使用asterik,因为那是一个有效的文本字符.我会用这样的东西代替:
[richardmarx]
Filenames=hazard%nchildren of the night%nright here waiting
Run Code Online (Sandbox Code Playgroud)
然后,您可以读取字符串并%n使用sLineBreak全局变量的值替换序列.如果您需要存储实际%角色,请将其转义为%%,例如:
[sales]
value=Sale! 50%% off%nat Macy's
Run Code Online (Sandbox Code Playgroud)
你没有使用有效的.ini格式,所以这并不容易.如果使用正确形成的.ini文件,则会容易得多.
有效ini文件的格式
[section]
akey=value
bkey=value
ckey=value
Run Code Online (Sandbox Code Playgroud)
这是从ini文件中读取多行的示例.虽然它使用的是a TListBox而不是a TEdit,但它应该足以让你入门.
下面的代码也适用于格式不正确的文件,但您可能必须更改ListBox1Click事件中的代码,ReadSectionValues而不是在显示它们之前对每个项目进行一些手动解析; 在这种情况下,TStringList在事件处理程序中创建另一个并传递它而不是Memo1.Lines.
使用格式正确的ini文件,您可以使用TIniFile.ReadSection或TMemIniFile.ReadSections将所有部分加载到TStrings后代中,然后使用它ReadSection(SectionName)来获取每个部分的值.
这是一个例子 - 在ini某个地方保存这个文件(我用过d:\temp\sample.ini:
[A Section]
Item1=Item A1
Item2=Item A2
Item3=Item A3
Item4=Item A4
[B Section]
Item1=Item B1
Item2=Item B2
Item3=Item B3
Item4=Item B4
[C Section]
Item1=Item C1
Item2=Item C2
Item3=Item C3
Item4=Item C4
Run Code Online (Sandbox Code Playgroud)
这是表单代码的示例:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IniFiles;
type
TForm2 = class(TForm)
ListBox1: TListBox;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ListBox1Click(Sender: TObject);
private
{ Private declarations }
FIni: TMemIniFile;
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
const
IniName = 'd:\Temp\Sample.ini';
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FIni.Free;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
FIni := TMemIniFile.Create(IniName);
Memo1.Lines.Clear;
FIni.ReadSections(ListBox1.Items);
end;
procedure TForm2.ListBox1Click(Sender: TObject);
var
Section: string;
begin
if ListBox1.ItemIndex > -1 then
begin
Section := ListBox1.Items[ListBox1.ItemIndex];
FIni.ReadSection(Section, Memo1.Lines);
end;
end;
end.
Run Code Online (Sandbox Code Playgroud)
单击ListBox显示该部分中的每个部分名称,如下所示:

编辑:好的.我很好奇,看看它如何与您在问题中发布的ini文件内容一起使用.
所以我做了以下改动:
Sample.ini上面创建的新部分作为新部分.抛出代码,然后单击新richardmarx项.这是我得到的:

显然,这是行不通的.所以我做了以下额外的更改:
ListBox1Click事件更改为使用FIni.ReadSectionValues而不是ReadSection.C Section项目以查看其显示方式,然后单击该项目以查看richardmarx其显示方式.结果如下:
