Чтение (сохранение) настроек форм

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Чтение (сохранение) настроек форм

Сообщение sergey-911 » 25.12.2008 (Чт) 15:05

Доброго времени суток уважаемые. :D
В архиве пример чтения (сохранения) настроек 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
Вложения
Сохранение Настроек Формы.rar
Пример чтения (сохранения) настроек 2-х форм
(72.96 Кб) Скачиваний: 355
С уважением, Сергей.

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Чтение (сохранение) настроек форм

Сообщение Williams » 25.12.2008 (Чт) 17:14

INI это старо как мир, используй реестр для храния настроек.
К тому же, в VS есть встроенные средства.. Посмотри свойства проекта, "Settings"
И вы думаете, что вас оставят в живых после прочтения этого поста?

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Чтение (сохранение) настроек форм

Сообщение sergey-911 » 26.12.2008 (Пт) 9:29

Спасибо Williams.

1)
Williams писал(а):INI это старо как мир, используй реестр для храния настроек.


Почему ini старо, как Мир? Чем хуже реестра? В моем случае (клиент-серверное приложение) удобней. INI файл проще передать пользователям, вместе с настройками. В доменной структуре, с ограничением прав у пользователей - это удобней, на мой взгляд. Скорость чтения - такая же, как из реестра. Реестр, опять же, не надо загрязнять...
Хотя, могу ошибаться. Поправьте, если не так.

2)
Williams писал(а):К тому же, в VS есть встроенные средства.. Посмотри свойства проекта, "Settings"


Поясни плиз. Примерно так, как писАл Nord777? :oops:
Nord777 писал(а):Как вариант зайди в свойства проекта на вкладу "Settings".


В поле "Name" задай имя переменной (к примеру "LastAccess").

Доступ из кода

[syntax="vb"] MsgBox(My.Settings.LastAccess)

My.Settings.LastAccess = Now.ToString

My.Settings.Save()[/syntax]


3)
Пытался в конструкторе сохранить настройки формы (свойство ApplicationSettings) - позиция формы сохраняется, а размер - нет. Также не сохраняется свойство формы WindowState. Поэтому решил сохранить настройки формы: 1 - в ini - файл, 2 - файл ресурса программно.
С уважением, Сергей.

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Re: Чтение (сохранение) настроек форм

Сообщение Ramzes » 26.12.2008 (Пт) 15:41

sergey-911 писал(а):3)
Пытался в конструкторе сохранить настройки формы (свойство ApplicationSettings) - позиция формы сохраняется, а размер - нет. Также не сохраняется свойство формы WindowState. Поэтому решил сохранить настройки формы: 1 - в ini - файл, 2 - файл ресурса программно.

Так ты код покажи. Может мы чем поможем :)
Реестр тоже, кстати, мне не нравиться так же как ини, xml самое оно

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Чтение (сохранение) настроек форм

Сообщение sergey-911 » 27.12.2008 (Сб) 22:31

Спасибо Ramzes.
Код с примером в первом сообщении.
С уважением, Сергей.

Shurrik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 20.05.2004 (Чт) 5:35
Откуда: Керчь, Крым

Re: Чтение (сохранение) настроек форм

Сообщение Shurrik » 28.12.2008 (Вс) 7:19

Вообще не вижу принципиальной разницы между реестром и INI. Или копируешь файл или запускаешь выгруженный REG.
Колесо: Хочешь жить? Умей вертеться.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Чтение (сохранение) настроек форм

Сообщение iGrok » 28.12.2008 (Вс) 15:30

Shurrik писал(а):Вообще не вижу принципиальной разницы между реестром и INI. Или копируешь файл или запускаешь выгруженный REG.

Разница в том, что для переноса настроенной софтины с одного компа на другой требуется сначала этот REG выгрузить. Как ты планируешь сообщать об этом пользователю?

