5,692,513 members and growing! (16,165 online)
Email Password   helpLost your password?
Languages » VB.NET » General     Intermediate

Save and Restore User Preferences

By GWSyZyGy

Persist virtually any information (including user defined structures, enums, object, etc.), per user.
VB, Windows, .NET 1.0, .NETVisual Studio, VS.NET2002, Dev

Posted: 17 Jul 2003
Updated: 15 Jan 2004
Views: 93,413
Bookmarked: 49 times
Announcements
Loading...



Search    
Advanced Search
Sitemap
19 votes for this Article.
Popularity: 4.98 Rating: 3.89 out of 5
1 vote, 5.3%
1
1 vote, 5.3%
2
2 votes, 10.5%
3
4 votes, 21.1%
4
11 votes, 57.9%
5

Screen Shot

Introduction

There are several samples available to save and restore application or user preferences, but most are limited to primatives (numbers, dates, booleans, strings, etc.), or have code to handle specific types of objects. I found this approach too limiting, and frankly, too complex for what is a fairly simple operation - convert _X_ to a string and back again.

The answer lies mainly in two built-in interfaces:

  • IConvertable is implemented by all "primatives" and enumerations, and identifies something that can be converted directly to a string and back.
  • ISerializable is implemented by a variety of objects, including Font, Image, Icon, and DataSet. It provides methods for converting an object to a stream (serialize) and back again (deserialize). Additionally, any structure with the <Serializable()> attribute can also be serialized, such as Color or Point.

Background

This sample is built around actual production code that I use, to save user preferences to a SQL Server database. The code in the demo was modified to simply use text files.

Using the code

Sample Code

The following excerpts from the demo code show, how easy it is to save and restore various user preferences: a Color, a Font, and a String. The demo will also demonstrate an Enum (CheckState), a DateTime, an Image, and a user-defined Structure (via frmWindowSettings). Move the form, resize it -- it will appear the same the next time you run the application.

Protected Overrides Sub OnLoadSettings()
    ' Let mybase do its thing...


    MyBase.OnLoadSettings()

    ' Load my form's data:

    ' TextBox attributes: text (String), font (Object), color (Structure)

    tbFreeForm.ForeColor = CType(UserPreferences.GetPreference
                ("FREEFORM.COLOR", tbFreeForm.ForeColor), Color)
    tbFreeForm.Font = CType(UserPreferences.GetPreference
                ("FREEFORM.FONT", tbFreeForm.Font), Font)
    tbFreeForm.Text = CType(UserPreferences.GetPreference
                ("FREEFORM.TEXT", tbFreeForm.Text), String)
End Sub

Protected Overrides Sub OnSaveSettings()
    ' Let mybase do its thing...

    MyBase.OnSaveSettings()

    ' Save my form's data:

    UserPreferences.SavePreference("FREEFORM.COLOR", 
                             tbFreeForm.ForeColor, True)
    UserPreferences.SavePreference("FREEFORM.FONT", tbFreeForm.Font, True)
    UserPreferences.SavePreference("FREEFORM.TEXT", tbFreeForm.Text, True)

    ' Since this is the "main" window, now we

    ' tell UserPrefs to actually save:

    UserPreferences.SavePreferences()
End Sub

UserPreferences

The UserPreferences class has several static (Shared) methods:

Public Shared Function GetPreference(ByVal Key As String, 
                                  ByVal DefaultValue As Object) As Object
  • Key is the unique identifier for the preference
  • DefaultValue is the value to return if no saved preference can be found.

Returns a saved preference (if found), or the provided DefaultValue. The Type of the DefaultValue must match the type of the saved preference -- it is used to determine how to restore the saved value.

Public Shared Sub SavePreference(ByVal Key As String, ByVal Value As Object, 
                                                    ByVal Persist As Boolean)
  • Key is the unique identifier for the preference
  • Value is the value to be saved
  • Persist determines if the value is saved between sessions (True), or only stored in memory while the application is running (False).

Saves the specified value to the local cache; will optionally flag persistence to a file.

Public Shared Property AutoSave() As Boolean

Sets the save mode for the UserPreferences: Use AutoSave = True to enable atomic (key/value) saves, each time SavePreference is called. Use AutoSave = False to use the bulk save method. The demo only supports AutoSave = False.

