В архиве пример чтения (сохранения) настроек 2-х форм.
1-я форма читает (сохраняет) настройки из ini - файла.
2-я форма читает (сохраняет) настройки из файла ресурса.
Сохранение (чтение) ini - файла происходит в классе "IniSave.vb".
Сохранение (чтение) файла ресурса программным способом происходит благодаря классу "MyUserSettings.vb".
В 1-ом случае более-менее понятно.
Во 2-ом, выполняем привязку к свойству в обработчике событий Load формы. Но при сохранении одного из свойства, перебираются в классе все свойства, и, на мой взгляд, закрытие формы происходит с мерцанием и медленнее, чем в 1-ом, а открытие происходит быстрее.
Хочу спросить Вашего мнения, уважаемые форумчане, какой из методов чтения (сохранения) настроек формы наиболее предпочтительный?
Сталкивались ли Вы с проблемой сохранения настроек формы и как её решали?
В любом случае, примеры в архиве кому-то могут оказаться познавательными.
Код не особо читабельный, поэтому прилагаю и код программы, и пример на VS 2008.
- Код: Выделить всё
'Класс "IniSave" чтение (сохранение) настроек формы в ini - файле
Module IniSave
'Хэндл модуля (для обновления)
Private Declare Function GetActiveWindow Lib "user32" () As Integer
Public Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpString As String, _
ByVal lpFileName As String) As Integer
Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Integer, _
ByVal lpFileName As String) As Integer
Public sIniFile As String = _
IO.Path.Combine(Application.StartupPath, My.Application.Info.Title & ".ini")
Public Function ReadFromINI _
(ByVal sIniFile As String, _
ByVal sSection As String, _
ByVal sKey As String, _
Optional ByVal sDefault As String = vbNullString) As String
Dim sData As String
sData = New String(Chr(0), 128)
If GetPrivateProfileString(sSection, sKey, sDefault, sData, sData.Length, sIniFile) > 0 Then
ReadFromINI = sData.Substring(0, sData.IndexOf(Chr(0)))
Else
ReadFromINI = sDefault
End If
End Function
End Module
'Класс "MyAppSettings" - чтение (сохранение) настроек формы в файле ресурса (программно)
Imports System.Configuration
'ms-help://MS.MSDNQTR.v90.ru/dv_fxmancli/html/1e7aa347-af75-41e5-89ca-f53cab704f72.htm
'Определите в этом классе-оболочке свойство для каждого требуемого параметра приложения и примените его с атрибутом
Public Class MyAppSettings
Inherits ApplicationSettingsBase
<UserScopedSetting()> _
<DefaultSettingValue("Normal")> _
Public Property FormWindowState() As FormWindowState
Get
FormWindowState = Me("FormWindowState")
End Get
Set(ByVal value As FormWindowState)
Me("FormWindowState") = value
End Set
End Property
<UserScopedSetting()> _
<DefaultSettingValue("50,50")> _
Public Property FormLocation() As Point
Get
FormLocation = Me("FormLocation")
End Get
Set(ByVal value As Point)
Me("FormLocation") = value
End Set
End Property
<UserScopedSetting()> _
<DefaultSettingValue("500,500")> _
Public Property FormSize() As Size
Get
FormSize = Me("FormSize")
End Get
Set(ByVal value As Size)
Me("FormSize") = value
End Set
End Property
End Class
'1-я форма читает (сохраняет) настройки из ini - файла
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Чтение настроек формы
Dim Separator() As Char = {";"c}
Dim Sentence As String = _
Me.WindowState & Separator(0) & _
Me.Location.X & Separator(0) & _
Me.Location.Y & Separator(0) & _
Me.Size.Width & Separator(0) & _
Me.Size.Height
Sentence = ReadFromINI(sIniFile, Me.Name, "f", Sentence)
Dim words() As String = EnhancedSplit(Sentence, Separator)
If words.Count = 5 And AsIniForm(words) = True Then
Dim f As FormWindowState = CInt(words(0))
Dim p As New Point(CInt(words(1)), CInt(words(2)))
Dim z As New Size(CInt(words(3)), CInt(words(4)))
Me.WindowState = f
Me.Location = p
Me.Size = z
End If
End Sub
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
'Сохранение настроек формы
Dim Separator() As Char = {";"c}
Dim Sentence As String = _
Me.WindowState & Separator(0) & _
Me.Location.X & Separator(0) & _
Me.Location.Y & Separator(0) & _
Me.Size.Width & Separator(0) & _
Me.Size.Height
WritePrivateProfileString(Me.Name, "f", Sentence, sIniFile)
End Sub
Private Function EnhancedSplit(ByVal stringToSplit As String, _
ByVal delimiters() As Char) As String()
'Рецепты программирования на Microsoft VB.NET; Мастеркласс; 2004; Стр. 8.
'Создание собственной оболочки метода String.Split
'Разбиение строки на список слов и сохранение списка в массиве
Dim Words() As String
Words = stringToSplit.Split(delimiters)
'Добавление каждого корректного слова в объект типа ArrayList
Dim FilteredWords As New ArrayList()
Dim Word As String
For Each Word In Words
'Строка не должна быть пустой
If Word <> String.Empty Then
FilteredWords.Add(Word)
End If
Next
'преобразование объекта ArrayList в обычный массив строк
Return CType(FilteredWords.ToArray(GetType(String)), String())
End Function
Private Function AsIniForm(ByVal Words() As String) As Boolean
'Проверка на соответствие параметров формы
Dim i As Boolean
Dim Word As String
For Each Word In Words
If Not IsNumeric(Word) Then
i = True
End If
Next
If i = False Then
Return True
End If
End Function
End Class
'2-я форма читает (сохраняет) настройки из файла ресурса.
Public Class Form2
'Создание новых параметров приложения программными средствами
'ms-help://MS.MSDNQTR.v90.ru/dv_fxmancli/html/1e7aa347-af75-41e5-89ca-f53cab704f72.htm
Dim Mus As MyAppSettings
Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'Чтение настроек формы
'Создаем экземпляр данного класса-оболочки в приложении
'Выполняем привязку к свойству в обработчике событий Load формы
Mus = New MyAppSettings()
Me.DataBindings.Add(New Binding("WindowState", Mus, "FormWindowState"))
Me.DataBindings.Add(New Binding("Location", Mus, "FormLocation"))
Me.DataBindings.Add(New Binding("Size", Mus, "FormSize"))
End Sub
Private Sub Form2_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
'Сохранение настроек формы
Dim f As FormWindowState = Me.WindowState
Dim p As New Point(Me.Location)
Dim z As New Size(Me.Size)
If f <> FormWindowState.Minimized Then
Mus.FormWindowState = f
End If
If f = FormWindowState.Normal Then
Mus.FormLocation = p
Mus.FormSize = z
End If
Mus.Save()
End Sub
End Class