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を使用したことがなく、このソフトウェアをWindows2K+と互換性があるようにしたいと考えています。設定を保存するにはどうすればよいですか。また、レジストリを少しずつ追加すると、コンピュータの速度が大幅に低下するため、レジストリをいじりたくありませんでした...(またはそう思われます)

ご入力いただきありがとうございます。



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ディレクトリに保存する必要があります。

デルファイでこれを行う方法の説明は次の場所にあります: http ://www.theabsolute.net/sware/delphivista.html#datafolder

また、Vista / Windows 7と互換性を持たせるには、そのWebページの残りの部分が適切なガイドラインになります。


更新の場合、一度に1レベルを超える深さのCreateDirを作成することはできません。代わりにForceDirectories関数を使用してください。

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

psレジストリにプログラム設定を書き込むことを恐れないでください。それがレジストリの目的です。実際、さまざまなユーザーがログインしているときに、さまざまなユーザーの設定を適切に処理します。レジストリは、98 / Vista/7でも同じように機能します。一方、iniファイルは実際には減価償却されており、Windowsでは使用されなくなりました。

レジストリをいじりたくないと言うのは、「レジストリに少しでも追加すると、コンピュータの速度が大幅に低下する」からです。実際、それは真実ではありません。レジストリは単なるデータベースです。また、10MBまたは100MBの場合、アクセスにかかる時間の違いは認識できません。

このおとぎ話を続けようとしているのは、レジストリクリーナープログラムを販売しているすべての企業です。彼らのクリーナーを使用すると、善よりも害を及ぼす可能性があります。彼らがする必要があるのは、1つまたは2つの重要なエントリを一掃することだけであり、あなたは深いドゥードゥーに入ることができます。レジストリクリーナーに関するこの記事、特にWindows98以前のレジストリに関する問題がほぼ修正されたことを正しく説明している「わずかなパフォーマンス上の利点」のセクションをお読みください。

プログラムがレジストリに2または3KBを超える量を追加する場合、それは大量になり、わずかな量になります。レジストリを使用します。ちゃんとして。

于 2010-01-19T03:49:57.887 に答える
4

アプリデータにはApplicationDataディレクトリを使用する必要があります。Delphiでは、シェルAPI関数SHGetSpecialFolderLocationを使用してプログラムでこのフォルダを見つけることができます。

Embarcaderoには、これに関するFAQページがあります。

于 2010-01-19T04:04:20.193 に答える
2

すでに述べたように、アプリフォルダには何も保存しないでください。

構成設定を2つの部分に分割する必要があります。

ユーザーに関係なく機能する必要のある設定を含む1つの部分-その部分はCOMMON_APPDATAに格納する必要があります。

個々のユーザー設定(ユ​​ーザーによるフォントの個人的な選択など)を含む2番目の部分-その部分はAPPDATAに保存する必要があります

CreateDirに関しては、一度に複数のレベルを作成できないことは事実ですが、Delphiには、まさにそれを実行できるForceDirectories関数があります。

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

于 2010-01-19T08:05:01.557 に答える