Delphi ini文件vista/xp/win7

Bra*_*rad 4 delphi ini config

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


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)

lke*_*ler 8

在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,那将是很多,并且它是一个微不足道的数量.使用注册表.做对了.

  • 或者您可以简单地使用`ForceDirectories()`(在`FileCtrl`单元中)而不是`CreateDir()`来在一次调用中创建结构. (5认同)