Public Shared Function DefaultFileName() As String

Returns the default filename used to save/load user preferences. It will be in the format:

x:\Documents and Settings\<username>\Application Data\
                                <exename>\Preferences.dat
Public Shared Sub FetchPreferences(Optional ByVal FileName As String = "")
  • FileName is the filename to use (or DefaultFileName, if not provided).

Loads in all user preferences saved in the specified file.

Public Shared Sub SavePreferences(Optional ByVal FileName As String = "")
  • FileName is the Filename to use (or DefaultFileName, if not provided).

Saves all user preferences to the specified file.

frmWindowSettings

Also included is an ancestor form, that automatically saves and restores its last size, position, and state. I use this form as an inheritance base, whenever creating a new window. It provides custom "events" to easily add load/save code, as well as a new property:

Protected Overridable Sub OnLoadSettings()

Called when the form and controls have been created and initialized.

Protected Overridable Sub OnSaveSettings()

Called when the form is closing.

Protected Overridable Sub OnRendered()

Called when the form is first made visible.

Public Property SaveSettings() As Boolean

Set True to enable window size/position restore (default); set False to disable. SaveSettings = False will not disable OnSaveSettings or OnLoadSettings, just the ancestor behavior.

Points of interest

When developing the routines, I found that DateTime is not 100% "convertible." When a DateTime is converted to a String, only seconds are kept, and any fractions are discarded. To prevent data loss, DateTime values are stored as ticks (1/10,000 sec.) in SavePreference().

History

  • 1 Nov 2003 - udpated sourcecode
  • 16 Jan 2004 - updated sourcecode

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

GWSyZyGy



Occupation: Team Leader
Location: United States United States

Other popular VB.NET articles:

Article Top
Sign Up to vote for this article
You must Sign In to use this message board.
FAQ FAQ Noise ToleranceSearch Search Messages 
 Layout  Per page   
 Msgs 1 to 21 of 21 (Total in Forum: 21) (Refresh)FirstPrevNext
Generalsimple use ::memberwknows2:35 25 Oct '07  
GeneralVersioning Problems when strong namedmemberdavidko6:12 31 Mar '05  
GeneralRe: Versioning Problems when strong namedsussGWSyZyGy5:10 7 Apr '05  
GeneralExcellent classmemberoldie_the_geordie0:26 6 Feb '04  
GeneralRe: Excellent classsussGWSyZyGy5:08 6 Feb '04  
GeneralWorking with exceptions ...memberSébastien Lorion8:12 17 Jan '04  
GeneralRe: Working with exceptions ...memberGWSyZyGy5:52 20 Jan '04  
GeneralRe: Working with exceptions ...memberSébastien Lorion18:02 20 Jan '04  
GeneralError when returning empty strings!memberFilip D'haene13:55 14 Dec '03  
GeneralRe: Error when returning empty strings!memberGWSyZyGy10:00 14 Jan '04  
GeneralSave/restore to SQL Servermemberzsidi1:19 26 Nov '03  
GeneralRe: Save/restore to SQL ServersussGWSyZyGy6:25 3 Dec '03  
GeneralIt does not save Serializable objectsmemberIgor Gribanov4:33 29 Sep '03  
GeneralRe: It does not save Serializable objectssussGWSyZyGy12:22 24 Oct '03  
GeneralInterestingeditorNick Parker5:29 19 Jul '03  
GeneralRe: InterestingsussGWSyZyGy5:24 21 Jul '03  
GeneralRe: Interestingmemberkbuchan3:04 22 Jul '03  
GeneralRe: Interestingmemberdgthornhill5:26 23 Jul '03  
GeneralRe: InterestingsussGWSyZyGy5:49 23 Jul '03  
GeneralRe: InterestingsussGWSyZyGy5:55 23 Jul '03  
GeneralRe: InterestingsussGWSyZyGy5:08 24 Jul '03  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 15 Jan 2004
Editor: Nishant Sivakumar
Copyright 2003 by GWSyZyGy
Everything else Copyright © CodeProject, 1999-2008
Web16 | Advertise on the Code Project