Delphi ini文件vista / xp / win7

时间:2010-01-19 03:30:05

标签: delphi config ini

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


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;

3 个答案:

答案 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');