Показать сообщение отдельно
  #5  
Старый 19.10.2013, 05:31
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,098
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Alegun
Единственное замечание, INI файлы имеют ограничение на размер файла в 64 Kb...

Ну, тут вы совершенно не правы.
Ini-файл уже давно устаревшая технология.
Единственное оправдание использованию ini-файла, это когда его действительно надо править "руками". Кстати, даже в этом случае, писать его рядом с программой больше не получится, по крайней мере начиная с Vista и 2003 (ну мы же не хотим всегда запускать программу от имени администратора?).

Реестр, в общем, тоже уже устаревающая технология, которая, кроме того, теперь имеет еще и особенности, в связи с появлением x64. Хотя именно она наиболее используемая в данное время.

Еще несколько лет назад MS предложила использовать xml (не помню как он там точно должен был называться, Application.configuration.xml что ли). Но проблемы запрета записи в Program Files это не решало.

В принципе, не столько важен формат хранения (ini, xml, binary, etc), как то, где хранить настройки и другие рабочие файлы данных программы (не пользователя, хотя в некоторых случаях даже их, если это всегда один файл). Начиная, если не ошибаюсь, с Windows XP, MS рекомендует использовать для этого "папку" Application Data, путь к которой получается с помощью вызова функции SHGetSpecialFolder. Таких папок для юзера 2: одна для конкретного юзера, вторая - для всех юзеров (у них разные CSIDL'ы).

Вот пример из моей программы, которая сохраняет данные пользователя в этом месте (пользовательская AppData) (собрано из разных модулей):
Код:
const
  {$EXTERNALSYM CSIDL_COMMON_APPDATA}
  CSIDL_COMMON_APPDATA = $0023;

function GetSpecialFolderPath(CSIDL : Integer) : String;
var
  Path : PChar;
begin
  Result := '';
  GetMem(Path,MAX_PATH);
  Try
    If Not SHGetSpecialFolderPath(0,Path,CSIDL,False) Then
      Raise Exception.Create('Shell function SHGetSpecialFolderPath fails.');
    Result := Trim(StrPas(Path));
    If Result = '' Then
      Raise Exception.Create('Shell function SHGetSpecialFolderPath return an empty string.');
    Result := IncludeTrailingPathDelimiter(Result);
  Finally
    FreeMem(Path,MAX_PATH);
  End;
end;

function GetUserAppDataFolderPath : String;
begin
  Result := GetSpecialFolderPath(CSIDL_APPDATA);
end;

function GetUserFileName(AForcePath : Boolean = False) : String;
var
  APath : String;
begin
  Try
    APath := GetUserAppDataFolderPath;
    APath := IncludeTrailingPathDelimiter(APath + 'Visual.Reminder');
    If Not DirectoryExists(APath) Then
      If AForcePath Then
        If Not ForceDirectories(APath) Then
          Raise Exception.Create('Can''t force user profile path.');
  Except
    APath := ExtractFilePath(Application.ExeName);
    APath := IncludeTrailingPathDelimiter(APath);
  End;
  Result := APath + 'Reminders.vr';
end;

procedure TMainForm.SaveModel;
var
  AFileName : String;
begin
  AFileName := GetUserFileName(True);
  Try
    FModel.SaveToFile(AFileName);
  Except
    // Hide all exceptions
  End;
end;
Ответить с цитированием