Вопрос

Обновлять:Я добавил следующий код:


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;

Это было полезно?

Решение

В Vista вашей программе НЕ разрешено писать в каталог программных файлов, где находится ваша программа.

Теперь вам нужно сохранить ваши ini-файлы в каталоге AppData.

Описание того, как это сделать в Delphi, находится по адресу:http://www.theabsolute.net/sware/delphivista.html#datafolder

А чтобы обеспечить совместимость с Vista/Windows 7, остальная часть этой веб-страницы будет хорошим ориентиром.


Для вашего обновления вы не можете одновременно создавать каталог глубиной более 1 уровня.Использовать Функция ForceDirectories вместо:

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

п.с.Не бойтесь записывать настройки программы в Реестр.Для этого и нужен реестр.Фактически, он правильно обрабатывает настройки для разных пользователей, когда разные пользователи входят в систему.Реестр работает таким же образом в 98/Vista/7.В то время как ini-файлы фактически устарели и больше не используются Windows.

Вы говорите, что не хотите возиться с реестром, потому что «каждая мелочь, которую вы в него добавляете, еще больше замедляет работу компьютера».На самом деле это НЕ так.Реестр — это просто база данных.А если это 10 МБ или 100 МБ, разница во времени доступа незаметна.

Именно все компании, продающие программы очистки реестра, пытаются сохранить эту сказку.Использование их чистящих средств может принести вам больше вреда, чем пользы.Все, что им нужно сделать, это стереть одну или две важные записи, и вы можете оказаться в полной беде.Пожалуйста прочти эта статья о средствах очистки реестра, и особенно раздел «Незначительный выигрыш в производительности», в котором правильно объясняется, что проблемы с реестром в Windows 98 и более ранних версиях в основном устранены.

Если ваша программа добавит в Реестр более 2 или 3 КБ, это будет очень много, и это незначительная сумма.Используйте реестр.Сделай это правильно.

Другие советы

Вам следует использовать каталог ApplicationData для данных вашего приложения. В Delphi вы можете найти эту папку программно, используя функцию API оболочки SHGetSpecialFolderLocation.

У Embarcadero есть страница часто задаваемых вопросов по этому поводу. здесь.

Как уже говорилось — ничего не сохраняйте в папке приложения.

Вам следует разделить настройки конфигурации на две части:

Одна часть содержит настройки, которые должны работать независимо от пользователя — эта часть должна храниться в COMMON_APPDATA.

Вторая часть, содержащая настройки отдельных пользователей (личный выбор пользователем шрифта и т. д.) — эта часть должна храниться в APPDATA.

Что касается CreateDir, то это правда, что вы не можете создать более одного уровня одновременно, однако в Delphi есть функция ForceDirectories, которая может сделать именно это.

напримерForceDirectories('C:\MyFolder\SubFolder\SubSubFolder');

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top