UPD:
Ой. А чё это со мной было, когда я этот пост писал? Никакой логической связи с процитированным куском не было.. )
Поправил. )
Последний раз редактировалось iGrok 28.12.2008 (Вс) 20:12, всего редактировалось 2 раз(а).
label:
cli
jmp label

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Чтение (сохранение) настроек форм

Сообщение Joo » 28.12.2008 (Вс) 17:47

Сохраняй в XML и не парься
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Чтение (сохранение) настроек форм

Сообщение Sebas » 29.12.2008 (Пн) 10:12

Scarabey писал(а):Сохраняй в XML и не парься


Я бы не стал, так однозначно заявлять.)
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Чтение (сохранение) настроек форм

Сообщение Joo » 29.12.2008 (Пн) 12:36

Sebas писал(а):
Scarabey писал(а):Сохраняй в XML и не парься


Я бы не стал, так однозначно заявлять.)

Почему бы и нет? По сравнению с ini даже хвостом шивелить не надо ), а реестр тут по моему не вариант, т.к. придеться делать лишние движения при передаче файла настроек.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Чтение (сохранение) настроек форм

Сообщение sergey-911 » 29.12.2008 (Пн) 12:57

Уважаемые.
Речь идет не о том, в какой формат файла сохранять настройки формы (ini, xml или реестр).
У меня вопрос про то, почему настройки формы нормально не читаются из файла ресурсов?
Если в конструкторе указываешь сохранять настройки (WindowState, Location, Size) формы, то сохраняется только свойства Location.
Если создаешь файл ресурсов программно, то форма мерцает при закрытии (см. пример).
Как правильно сохранить свойства формы в файл ресурсов?
С уважением, Сергей.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Чтение (сохранение) настроек форм

Сообщение Nord777 » 30.12.2008 (Вт) 0:09

Код: Выделить всё
Public Class Form1
    Dim LastLoc As Point
    Dim LastSize As Size

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Size = My.Settings.UserFormSize
        Me.Location = My.Settings.UserFormLoc
        Me.WindowState = My.Settings.UserFormState

    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        My.Settings.UserFormState = Me.WindowState
        If Me.WindowState <> FormWindowState.Normal Then
            My.Settings.UserFormSize = LastSize
            My.Settings.UserFormLoc = LastLoc
        Else
            My.Settings.UserFormSize = Me.Size
            My.Settings.UserFormLoc = Me.Location
        End If
    End Sub

    Private Sub Form1_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChanged
        If Me.WindowState <> FormWindowState.Normal Then Exit Sub
        LastLoc = Me.Location
        LastSize = Me.Size
    End Sub

End Class
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Чтение (сохранение) настроек форм

Сообщение Joo » 31.12.2008 (Ср) 5:33

Nord777 писал(а):
Код: Выделить всё
Public Class Form1
    Dim LastLoc As Point
    Dim LastSize As Size

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Size = My.Settings.UserFormSize
        Me.Location = My.Settings.UserFormLoc
        Me.WindowState = My.Settings.UserFormState

    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        My.Settings.UserFormState = Me.WindowState
        If Me.WindowState <> FormWindowState.Normal Then
            My.Settings.UserFormSize = LastSize
            My.Settings.UserFormLoc = LastLoc
        Else
            My.Settings.UserFormSize = Me.Size
            My.Settings.UserFormLoc = Me.Location
        End If
    End Sub

    Private Sub Form1_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChanged
        If Me.WindowState <> FormWindowState.Normal Then Exit Sub
        LastLoc = Me.Location
        LastSize = Me.Size
    End Sub

End Class


