更新:我添加了以下代码:
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函数(见下文)。它不会创建文件夹结构。
- 结束更新 -
我落后于时代,关于做什么和不做什么。这就是我目前正在保存软件设置的方法。我刚刚在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 :(得分: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);
P.S。不要害怕将程序设置写入注册表。这就是注册表的用途。实际上,当不同的用户登录时,它会为您正确处理不同用户的设置。注册表在98 / Vista / 7中的工作方式相同。虽然ini文件实际上已经折旧,但Windows不再使用。
你说你不想乱用注册表,因为“你添加它的每一点点,都会让计算机变得更慢”。实际上这不是真的。注册表只是一个数据库。如果它是10 MB或100 MB,则访问所需的时间差异是不可接受的。
所有那些销售注册表清洁程序的公司都试图保持这个童话故事。使用他们的清洁工可能会给你带来更多弊大于利。他们所需要做的就是消灭一两个重要的条目,你可以进入深入的doo-doo。请阅读this article about Registry Cleaners,特别是“边际性能优势”部分,该部分正确解释了Windows 98及早期版本与注册表存在的问题已基本修复。
如果您的程序向注册表添加超过2或3 KB的内容,那将会很多,并且这是一个微不足道的数量。使用注册表。做得对。
答案 1 :(得分:4)
您应该将ApplicationData目录用于您的应用程序数据,在Delphi中,您可以使用shell api函数SHGetSpecialFolderLocation以编程方式找到此文件夹
Embarcadero有一个FAQ页面,here.
答案 2 :(得分:2)
如前所述 - 不要在app文件夹中保存任何内容。
您应该将配置设置分为两部分:
一部分包含必须与用户相关的设置 - 该部分应存储在COMMON_APPDATA中。
包含个人用户设置的第二部分(用户个人选择的字体等) - 该部分应存储在APPDATA中
对于CreateDir,确实不能一次创建多个级别 - 但是,Delphi具有可以完全实现的ForceDirectories功能。
e.g。 ForceDirectories( 'C:\ MyFolder文件\的子文件夹\ SubSubFolder');