【问题标题】:Delphi ini file vista/xp/win7Delphi ini 文件 vista/xp/win7
【发布时间】:2011-01-06 15:30:35
【问题描述】:

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


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;

【问题讨论】:

  • 查看我的更新(在我的回答中)。这应该让它工作。
  • 自 15 多年前第一个 Windows NT 版本以来,具有只读安装目录的用户帐户已经成为可能,并且在企业环境中相当普遍。您以前从未在此类帐户上进行过测试。除非您使用仅限 Vista 的 API 函数(MSDN 文档说明了每个函数所需的最低操作系统版本),否则答案中的技术肯定与 Windows 2000 及更高版本兼容。

标签: delphi config ini


【解决方案1】:

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

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

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

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


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

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

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

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

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

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

【讨论】:

  • 或者您可以简单地使用ForceDirectories()(在FileCtrl 单元中)而不是CreateDir() 来一次调用创建结构。
  • @mghie:谢谢。我不了解 ForceDirectories 功能。我已经更新了我的答案。
【解决方案2】:

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

Embarcadero 对此有一个常见问题解答页面,here.

【讨论】:

    【解决方案3】:

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

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

    包含必须对用户起作用的设置的一部分 - 该部分应存储在 COMMON_APPDATA 中。

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

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

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

    【讨论】:

    • +1。值得指出的是,COMMON_APPDATA 中的第一部分应被应用程序视为只读。安装程序可以编写所有必要的内容,它将具有适当的权限。以后的更改只能由具有足够权限的用户进行,需要检查或请求提升。
    • 你是对的。我通常将 SystemSettings 和 DefaultUserSettings 保存在 COMMON_APPDATA 中。在启动时我加载 SystemSsettings - 并检查当前用户的 APPDATA 中是否有 UserSettings。如果不是,我将从 COMMON_APPDATA 加载默认设置并将它们保存到用户 APPDATA - 现在可以使用了。
    • 创建新用户时可以使用默认用户appdata自动创建用户app_data初始设置(对已有用户无效)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    相关资源
    最近更新 更多