2012-02-18 70 views
3

我創造我的學生策劃者基本上可以讓一個虛擬版本,讓你有什麼功課什麼科目的筆記。加載動態的.ini標識符

這裏是接口: enter image description here

用戶從在相鄰的備忘錄一些音符的組合框和類型的主題。完成後,他們將點擊「保存」按鈕,將其保存到.ini文件中。所選日期將成爲部分名稱,主題將成爲標識符,備忘錄中的文本將成爲每個標識符的值。

注:有7個可能的主題。

我的問題是當選擇日期時加載組合框和備忘錄,因爲每個日期的標識符總是不同。

例如:

二月用戶輸入(接口)的16:

英語 - 閱讀最多小說127頁。
數學 - 完成第6章

二月份的16日它看起來像這樣在.ini文件:

[16/02/12]
英語=讀取高達127頁小說。
數學=完成第6

在2月20日用戶輸入(界面):

SOSE - 讀教科書。
法律研究 - 填寫在線調查。

對於月20日它看起來像這樣在.ini文件:

[20/02/12]
SOSE =讀教科書。
法律研究=填寫在線調查。

現在,您會看到如果用戶選擇2月16日查看他們的任務是什麼,那麼將無法加載,因爲每個標識符都會發生變化。

是否有.ini文件一個更好的選擇?我該如何去實現這個目標?

+2

你應該考慮使用一個輕量級的數據庫,如http://www.sqlite .org /隨着項目的發展,複雜性會隨之增加,並且會使維護變得更加困難,僅僅是我的兩分錢。 – ComputerSaysNo 2012-02-18 09:34:33

+0

User0815提到了同樣的事情,但是謝謝你的建議。雖然我打算定期刪除ini文件。你怎麼看待這件事? – ple103 2012-02-18 10:23:06

+1

ahhh,抱歉,我沒有閱讀所有評論。一個數據庫會比ini文件更容易維護,例如日期和學科與學生之間的關係(?)擦除不是一個好主意(恕我直言),你應該保留一個歷史數據或只是在那裏,它贏了我不會吃那麼多的存儲空間,我相信你可以想出歷史的使用場景,也就是說,如果每個星期三都有數學作業,但在不同的時間,應用程序可以在星期二詢問學生的東西,比如「嘿,有數學今天的作業?「 – ComputerSaysNo 2012-02-18 12:36:48

回答

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. 

代碼:

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 imageSample output image 2

+0

謝謝你寫這段代碼Ken。我會找到一種方法將其應用於我的代碼。我注意到你已經使用了TMemIniFile而不是TIniFile。 TMemIniFile有什麼優於TIniFile? – ple103 2012-02-18 08:14:32

+1

'TIniFile'使用WinAPI的'ReadPrivateProfileString/WritePrivateProfileString'函數,它有一些緩存問題,有時會失去更改。 'TMemIniFile'具有相同的方法,但是完全不同的實現,並且有一個'UpdateFile'方法來確保數據被保存。如果您在完成更新文件時記得調用它,則很可能實際上會保存您的更改。 'TIniFile'在保存到網絡路徑時也有問題,'TMemIniFile'沒有。他們幾乎100%兼容,並在同一單位。 – 2012-02-18 14:34:21

8

沒有使用此一TIniFile沒有問題。該課程有一個方法ReadSections(),您可以使用該方法閱讀所有帶作業的日子,並使用方法ReadSection()讀取給定日期的所有條目。
您也可以使用ReadSectionValues()來讀取完整的行(主題和任務),然後您需要在first = char處進行拆分。

+3

我會使用ReadSection()來確定可用的鍵(主題),然後根據需要使用'ReadString()'單個值(註釋)。由於您需要知道主題是否存在,因此ReadSection()會比解析ReadSectionValues()的結果更容易獲取該列表。 – 2012-02-18 04:24:10

+2

@petersmileyface ...除了mghie:當我們的「數據庫」長大時,考慮可用的記憶和解決方案的速度。也許是嵌入式數據庫的時間。 – 2012-02-18 07:20:24

+1

@petersmileyface:在INI文件上選擇數據庫有更多的理由。想象一下,有人在您的程序調用之間更改日期格式。想象一下包含多行文字的備忘錄,其中有等號和方括號。具有正確類型字段的數據庫只是一個更好的解決方案,即使您只有一個用戶並且條目數很少。 – mghie 2012-02-18 12:45:53