Ini文件 - 读取多行?

8 delphi ini

我知道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)

  • 为什么这会被贬低?人们在没有自我解释的情况下进行投票,这真的很烦人. (11认同)
  • @KenWhite:*如果您手动解析文件,则必须手动区分换行符所代表的内容以及它是属于值还是作为分隔符.*if*如果您使用标准API(`TIniFile` /`TMemIniFile`或直接Win32配置文件API),则必须对值内部的换行符进行编码.这就是我所说的. (3认同)

Ken*_*ite 6

你没有使用有效的.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.ReadSectionTMemIniFile.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文件内容一起使用.

所以我做了以下改动:

  • 将您的样本ini内容逐字复制并粘贴到Sample.ini上面创建的新部分作为新部分.

抛出代码,然后单击新richardmarx项.这是我得到的:

样本图片2

显然,这是行不通的.所以我做了以下额外的更改:

  • ListBox1Click事件更改为使用FIni.ReadSectionValues而不是ReadSection.
  • 运行已修改的应用程序,然后单击该C Section项目以查看其显示方式,然后单击该项目以查看richardmarx其显示方式.结果如下:

选择了C部分的图像图像与richardmarx选中