2016-06-08 94 views
3

我想將一個ini文件作爲資源文件添加到我的delphi項目中。添加ini文件作爲資源文件並從中讀取

我知道你要去哪裏添加一個文件作爲一個資源文件:

項目>資源和圖像>添加

但一旦多數民衆贊成在做什麼呢,我需要做的是能夠讀取文件?我以前沒有使用資源文件。

是否有關於該過程的任何文檔?

感謝,

+0

爲什麼?如果你將配置添加到exe,無論如何你不能硬編碼它? –

+2

以下是從資源文件中獲取文本信息的方法:[如何將TXT文件資源添加到我的EXE文件?](http://stackoverflow.com/a/8943364/576719)。使用流將其加載到'TMemIniFile'中。 –

回答

2

要添加的文件,在可執行文件,一定要加一個.rc文件(而不是.ini文件直接),例如inis.rc(所以在源文件中dpr你必須{$R 'inis.res' 'inis.rc'}),並在該文件列表寫像這樣:

this 100 "this.ini" 
that 100 "that.ini" 

如果你存儲在一個(相對)目錄下的.ini文件,一定要反斜線,因爲這在C-語法一倍。 (這裏的100是資源類型,沒有專門分配給ini文件的編號,所以我們將使用未分配的編號。最好的下一個是23,它被分配給RT_HTML,見下文)

如果你是不使用組(僅使用[GroupName]),我建議您使用普通的TStringList對象及其Values屬性。與數據加載它們,使用是這樣的:

var 
    sl:TStringList; 
    r:TResourceStream; 
begin 
    sl:=TStringList.Create; 
    try 
    r:=TResourceStream.Create(HInstance,'this',MAKEINTRESOURCE(100)); 
    try 
     sl.LoadFromStream(r); 
    finally 
     r.Free; 
    end; 

    //sl.Values['Setting'] 

    finally 
    sl.Free; 
    end; 
end; 
+1

恕我直言,而不是'指針'['MAKEINTRESOURCE'](https://msdn.microsoft.com/de-de/library/windows/desktop/ms648029(v = vs.85).aspx)應該使用。 –

+0

是的,但在Delphi中,我注意到聲明在幾個單元之間在連續版本之間傳播,所以我恢復了一個指針以便在大多數情況下工作(達到相同的基本效果) –

+0

您可以將此答案進一步通過將TStringList加載到TMemIniFile中。 –

4

內置在RTL INI文件類,在 System.IniFiles單位提供,需要INI文件是一個磁盤文件。所以你可以將資源提取到磁盤並從那裏讀取。

如果您不喜歡這個想法,那麼您可以編寫自己的INI文件解析器,該解析器在一個流而不是文件上運行。您可以使用TMemIniFile的代碼來指導您。複製該代碼並用代碼替換LoadValues以從流中讀取而不是從文件中讀取。或者如果你看起來足夠努力,那麼你可能會發現第三方INI解析器在流上運行。

如果您準備考慮其他格式,那麼您可以使用JSON而不是INI。內置的JSON解析器不需要輸入數據駐留在磁盤上。它們可以在內存中的字符串上操作,這聽起來更加方便。

這上面的文字其實是無稽之談。感謝雷米指出了這一點。您可以使用TMemIniFile及其SetStrings方法來分析不駐留在磁盤上的INI內容。它是這樣的:

  • 把你的INI內容作爲一個字符串放入一個資源。
  • 將該資源加載到字符串變量中。
  • 創建一個TStringList,並將字符串變量賦值給字符串列表的Text屬性。
  • 創建一個TMemIniFile
  • 撥打在TMemIniFile上傳遞字符串列表。

或者:

  • 把你的INI內容到一個資源爲字符串。
  • 創建一個TResourceStream對象來讀取該資源。
  • 創建一個TStringList對象。
  • 在通過資源流的字符串列表上調用LoadFromStream
  • 創建一個TMemIniFile
  • 撥打在TMemIniFile上傳遞字符串列表。

說完所有這一切後,看起來很奇怪你會選擇這樣做。將一個單元中的配置信息硬編碼爲一系列常量不是簡單嗎?

+2

「* RTL中的內置INI文件類,在System.IniFiles單元中提供,要求INI文件爲磁盤文件*」 - TMemIniFile可以從TStrings(TMemIniFile.SetStrings())加載INI, TStringList可以從TStream(TStrings.LoadFromStream())加載,並且TResourceStream可以用於讀取資源。 –

+0

@RemyLebeau謝謝 –

1

恕我直言,ini文件只是一個文本文件與應用程序分發所以你可以在一個特定的環境控制應用程序的行爲。例如,您可以在「language.ini」中存儲一種語言,從源代碼中讀取它並根據該語言呈現GUI。

要做到這一點,你的ini文件中包含:

[general] 
language=Russian 

然後從德爾福閱讀:

... 
    uses Inifiles; 
    ... 
    var CurrentLanguage:string; 
    ...  
    Ini := TIniFile.Create('C:\somedir\languages.ini');  
    CurrentLanguage := Ini.ReadString('General', 'language', 'English');//if key isn't found, language is English  
    Ini.free(); 

所以基本上包含文本信息...就像上面說,如果添加它作爲一種資源,你可能會硬編碼它。資源應主要用於二進制數據(圖像,音頻文件,視頻等)。

2

使用「資源和圖像」對話框,將.ini文件作爲RCDATA資源類型添加到項目中。然後,你可以像這樣在運行時加載它:

uses 
    ..., Classes, IniFiles; 

var 
    Ini: TMemIniFile; 
    List: TStringList; 
    Strm: TResourceStream; 
begin 
    Ini := TMemIniFile.Create; 
    try 
    List := TStringList.Create; 
    try 
     Strm := TResourceStream.Create(HInstance, 'ResourceIDHere', RT_RCDATA); 
     try 
     List.LoadFromStream(Strm); 
     finally 
     Strm.Free; 
     end; 
     Ini.SetStrings(List); 
    finally 
     List.Free; 
    end; 
    // use Ini as needed... 
    finally 
    Ini.Free; 
    end; 
end;