4

更新:我添加了以下代码:


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;

4

3 回答 3

8

在 Vista 中,不允许您的程序写入您的程序所在的程序文件目录。

您现在必须将您的 ini 文件保存在 AppData 目录中。

如何在 delphi 中执行此操作的描述位于: http ://www.theabsolute.net/sware/delphivista.html#datafolder

为了与 Vista/Windows 7 兼容,该网页的其余部分将是一个很好的指南。


对于您的更新,您一次不能 CreateDir 超过 1 级深度。请改用ForceDirectories 函数

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

ps 不要害怕将程序设置写入注册表。这就是注册表的用途。事实上,当不同用户登录时,它会为您正确处理不同用户的设置。注册表在 98/Vista/7 中的工作方式相同。而 ini 文件实际上已经被折旧,并且不再被 Windows 使用。

你说你不想弄乱注册表,因为“你添加到它的每一点,都会让计算机减慢更多”。其实那不是真的。注册表只是一个数据库。如果是 10 MB 或 100 MB,访问所需的时间差异是难以察觉的。

正是所有那些销售 Registry Cleaner 程序的公司都试图让这个童话故事继续下去。使用他们的清洁剂可能弊大于利。他们需要做的就是删除一两个重要条目,您就可以陷入困境。请阅读这篇关于 Registry Cleaners的文章,尤其是“边际性能优势”部分,该部分正确解释了 Windows 98 及更早版本的注册表问题已基本得到修复。

如果您的程序向注册表添加超过 2 或 3 KB,那将是很多,而且是微不足道的。使用注册表。做对了。

于 2010-01-19T03:49:57.887 回答
4

您应该将 ApplicationData 目录用于您的应用程序数据,在 Delphi 中,您可以使用 shell api 函数 SHGetSpecialFolderLocation 以编程方式找到此文件夹

Embarcadero 有一个关于此的常见问题解答页面,这里。

于 2010-01-19T04:04:20.193 回答
2

如前所述 - 不要在 app 文件夹中保存任何内容。

您应该将配置设置分为两部分:

一部分包含必须与用户相关的设置 - 该部分应存储在 COMMON_APPDATA 中。

第二部分包含个人用户设置(用户个人选择的字体等) - 该部分应存储在 APPDATA

至于 CreateDir,您确实不能一次创建多个级别 - 但是,Delphi 有 ForceDirectories 函数可以做到这一点。

例如 ForceDirectories('C:\MyFolder\SubFolder\SubSubFolder');

于 2010-01-19T08:05:01.557 回答