С вашего позволения немного поправлю:
Код: Выделить всё
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Size = My.Settings.UserFormSize
        Me.Location = My.Settings.UserFormLoc
        Me.WindowState = My.Settings.UserFormState
    End Sub

    Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        My.Settings.UserFormState = Me.WindowState
    End Sub

    Private Sub Form1_ResizeEnd(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.ResizeEnd
            My.Settings.UserFormSize = Me.Size
            My.Settings.UserFormLoc = Me.Location
    End Sub
End Class
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Чтение (сохранение) настроек форм

Сообщение sergey-911 » 31.12.2008 (Ср) 11:57

С наступающим Новым Годом 2009 Вас, уважаемые форумчане! Здоровья, счастья Вам в Новом Году!
Спасибо Nord777, настройки файла ресурсов, заданные в конструкторе заработали. Сам бы не дадумался. Хочу спросить, в каком случае считывание (запись) происходит быстрее, из файла ресурсов, или из ini-файла? На мой взгляд, проект, который считывает настройки с ini-файла работает быстрее... Почему? Если нужно, выложу оба исходника, может кто протестирует, может кому пригодится...
Scarabey, на мой взгляд, код Nord777, более универсальный. В твоем могут быть проблемы, при закрытии формы на крестик, которая развернута на все окно. При дальнейшем раскрытии и нормализации, окно будет таким же, во весь экран... Хотя, данный код пока не проверил, могу ошибаться.

P.S. Всем спасибо, до встречи в Новом 2009 году!
С уважением, Сергей.

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Чтение (сохранение) настроек форм

Сообщение Joo » 31.12.2008 (Ср) 13:56

sergey-911
Дело твое что юзать. Мой способ работает в нашей программке Bred.Net, причем безглючно, только сохраняю я в XML.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Чтение (сохранение) настроек форм

Сообщение sergey-911 » 03.01.2009 (Сб) 23:23

Scarabey писал(а):sergey-911
Дело твое что юзать. Мой способ работает в нашей программке Bred.Net, причем безглючно, только сохраняю я в XML.


Поюзал Вашу программку. Scarabey, если открыть, переместить и закрыть форму редактора - то все сохраняется (относительно нормально). А если открыть (положение 1), переместить (положение 2), затем максимизировать (положение 3) окно и закрыть, то... При следующем открытии, форма открывается масимизированной (как ей и подобает) - (положение 3), а вот при следующей нормализации, форма принимает положение 1, вместо положения 2. Для этого и требуется дополнительный код Nord777-а.
Есть еще минус программы, требуется запуск с правами администратора, иначе - ошибка (правда в висте)
Изображение
А так, программа серьезная, редактор с поиском, кодировками и печатью заслуживает внимания. Респект.
Вложения
BraadNet.jpg
BraadNet.jpg (21.39 Кб) Просмотров: 2765
С уважением, Сергей.

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Чтение (сохранение) настроек форм

Сообщение Joo » 04.01.2009 (Вс) 5:38

sergey-911 писал(а):
Scarabey писал(а):sergey-911
Дело твое что юзать. Мой способ работает в нашей программке Bred.Net, причем безглючно, только сохраняю я в XML.


Поюзал Вашу программку. Scarabey, если открыть, переместить и закрыть форму редактора - то все сохраняется (относительно нормально). А если открыть (положение 1), переместить (положение 2), затем максимизировать (положение 3) окно и закрыть, то... При следующем открытии, форма открывается масимизированной (как ей и подобает) - (положение 3), а вот при следующей нормализации, форма принимает положение 1, вместо положения 2. Для этого и требуется дополнительный код Nord777-а.
Есть еще минус программы, требуется запуск с правами администратора, иначе - ошибка (правда в висте)
Изображение
А так, программа серьезная, редактор с поиском, кодировками и печатью заслуживает внимания. Респект.


Да, с вистой не до конца все решили, все будет нормально со следующей версией.
По поводу перемещения и запоминания, сейчас специально все проделал так как ты сказал, у меня принимает положение 2!!!!
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Re: Чтение (сохранение) настроек форм

Сообщение Zenitchik » 31.01.2009 (Сб) 20:52

Пардон за некрофилию, но я вообще дошел до LISP-подобного формата: скобки и запятые.
И парсить легко, и объектной своей модели для представления не тербует - ибо массив массивов.
Знание английского языка - затрудняет понимание кода


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26

    TopList  
cron