Я хочу сохранить пользовательские настройки (цвета, включение / выключение панелей инструментов, ширину панели в пикселях) и настройки приложения (последние 10 файлов, каталог сохранения по умолчанию, открытый каталог по умолчанию) в моем приложении Delphi Win32. Как лучше всего это делать?
Каковы наилучшие методы хранения пользовательских предпочтений и настроек в приложениях Win32 Delphi?
Ответы (5)
У вас есть два основных варианта:
- Сохраните настройки в файле под профилем пользователя. Если ваши настройки достаточно просты, то файлы INI работают нормально.
- Сохраните настройки в реестре под
HKEY_CURRENT_USER
, который также является частью профиля.
Лично я предпочитаю использовать реестр, поскольку он предоставляет бесплатное иерархическое хранилище. Если вы используете файл, вам придется сделать это самостоятельно, что может быть привязкой к более сложным данным.
С другой стороны, если вы хотите написать портативное приложение, то есть приложение, которое может жить на карте памяти, то файл пользовательских настроек, который находится рядом с исполняемым файлом, - это путь.
Как указывает @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, и, кроме того, они начинают поддерживать индивидуальные настройки для каждого пользователя, что им и следовало делать в первую очередь. Я действительно думаю, что это большой плюс для Microsoft, как я мог бы сказать раньше.
local app data
относится к машинной части профиля пользователя, например: данные, которые могут быть воссозданы во время нормальной работы и не имеют смысла перемещаться с сетевым профилем. Что-то такое.
- person Premature Optimization; 31.07.2011
Файлы INI у меня всегда работают хорошо. Там TIniFile
, так что вы можете легко читать / записывать файлы без особых усилий, вы можете назначать значения по умолчанию несуществующим значениям, а файл INI находится в удобочитаемом формате, чтобы пользователь мог посмотреть на него и отредактировать его, если он хочет.
Возможны и другие решения, такие как сохранение значений в реестре, но часто зависят от ОС и немного сложнее. Я бы использовал это, если пользователь не должен иметь возможность видеть / редактировать значения, но указанные вами настройки приложения не являются «секретом».
По возможности я стараюсь не хранить что-либо в реестре. Мои приложения легко перенести на другой компьютер, просто скопировав файл из папки пользователя CSIDL_APPDATA.
... и я предлагаю компонент, который помогает: библиотеку TrsStorage с сайта www.deepsoftware.ru. Помимо предоставления простых методов сохранения для широкого диапазона типов данных (включая как малые, так и большие типы данных - строки, целые числа, числа с плавающей запятой, потоки, буферы и т. Д.), У них есть компонент, который вы можете поместить в форму, который обращается к опубликованные свойства всех компонентов в форме ... вы просто отмечаете отдельные свойства, которые хотите сохранить. Нет, это работает не для всех - например, для вашего требования "последние 10 файлов". Но он должен работать для ваших цветов, включения / выключения панелей инструментов, ширины панелей, каталога сохранения по умолчанию, открытого каталога по умолчанию и т. Д.
TrsStorage также имеет множество ручных методов хранения и обхода данных. Я использовал их для реализации своего рода дерева наследования для настроек отчета, что упростило для «дочерних» отчетов хранение настроек, которые переопределяют настройки «предка», такие как шрифт и размер шрифта отчета по умолчанию. (Настройки имитируют иерархию объектов моих типов отчетов.) Вы можете вручную сохранить список «последних 10 файлов», используя один из этих вызовов ручного метода; Фактически, существуют процедуры ReadText / WriteText, которые должны работать для хранения / извлечения вашего списка «последних 10 файлов», если вы храните его в объекте TStrings.
TrsStorage читает / записывает из / в выбранный вами тип файла данных: .INI, .XML или собственный формат .BIN. Также доступны события для перехвата записи / чтения из файла и перенаправления потока в другое место: мы иногда используем это, например, для сохранения настроек каждой записи в поле BLOB таблицы базы данных.
Наконец, я не имею отношения к этим людям, но я успешно использовал их компоненты TrsStorage в течение многих лет.
Если это приложение для базы данных (использует базу данных), сохраните и пользовательские настройки в базе данных. Я предпочитаю иметь большой двоичный объект в таблице пользователей, где я храню пользовательские предпочтения в формате файла INI. Основная причина (использование одного BLOB-объекта на пользователя) заключается в том, что использование правильной нормализации, скорее всего, замедлит запуск приложения. Одно небольшое предостережение: TIniFile VCL не поддерживает загрузку контента из TStream, вы придется использовать какой-то сторонний класс или использовать собственный, чтобы избежать временного сохранения данных на диске.