加载动态.ini标识符

ple*_*103 3 delphi delphi-2010

我正在创建一个我的学生计划器的虚拟版本,它基本上可以让你记录你有什么主题的家庭作业.

这是界面: 在此输入图像描述

用户从组合框中选择主题并在相邻备忘录中键入一些注释.完成后,他们将点击"保存"按钮,将其保存到.ini文件中.选定的日期将成为部分名称,主题将成为标识符,备忘录中的文本将成为每个标识符的值.

注意:有7个可能的科目.

我的问题是在选择日期时加载组合框和备忘录,因为每个日期的标识符总是不同的.

例如:

2月16日用户输入(界面):

英语 - 阅读小说第127页.
数学 - 完成第6章.

对于2月16日,它将在.ini文件中看起来像这样:

[16/02/12]
英语=阅读小说第127页.
数学=完成第6章.

2月20日用户输入(界面):

SOSE - 阅读课本.
法律研究 - 填写在线调查.

对于2月20日,它将在.ini文件中看起来像这样:

[20/02/12]
SOSE =阅读课本.
法律研究=填写在线调查.

现在您看到用户是否选择了2月16日来查看他们的任务是什么,因为每个标识符都不同,所以无法加载.

是否有更好的替代.ini文件?我怎样才能实现这一目标?

Ken*_*ite 10

您可以使用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. 
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\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.
Run Code Online (Sandbox Code Playgroud)

以上产生了这个:

样本输出图像 样本输出图像2


mgh*_*hie 8

使用a没有问题TIniFile.该类有一个方法ReadSections(),您可以使用该方法ReadSection()阅读家庭作业的所有日期,以及一种方法来读取给定日期的所有条目.
您还可以使用ReadSectionValues()读取完整的行(主题和任务),然后您需要在第一个= char处拆分.

  • 我会使用`ReadSection()`来确定可用的键(主题),然后根据需要使用`ReadString()`各个值(注释).既然你需要知道主题是什么,`ReadSection()`使得该列表比解析`ReadSectionValues()`的结果更容易获得. (3认同)
  • @petersmileyface ...除了mghie:当我们的"数据库"成长时,想想可用的记忆和这个解决方案的速度.也许是嵌入式数据库的时间. (2认同)