2011-07-30 76 views
4

我想在我的Delphi Win32應用程序中存儲用戶偏好(顏色,工具欄開/關,面板寬度像素)和應用程序設置(最後10個文件,默認保存目錄,默認打開的目錄)。這樣做的最佳做法是什麼?在Win32 Delphi應用程序中存儲用戶首選項和設置的最佳做法是什麼?

+0

**註冊表**(雖然設置不會變成大的二進制對象,ofc :) –

+0

註冊表很糟糕。但程序文件文件夾中的Ini文件也是如此。與良好的信息相關的問題:http://stackoverflow.com/questions/285277/where-to-store-program-settings-instead-of-hkey-local-machine –

+0

@warren註冊表有什麼不好?這是其他系統缺乏的窗口的一個重要特性。大公司IT管理員喜歡註冊表,並且憎恨缺乏與Linux相媲美的東西。討厭缺乏與Linux相媲美的東西。 –

回答

11

你有兩個主要選擇:

  1. 商店在用戶配置下的文件設置。如果你的設置足夠簡單,那麼INI文件就可以完美地工作。
  2. 將設置存儲在註冊表中,位於配置文件的一部分HKEY_CURRENT_USER下。

我個人更喜歡使用註冊表,因爲它提供免費的分層存儲。如果你使用一個文件,那麼你必須自己做,這可以成爲更復雜數據的綁定。另一方面,如果您想編寫一個便攜式應用程序,即可以存儲在記憶棒上的便攜式應用程序,那麼位於可執行文件旁邊的用戶設置文件就是要走的路。

+1

我個人更喜歡總是寫一個便攜式應用程序,而不是在註冊表中存儲任何東西。 Delphi非常適合創建非安裝應用程序:從任何你想要的位置創建複製和運行......這當然是個人品味的問題,但我經常將用戶/客戶視爲真正的好/獨特的。關於UAC和簡檔,甚至一些應用程序現在傾向於將可執行文件放入用戶數據中,例如,谷歌瀏覽器。 ;) –

+0

@arnaud有很多不同的選項,不同的解決方案最適合不同的情況。我的應用通常運行在公司設置中,因此註冊表是一個很好的解決方案 –

+0

除了INI文件,您還可以使用JSON或XML格式,這可以是分層的,所以可以更好地映射主/細節信息或偏好樹 - 我發現組織爲樹的偏好可能比名單。列表是特定類型的樹,而相反是不正確的。 Delphi 2010可以處理JSON和XML,並且你有很多第三方庫。 –

2

INI文件對我來說總是有用的。有TIniFile,所以你可以很容易地讀/寫文件沒有太多的工作,你可以指定默認值爲不存在的值和INI文件是一個人類可讀的格式,所以用戶可以看看它,並編輯它,如果他要。

其他解決方案,如在註冊表中存儲值也是可能的,但通常依賴於操作系統並且有點複雜。如果用戶不能看到/編輯這些值,我會用這樣的,但是你提到的應用程序設置並不是什麼「祕密」。

+2

使用ini文件或註冊表外的任何內容時,使用正確的文件夾很重要:**用戶配置文件**中的文件夾,最好是應用程序數據文件夾的子文件夾。這很重要,因爲這樣您將與漫遊配置文件和UAC兼容。 –

+0

@Marjan UAC總是令人擔憂,你完全正確。有些程序甚至傾向於在數據文件夾中安裝可執行文件,例如我注意到應用程序數據文件夾中的Google Chrome可執行文件,而不是程序文件文件夾中......我也爲一些項目完成了這項工作,並從客戶POV這是值得的。我知道這打破了UAC的設計,但恕我直言,這個設計從一開始就被打破了......這是一個令人討厭的主題! ;) –

+0

@arnaud chrome方法在多用戶設置中是無望的,因爲每個用戶都需要自己的安裝。幾乎不是一個好主意。 –

0

如果它是一個數據庫應用程序(使用數據庫),那麼也將用戶偏好存儲到數據庫中。我更喜歡在用戶表中存儲BLOB,並將用戶的首選項存儲爲INI文件格式。主要原因(每個用戶使用一個BLOB)是使用適當的規範化可能會減慢應用程序的啓動速度。一個小問題是,VCL's TIniFile不支持從TStream加載內容,您必須使用一些第三方類或自行推出以避免將數據臨時保存在磁盤上。

+0

TMemIniFile可以使用TStream進行流處理,並且它也比TIniFile更好。 –

+0

@David AFAIK不是直接的,而是通過SetStrings ...所以你必須使用tmp StringList從流中加載數據。 IOW這是一個黑客:) – ain

+1

根據n層模式,「主」數據庫不是恕我直言的最佳位置來存儲用戶界面首選項,最後使用的名單,等等。用戶計算機上的本地文件也是有意義的。關於TIniFile(或TMemIniFile),在文件上臨時複製BLOB內容不是問題。 –

3

正如@David指出的那樣,您可以使用註冊表,文件或 - 自然 - 這些組合。

如果您使用的是文件,則必須將它們存儲在文件系統的當前用戶部分中。事實上,一個用戶不應該影響系統的任何其他用戶是一個基本原則,並且Windows強制執行此操作(例如,在沒有提升權限的情況下運行時無法將文件保存在Program Files目錄中)。

例如,我AlgoSim軟件可以在

C:\Users\Andreas Rejbrand\AppData\Roaming\Rejbrand\AlgoSim\2.0 

文件夾中存儲其設置。這是一個典型的例子。你得到的目錄的第一部分,也就是

C:\Users\Andreas Rejbrand\AppData\Roaming 

通過詢問的操作系統能夠爲每個用戶應用程序數據文件夾。您可以使用SHGetKnownFolderPath函數來查找。使用FOLDERID_RoamingAppData文件夾ID。如果您需要支持較舊版本的Windows,則可以使用SHGetFolderPath,並使用CSIDL_APPDATA常數。

路徑的其餘部分通常遵循模式

Manufacturer Name\Product Name\Product Version 

什麼文件來存儲?那麼最簡單的方法就是使用老式的INI文件,但也可以使用XML,純文本格式的文件,甚至是自己設計的二進制文件。

第二種方法是使用註冊表而不是文件。這你可能已經知道該怎麼做了。如果不是的話,你會很容易從例子中學習。舉例來說,我可以在

HKEY_CURRENT_USER\Software\Rejbrand\AlgoSim\2.0 

存儲我的每用戶設置在這種情況下,操作系統是足夠聰明的「模仿」每個用戶的「程序文件」文件夾。雖然程序認爲它正在讀寫Program Files文件夾,但它實際上是從文件系統的當前用戶部分讀取和寫入文件夾。這樣,即使在較新版本的Microsoft Windows操作系統中,舊的和不良表現的應用程序也能繼續工作,並且此外,它們開始支持每個用戶的設置,他們應該首先完成這些設置。我真的認爲這對微軟來說是一個主要的+1,正如我之前所說的。

+0

爲什麼你非常專注於非漫遊應用程序數據? *設置*將被*漫遊*。 –

+0

@Downvoter:可能是無知。我沒有企業網絡和計算經驗。 –

+0

我不知道你在那裏存儲了什麼,但是「本地應用數據」是用於用戶配置文件的機器特定部分,例如:可以在正常操作期間重新創建的數據,並且不值得漫遊到網絡配置文件中。類似的東西。 –

2

我儘可能避免在註冊表中存儲任何東西。通過從用戶的CSIDL_APPDATA文件夾中複製文件,我的應用程序很容易移動到另一臺計算機上。

...我會提供一個幫助組件:www.deepsoftware.ru的TrsStorage庫。除了爲各種數據類型(包括小數據類型和大數據類型 - 包括字符串,整數,浮點數,流,緩衝區等)提供簡單的持久化方法之外,還可以將組件放置到表單上,以訪問發佈窗體上所有組件的屬性......您只需選中要保留的各個屬性即可。不,它不適用於任何事情 - 比如你的「最後10個文件」要求。但它應該適用於您的顏色,工具欄開/關,面板寬度,默認保存目錄,默認打開的目錄等。

TrsStorage還有大量的手動數據存儲&遍歷方法。我已經使用這些來實現報告設置的繼承樹 - 使得「後代」報告可以輕鬆存儲覆蓋「祖先」設置的設置,例如默認報告字體&字體大小。 (這些設置模仿我的報告類型的對象層次結構。)您可以使用這些手動方法調用之一手動保存「最近10個文件」列表;實際上,如果將它保存在TStrings對象中,則應該有ReadText/WriteText過程用於存儲/檢索「最近10個文件」列表。

TrsStorage從您選擇的數據文件類型中讀取/寫入:.INI,.XML或它自己的.BIN格式。事件可用於攔截從文件寫入/讀取以及將流轉移到別處:我們有時使用它來將每個記錄設置存儲在數據庫表的BLOB字段中。

最後,我沒有與這些人聯繫,但我已經成功地使用了他們的TrsStorage組件多年。

相關問題