Каковы рекомендации по хранению пользовательских настроек и настроек в приложениях Win32 Delphi? - PullRequest
4 голосов
/ 30 июля 2011

Я хочу сохранить пользовательские настройки (цвета, вкл / выкл панелей инструментов, ширину панели в пикселях) и настройки приложения (последние 10 файлов, каталог сохранения по умолчанию, открытый каталог по умолчанию) в моем приложении Delphi Win32. Какова лучшая практика для этого?

Ответы [ 5 ]

11 голосов
/ 30 июля 2011

У вас есть два основных варианта:

  1. Сохранение настроек в файле под профилем пользователя.Если ваши настройки достаточно просты, тогда INI-файлы работают совершенно адекватно.
  2. Сохраните настройки в реестре, в разделе HKEY_CURRENT_USER, который также является частью профиля.

Лично я предпочитаюиспользовать реестр, поскольку он предоставляет иерархическое хранилище бесплатно.Если вы используете файл, то вы должны сделать это самостоятельно, что может стать связующим звеном для более сложных данных.

С другой стороны, если вы хотите написать переносное приложение, то есть такое, которое может жить накарта памяти, а затем файл пользовательских настроек, который находится рядом с исполняемым файлом - это путь.

3 голосов
/ 30 июля 2011

Как указывает @David, вы можете использовать реестр, файлы или, естественно, их комбинацию.

Если вы обращаетесь к файлам, вы должны хранить их в текущей пользовательской части файловой системы. Действительно, это фундаментальный принцип, согласно которому один пользователь не должен влиять на любого другого пользователя системы, и Windows применяет это (например, вы не можете сохранять файлы в каталоге Program Files при работе без повышенных привилегий 1 ) .

Например, мое программное обеспечение AlgoSim может сохранять свои настройки в

C:\Users\Andreas Rejbrand\AppData\Roaming\Rejbrand\AlgoSim\2.0

папка. Это типичный пример. Вы получаете первую часть каталога, то есть

C:\Users\Andreas Rejbrand\AppData\Roaming

, запрашивая у операционной системы папку данных приложения для пользователя. Вы можете использовать функцию SHGetKnownFolderPath, чтобы найти это. Используйте FOLDERID_RoamingAppData идентификатор папки. Если вам требуется поддержка более старых версий Windows, вы можете вместо этого использовать SHGetFolderPath и использовать константу CSIDL_APPDATA.

Остальная часть пути обычно следует шаблону

Manufacturer Name\Product Name\Product Version

Какие файлы хранить? Ну, самый простой способ - использовать устаревшие INI-файлы, но вы также можете использовать XML, текстовые файлы в вашем собственном формате или даже двоичные файлы вашего собственного дизайна.

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

HKEY_CURRENT_USER\Software\Rejbrand\AlgoSim\2.0

1 В этом случае операционная система достаточно умна, чтобы «эмулировать» папку «Program Files» для каждого пользователя. В то время как программа считает , что она читает и записывает в папку Program Files, она фактически читает и записывает в папку в текущей части файловой системы пользователя. Таким образом, старые приложения с плохим поведением продолжают работать даже в более новых версиях операционной системы Microsoft Windows, и, кроме того, они начинают поддерживать настройки для каждого пользователя, что они должны были сделать в первую очередь. Я действительно думаю, что это главный +1 для Microsoft, как я мог бы сказать раньше.

2 голосов
/ 31 июля 2011

Я стараюсь не хранить что-либо в реестре, когда это возможно. Мои приложения легко переносятся на другой компьютер, просто копируя файл из пользовательской папки CSIDL_APPDATA.

... и я предложу компонент, который поможет: библиотека TrsStorage от www.deepsoftware.ru. Помимо предоставления простых методов персистентности для широкого диапазона типов данных (включая как маленькие, так и большие типы данных - строки, целые числа, числа с плавающей запятой, потоки, буферы и т. Д.), У них есть компонент, который вы можете перетащить в форму, которая обращается к опубликованные свойства всех компонентов в форме ... вы просто отметите отдельные свойства, которые вы хотите сохранить. Нет, это не работает для всего - как ваше требование "последних 10 файлов". Но он должен работать для ваших цветов, включения / выключения панелей инструментов, ширины панелей, каталога сохранения по умолчанию, открытого каталога по умолчанию и т. Д.

TrsStorage также предлагает множество ручных методов хранения и обхода данных. Я использовал их для реализации своего рода дерева наследования для параметров отчета - чтобы в отчетах «потомков» было легко сохранять параметры, которые переопределяют параметры «предков», такие как шрифт отчета по умолчанию и размер шрифта. (Настройки имитируют иерархию объектов моих типов отчетов.) Вы можете вручную сохранить список «последних 10 файлов», используя один из этих ручных вызовов методов; на самом деле, существуют процедуры ReadText / WriteText, которые должны работать для сохранения / извлечения списка «последних 10 файлов», если вы храните его в объекте TStrings.

TrsStorage читает / записывает из / в выбранный вами тип файла данных: .INI, .XML или его собственный формат .BIN. Кроме того, доступны события для перехвата записи / чтения из файла и перенаправления потока в другое место: мы используем это иногда, например, для сохранения настроек для каждой записи в поле BLOB таблицы базы данных.

Наконец, у меня нет связи с этими людьми, но я успешно использую их компоненты TrsStorage в течение многих лет.

2 голосов
/ 30 июля 2011

INI-файлы всегда работают хорошо для меня.Есть TIniFile, так что вы можете легко читать / записывать файлы без особой работы, вы можете назначать значения по умолчанию для несуществующих значений, а файл INI представлен в удобочитаемом формате, чтобы пользователь мог просмотреть его и отредактироватьесли захочет.

Возможны и другие решения, такие как хранение значений в реестре, но часто они зависят от ОС и немного сложнее.Я бы использовал это, если бы пользователь не мог видеть / редактировать значения, но настройки приложения, о которых вы упомянули, не слишком «секретны».

0 голосов
/ 30 июля 2011

Если это приложение базы данных (использует базу данных), сохраните пользовательские настройки в базе данных.Я предпочитаю иметь BLOB в таблице пользователей, где я храню предпочтения пользователей в формате INI.Основная причина (использование одного BLOB на пользователя) заключается в том, что правильная нормализация, скорее всего, замедлит запуск приложения.Небольшое предостережение: VCL TIniFile не поддерживает загрузку контента из TStream, вы должны использовать какой-нибудь сторонний класс или свернуть свой собственный, чтобы избежать временного сохранения данных на диск.

...