在Win32 Delphi应用程序中存储用户首选项和设置的最佳实践是什么?

时间:2011-07-30 14:31:02

标签: delphi settings delphi-2010 preferences

我想在Delphi Win32应用程序中存储用户首选项(颜色,工具栏开/关,面板宽度,以像素为单位)和应用程序设置(最后10个文件,默认保存目录,默认打开目录)。这样做的最佳做法是什么?

5 个答案:

答案 0 :(得分:11)

您有两个主要选择:

  1. 将设置存储在用户个人资料下的文件中。如果你的设置足够简单,那么INI文件可以很好地工作。
  2. 将设置存储在HKEY_CURRENT_USER下的注册表中,该{{1}}也是个人资料的一部分。
  3. 我个人更喜欢使用注册表,因为它免费提供分层存储。如果你使用一个文件,那么你必须自己做,这可以绑定更复杂的数据。

    另一方面,如果你想编写一个便携式应用程序,即一个可以存在于记忆棒上的应用程序,那么与可执行文件并排放置的用户设置文件就可以了。

答案 1 :(得分:3)

正如@David指出的那样,你可以使用注册表,文件,或者 - 自然 - 这些的组合。

如果您选择文件,则必须将它们存储在文件系统的当前用户部分中。实际上,一个基本原则是一个用户不应该影响系统的任何其他用户,并且Windows强制执行此操作(例如,在没有提升权限的情况下运行时,无法将文件保存在Program Files目录中 1 )。

例如,我的AlgoSim软件可以将其设置存储在

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

文件夹。这是一个典型的例子。您将获得目录的第一部分,即

C:\Users\Andreas Rejbrand\AppData\Roaming

向操作系统询问每用户app数据文件夹。您可以使用SHGetKnownFolderPath功能查找此信息。使用FOLDERID_RoamingAppData文件夹ID。如果您需要支持旧版本的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,正如我之前所说的那样。

答案 2 :(得分:2)

INI文件总是对我有用。有TIniFile,因此您可以轻松地读取/写入文件而无需太多工作,您可以将默认值分配给不存在的值,INI文件采用人类可读的格式,以便用户可以查看它并根据需要进行编辑。

其他解决方案,例如在注册表中存储值也是可能的,但通常依赖于操作系统,而且有点复杂。如果用户不能看到/编辑值,我会使用这样的,但你提到的应用程序设置并不是一个“秘密”。

答案 3 :(得分:2)

我尽量避免在注册表中存储任何。只需从用户的CSIDL_APPDATA文件夹中复制文件,我的应用就可轻松移动到另一台机器上。

...我会建议一个有用的组件:来自www.deepsoftware.ru的TrsStorage库。除了为各种数据类型(包括小型和大型数据类型 - 字符串,整数,浮点数,流,缓冲区等)提供简单的持久性方法外,它们还有一个组件,您可以将其放到表单上,该表单可以访问已发布表单上所有组件的属性...您只需选中标记要保留的各个属性。不,它不适用于所有事情 - 例如您的“最后10个文件”要求。但它应该适用于您的颜色,工具栏开/关,面板宽度,默认保存目录,默认打开目录等。

TrsStorage拥有大量手动数据存储功能。遍历方法也是如此。我已经使用它们来实现一种用于报告设置的继承树 - 使“后代”报告可以轻松存储覆盖“祖先”设置的设置,例如默认报告字体和放大器。字体大小。 (这些设置模仿我的报告类型的对象层次结构。)您可以使用这些手动方法调用之一手动保存“最后10个文件”列表;实际上,如果将它保存在TStrings对象中,则有ReadText / WriteText过程可用于存储/检索“最后10个文件”列表。

TrsStorage读取/写入您选择的数据文件类型:.INI,.XML或其自己的.BIN格式。事件可用于拦截对文件的写入/读取,并将流转移到其他地方:我们有时会将其用于,例如,将每个记录设置存储在数据库表的BLOB字段中。

最后,我与这些人没有联系,但我已成功使用他们的TrsStorage组件多年。

答案 4 :(得分:0)

如果它是数据库应用程序(使用数据库),那么也将用户首选项存储到数据库中。我更喜欢在用户表中有一个BLOB,我以INI文件格式存储用户的首选项。主要原因(每个用户使用一个BLOB)是使用适当的规范化可能会减慢应用程序的启动速度。一个小警告是VCL's TIniFile不支持从TStream加载内容,你必须使用一些第三方类或自己滚动以避免临时将数据保存在磁盘上。