更新:我添加了以下代码:
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;
Run Code Online (Sandbox Code Playgroud)
我已经改变了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;
Run Code Online (Sandbox Code Playgroud)
在Vista中,不允许您的程序写入程序所在的程序文件目录.
您现在必须将您的ini文件保存在AppData目录中.
有关如何在delphi中执行此操作的说明,请访问:http: //www.theabsolute.net/sware/delphivista.html#datafolder
要与Vista/Windows 7兼容,该网页的其余部分将是一个很好的指导方针.
对于您的更新,您不能一次创建超过1级的CreateDir.请改用ForceDirectories函数:
path:=AppDataPath+'\MyCompanyName\ProductName\';
if NOT DirectoryExists(path) then
ForceDirectories(path);
Run Code Online (Sandbox Code Playgroud)
ps不要害怕将程序设置写入注册表.这就是注册表的用途.实际上,当不同的用户登录时,它会为您正确处理不同用户的设置.注册表在98/Vista/7中的工作方式相同.虽然ini文件实际上已经折旧,但Windows不再使用.
你说你不想弄乱注册表,因为"你添加它的每一点点,都会使计算机的速度变慢".实际上这不是真的.注册表只是一个数据库.如果它是10 MB或100 MB,则访问所需的时间差异是不可接受的.
所有那些销售注册表清洁程序的公司都试图保持这个童话故事.使用他们的清洁工可能会给你带来更多弊大于利.他们所需要做的就是消灭一两个重要的条目,你可以进入深入的doo-doo.请阅读有关注册表清理程序的文章,尤其是"边际性能优势"部分,该部分正确解释了Windows 98及更早版本与注册表存在的问题已得到解决.
如果您的程序向注册表添加超过2或3 KB,那将是很多,并且它是一个微不足道的数量.使用注册表.做对了.