Вы не используете правильный формат .ini
, так что это будет непросто. Гораздо проще, если вы используете правильно сформированный файл .ini
.
Допустимый ini
файл имеет формат
[section]
akey=value
bkey=value
ckey=value
Вот пример чтения нескольких строк из INI-файла. Хотя он использует TListBox
вместо 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
Вот пример кода формы:
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.
При нажатии на название каждого раздела в ListBox
отображаются элементы, которые находятся в этом разделе, как показано ниже:
РЕДАКТИРОВАТЬ: ОК. Мне стало любопытно посмотреть, как это будет работать с содержимым ini-файлов, которое вы разместили в своем вопросе.
Итак, я сделал следующее изменение:
- Копирование и вставка вашего образца ini content дословно как нового раздела до конца
Sample.ini
, который я создал выше.
Запустил код и щелкнул новый элемент richardmarx
. Вот что я получил:
Очевидно, это не сработает. Поэтому я внес следующие дополнительные изменения:
- Изменено событие
ListBox1Click
для использования FIni.ReadSectionValues
вместо ReadSection
.
- Запустил измененное приложение и щелкнул элемент
C Section
, чтобы увидеть, как оно отображается, а затем новый элемент richardmarx
, чтобы увидеть, как оно отображается. Результаты следующие: