2010-01-19 46 views
4

更新:我已經添加以下代碼:德爾福ini文件VISTA/XP/WIN7


function TSettingsForm.AppDataPath: string; 
//CSIDL_APPDATA Individual user Data 
//CSIDL_COMMON_APPDATA Common to Computer Data 
    // works so long as people have at least IE 4. (and Win95 or better) 
var 
    r: Bool; 
    path: array[0..Max_Path] of Char; 
begin 
    r := ShGetSpecialFolderPath(0, path, CSIDL_APPDATA, False) ; 
    if r then result := path 
    else result := ''; 
end; 

而且我已經改變了setinifilename功能(見下文)。它不會創建文件夾結構。

--End update--

我落伍了,就什麼和不該做。這是我目前正在保存我的軟件的設置。我剛剛在Vista上測試過它沒有以管理員身份登錄,並且它給了我一個錯誤消息,無法寫入ini文件。所以我猜我應該將數據寫入數據文件夾?我以前從未使用vista/win7,並且希望此軟件能夠與Windows 2K +兼容。我應該怎麼做才能保存設置。我也真的不想亂搞註冊表,因爲你添加到它的每一點點,放慢計算機只是更多...(或似乎是這樣)

感謝您的任何輸入。



procedure TSettingsForm.setinifilename; 
var filename:string; 
    Path:string; 
    begin 
    filename:='key.ini'; 
    path:=AppDataPath+'\MyCompanyName\ProductName\'; 
    if NOT DirectoryExists(path) then 
     CreateDir(path); 
    inifilename:= path+filename; 
    end; 

procedure TSettingsForm.SaveSettings; 
var 
appINI: TIniFile; 

begin 
    appINI := TIniFile.Create(inifilename) ; 
try 
    low:= Trunc (edt_low.value); 
    high:=Trunc (edt_high.value); 
    appINI.WriteInteger('SPEED','LOW',low); 
    appINI.WriteInteger('SPEED','HIGH',high); 
    appINI.WriteString('PROXY','SERVER',edtProxyServer.Text); 
    appINI.WriteString('PROXY','PORT',edtProxyPort.Text); 
    appINI.WriteString('PROXY','USERNAME',edtProxyUserName.Text); 
    appINI.WriteString('PROXY','PASSWORD',edtProxyPass.Text); 

// status.text:='Saved Data'; 
    finally 
    appIni.Free; 
    end; 
end; 
procedure TSettingsForm.GetSettings; 
Var 
    appINI : TIniFile; 
begin 
    appINI := TIniFile.Create(inifilename) ; 
    try 
    //if no last user return an empty string 
    edt_low.value:= appINI.ReadInteger('SPEED','LOW',0); 
    edt_high.value:= appINI.ReadInteger('SPEED','HIGH',0); 
    low:= Trunc (edt_low.Value); 
    high := Trunc (edt_high.Value); 

    edtProxyServer.Text:=appINI.ReadString('PROXY','SERVER',''); 
    edtProxyPort.Text:=appINI.ReadString('PROXY','PORT','0'); 
    edtProxyUserName.Text:=appINI.ReadString('PROXY','USERNAME',''); 
    edtProxyPass.Text:= appINI.ReadString('PROXY','PASSWORD',''); 
    finally 
    appINI.Free; 
    end; 
end; 

+0

看到我的更新(在我的答案)。這應該讓它起作用。 – lkessler

+3

自15年前的第一個Windows NT版本以來,具有隻讀安裝目錄的用戶帳戶已成爲可能,並且在企業環境中很常見。你以前從未在這樣的賬戶上測試過。除非您使用僅支持Vista的API函數(MSDN文檔指出每個函數的最低必需操作系統版本),否則答案中的技術肯定與Windows 2000及更高版本兼容。 – mghie

回答

8

在Vista中,您的程序不允許寫入您的程序所在的程序文件目錄。

您現在必須將您的ini文件保存在AppData目錄中。

如何做到這一點在Delphi中的描述是: http://www.theabsolute.net/sware/delphivista.html#datafolder

而且是VISTA/Windows 7的兼容,該網頁的其餘部分將是一個很好的指引。


對於您的更新,您無法一次創建超過1層的CreateDir。使用ForceDirectories function代替:

path:=AppDataPath+'\MyCompanyName\ProductName\'; 
    if NOT DirectoryExists(path) then 
     ForceDirectories(path); 

附:不要害怕將程序設置寫入註冊表。這就是註冊表的用途。實際上,當不同用戶登錄時,它可以正確處理不同用戶的設置。註冊表在98/Vista/7中以相同的方式工作。而ini文件實際上已被折舊,並且不再被Windows使用。

你說你不想亂註冊表,因爲「你添加的每一點點都會讓計算機變得更慢」。其實這不是事實。註冊表只是一個數據庫。如果它是10 MB或100 MB,訪問所花費的時間差異是不可接受的。

這是所有這些公司正在銷售註冊表清理程序,試圖保持這個童話故事。使用他們的清潔工可以使你受到更多的傷害,而不是更好他們所需要做的就是消滅一兩個重要的條目,並且你可以深入Doo-doo。請閱讀this article about Registry Cleaners,尤其是「邊際性能優勢」部分,它正確解釋了Windows 98及其早期版本與註冊表存在的問題已基本修復。

如果您的程序向註冊表添加了2或3 KB以上,那將會很多,而且數量也不是很大。使用註冊表。做對了。

+0

感謝您提供的信息,我將它添加到我的應用程序中。 – Brad

+5

或者您可以簡單地使用'ForceDirectories()'(在'FileCtrl'單元中)而不是'CreateDir()'在一次調用中創建結構。 – mghie

+0

@mghie:謝謝。我不瞭解ForceDirectories的功能。我已經更新了我的答案。 – lkessler

4

您應該使用的ApplicationData目錄應用數據,在Delphi中你可以找到這個文件夾編程使用shell API函數SHGetSpecialFolderLocation

Embarcadero公司對這一常見問題解答頁面,here.

2

前面已經提到 - 不要在應用程序文件夾中保存任何內容。

你應該分裂您的配置設置分爲兩個部分:包含必須努力用戶的regardlees設置

一部分 - 這部分應該被存放在COMMON_APPDATA。

包含個人用戶的設置(用戶的字體等個人選擇)的第二部分 - 這部分應該存儲在APPDATA

至於CreateDir,這是事實,你不能在創建一個以上的水平時間 - 然而,德爾福有ForceDirectories功能,可以做到這一點。

例如ForceDirectories( 'C:\ MyFolder文件\的子文件夾\ SubSubFolder');

+1

+1。值得指出的是,'COMMON_APPDATA'中的第一部分應該被應用程序認爲是隻讀的。安裝程序可以編寫所有必需的東西,它將具有適當的權限。以後的更改只能由具有足夠權限的用戶進行,這些權限需要檢查或要求提升。 – mghie

+0

你說得對。我通常在COMMON_APPDATA中保存SystemSettings和DefaultUserSettings。在啓動時加載SystemSsettings - 並檢查當前用戶是否在其APPDATA中具有UserSettings。如果沒有,我會從COMMON_APPDATA加載默認設置並將它們保存到用戶APPDATA - 現在可以使用。 – TechnoCowboy

+1

您可以使用默認用戶appdata在創建新用戶(它不適用於已有用戶)時自動創建用戶app_data初始設置。 – 2010-01-19 13:26:57