Delphi ini file vista / xp / win7 - PullRequest
       17

Delphi ini file vista / xp / win7

4 голосов
/ 19 января 2010

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


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 ]

8 голосов
/ 19 января 2010

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

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

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

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


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

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

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

Вы говорите, что не хотите связываться с реестром, потому что "каждый маленький кусочек, который вы добавляете в него, просто значительно замедляет работу компьютера".На самом деле это не так.Реестр - это просто база данных.И если это 10 МБ или 100 МБ, разница во времени, необходимая для доступа, является недопустимой.

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

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

4 голосов
/ 19 января 2010

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

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

2 голосов
/ 19 января 2010

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

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

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

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

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

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

...