Загрузка динамических идентификаторов .ini - PullRequest
3 голосов
/ 18 февраля 2012

Я создаю виртуальную версию моего студенческого планировщика, которая в основном позволяет вам делать заметки, какие у вас есть домашние задания по какому предмету.

Вот интерфейс: enter image description here

Пользователь выбираетпредмет из выпадающего списка и вводит некоторые заметки в соседнюю заметку.Когда они закончат, они нажмут кнопку «Сохранить», которая сохранит его в INI-файл.Выбранная дата станет названием раздела, субъекты станут идентификатором, а текст в памятке станет значениями для каждого идентификатора.

Примечание: Существует 7 возможных тем.

Моя проблема заключается в загрузке полей со списком и заметок при выборе даты, поскольку идентификаторы всегда различны для каждогоДата.

Например:

16 февраля пользовательский ввод (интерфейс):

Английский - Читать на странице 127 романа.
Математика - Завершите главу 6.

16 февраля в файле .ini это будет выглядеть так:

[16/02/12]
English= Прочитайте роман до стр. 127.
Математика = Завершите главу 6.

20 февраля пользовательский ввод (интерфейс):

SOSE - Читать учебник.
Юридические исследования - Заполните онлайн-опрос.

20 февраля в файле .ini это будет выглядеть так:

[20/02/12]
SOSE = Читать учебник.
LegalИсследования = Заполните онлайн-опрос.

Теперь вы видите, что если пользователь выберет 16 февраля для просмотра своих задач, загрузить его будет невозможно, так как меняется каждый идентификатор.

Есть ли лучшая альтернатива файлу .ini?Как я могу добиться этого?

Ответы [ 2 ]

10 голосов
/ 18 февраля 2012

Вы можете использовать TIniFile.ReadSections для получения отдельных дат и TIniFile.ReadSection для получения отдельных элементов в этом разделе. Вот быстрый пример:

// Sample ini file

[16/02/12]
English=Read up to page 127 of novel.
Maths=Complete chapter 6. 

[20/02/12]
SOSE=Read textbook.
Legal Studies=Fill in online survey. 

Код:

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\SampleNotes.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.

Выше приведено это:

Sample output image Sample output image 2

8 голосов
/ 18 февраля 2012

Нет проблем с использованием TIniFile для этого. В классе есть метод ReadSections(), который можно использовать для чтения всех дней с домашней работой, и метод ReadSection() для чтения всех записей за данный день.
Вы также можете использовать ReadSectionValues(), чтобы прочитать полные строки (тему и задачу), которые вам затем нужно будет разбить на первый = символ.

...