Как сохранить значения включенных флажков при закрытии программы - VB

Узнай цену своей работы

Формулировка задачи:

у меня есть инжектор dll файлов мне надо сделать так что бы все что я там написал или поставил галочку после перезапуска остались все то что я изменил в предыдущем звпуске как это сделать только продробно напишите и понятно!!!!!!!!!

Решение задачи: «Как сохранить значения включенных флажков при закрытии программы»

textual
Листинг программы
'*************************************************************************
'*                    Класс для работы с INI-файлами                     *
'*-----------------------------------------------------------------------*
'*       Описание:                                                       *
'*  AddSection     - добавляет новую секцию                              *
'*  AddValue       - добавляет новый параметр в секцию                   *
'*  Filename       - имя файла. Если файл существует, он загружается.    *
'*  RemoveSection  - удаляет секцию                                      *
'*  RemoveValue    - удаляет параметр из секции                          *
'*  SectionExists  - возвращает True, если секция существует             *
'*  SectionName    - возвращает имя секции по ее номеру                  *
'*  SectionsCount  - возвращает количество секций                        *
'*  UpdateFile     - сохраняет файл                                      *
'*  Value          - возвращает/устанавливает значение параметра         *
'*  ValueExists    - возвращает True, если параметр существует           *
'*  ValueName      - возвращает имя параметра по его номеру              *
'*  ValuesCount    - возвращает количество параметров в заданной секции  *
'*-----------------------------------------------------------------------*
'*                          17 июня 2000  10:43                          *
'*         Copyright © 2000 Козырев Дмитрий <Dmitriy@e-mail.ru>          *
'*************************************************************************
Option Explicit
 
' Все функции возвращают True, если нет ошибки
 
Private mFilename As String
 
Private AllSections() As tSection
 
Private Type tValue
    Name As String
    cntValue As String
End Type
Private Type tSection
    Name As String
    Values() As tValue
End Type
Public Function RemoveSection(ByVal Section As String) As Boolean
Dim i&, uSN$, a&
uSN = UCase$(Section)
' Просмотр всех секций
For i = 1 To UBound(AllSections)
    If UCase$(AllSections(i).Name) = uSN Then
        ' Нужная секция есть, сдвигаем параметры "вниз"
        For a = i To UBound(AllSections) - 1
            AllSections(a) = AllSections(a + 1)
        Next a
        ' Удаляем
        ReDim Preserve AllSections(UBound(AllSections) - 1)
        RemoveSection = True
        Exit Function
    End If
Next i
End Function
Public Property Get SectionExists(ByVal Section As String) As Boolean
Dim i&, uSN$
uSN = UCase$(Section)
' Просто пробежимся по вссем секциям и посмотрим, есть ли заданная
For i = 1 To UBound(AllSections)
    If UCase$(AllSections(i).Name) = uSN Then
        ' Есть!
        SectionExists = True
        Exit Property
    End If
Next i
End Property
Public Function UpdateFile() As Boolean
' Имя файла не задано - куда сохранять-то? :)
If Len(mFilename) = 0 Then Exit Function
Dim i&, a&
Open mFilename For Output Access Write Lock Write As #1
For i = 1 To UBound(AllSections)
    ' Запись всех секций
    With AllSections(i)
        Print #1, "[" & .Name & "]"
        ' Запись всех параметров в секции
        For a = 1 To UBound(.Values)
            Print #1, .Values(a).Name & "=" & .Values(a).cntValue
        Next a
    End With
    Print #1, vbNullString
Next i
Close #1
UpdateFile = True
End Function
Public Property Get ValueExists(ByVal Section As String, ByVal ValueName As String) As Boolean
Dim i&, uSN$, uVN$, a&
uSN = UCase$(Section)
uVN = UCase$(ValueName)
' Просмотр всех секций
For i = 1 To UBound(AllSections)
    If UCase$(AllSections(i).Name) = uSN Then
        ' Нужная секция, теперь ищем в ней параметр
        For a = 1 To UBound(AllSections(i).Values)
            If AllSections(i).Values(a).Name = uVN Then
                ' Искомый параметр
                ValueExists = True
                Exit Property
            End If
        Next a
        Exit Property
    End If
Next i
End Property
Public Property Get ValueName(ByVal Section As String, ByVal Index As Long) As String
' Примечание: если параметр или секция найдены не будут, то свойство
' вернет vbNullChar - символ с нулевым кодом
Dim uSN$, i&
uSN = UCase$(Section)
' Просмотр всех секций
For i = 1 To UBound(AllSections)
    If UCase$(AllSections(i).Name) = uSN Then
        'Нужная секция
        If Index > 0 And Index <= UBound(AllSections(i).Values) Then
            ' Нужный параметр
            ValueName = AllSections(i).Values(Index).Name
            Exit Property
        Else
            ' Индекс вне границ диапазона...
            ValueName = vbNullChar
        End If
        Exit Property
    End If
Next
ValueName = vbNullChar
End Property
Public Function RemoveValue(ByVal Section As String, ByVal ValueName As String) As Boolean
Dim i&, a&, uVN$, uSN$, c&
uSN = UCase$(Section)
uVN = UCase$(ValueName)
' Просмор всех секций
For i = 1 To UBound(AllSections)
    If UCase$(AllSections(i).Name) = uSN Then
        ' Нужная секция есть
        For a = 1 To UBound(AllSections(i).Values)
            If UCase$(AllSections(i).Values(a).Name) = uVN Then
                ' Нужный параметр есть
                With AllSections(i)
                    ' Сдвиг параметров "вниз" на один
                    For c = a To UBound(.Values) - 1
                        .Values(a) = .Values(a + 1)
                    Next c
                    ' Удаление параметра
                    ReDim Preserve .Values(UBound(.Values) - 1)
                    RemoveValue = True
                    Exit Function
                End With
            End If
        Next
        Exit Function
    End If
Next i
End Function
Public Function AddValue(ByVal Section As String, ByVal ValueName As String, Optional ByVal lValue As String = vbNullString) As Boolean
Dim uSN$, i&, uVN$, a&
uSN = UCase$(Section)
uVN = UCase$(ValueName)
' Просмотрим-ка все секции...
For i = 1 To UBound(AllSections)
    If UCase$(AllSections(i).Name) = uSN Then
add_value:
        ' Есть нужная секция!
        For a = 1 To UBound(AllSections(i).Values)
            If UCase$(AllSections(i).Values(a).Name) = uVN Then
                ' Такая строка уже есть
                Exit Function
            End If
        Next a
        ' Добавляем новый параметр
        With AllSections(i)
            ReDim Preserve .Values(UBound(.Values) + 1)
            .Values(UBound(.Values)).Name = ValueName
            .Values(UBound(.Values)).cntValue = lValue
        End With
        AddValue = True
        Exit Function
    End If
Next i
' Секции такой нет, добавляем...
AddSection Section
GoTo add_value
End Function
Public Property Get ValuesCount(ByVal Section As String) As Long
' Примечание: если секция не найдена, свойство вернет
' значение -1.
Dim uSN$, i&
uSN = UCase$(Section)
' Просмотр всех секций
For i = 1 To UBound(AllSections)
    If UCase$(AllSections(i).Name) = uSN Then
        ' Нужная секция
        ValuesCount = UBound(AllSections(i).Values)
        Exit Property
    End If
Next
ValuesCount = -1
End Property
Public Property Let Value(ByVal Section As String, ByVal ValueName As String, ByVal vData As String)
Dim i&, a&, uVN$, uSN$
uSN = UCase$(Section)
uVN = UCase$(ValueName)
' Просмотр всех секций
For i = 1 To UBound(AllSections)
    If UCase$(AllSections(i).Name) = uSN Then
        ' Просмотр параметров в секции
        For a = 1 To UBound(AllSections(i).Values)
            If UCase$(AllSections(i).Values(a).Name) = uVN Then
                ' Нашли параметр, обновляем его значение...
                AllSections(i).Values(a).cntValue = vData
                Exit Property
            End If
        Next
        ' Не нашли параметр, добавляем новый...
        With AllSections(i)
            ReDim Preserve .Values(UBound(.Values) + 1)
            .Values(UBound(.Values)).cntValue = vData
            .Values(UBound(.Values)).Name = ValueName
        End With
        Exit Property
    End If
Next i
' Не нашли соотвествующую секцию, добавляем новую...
ReDim Preserve AllSections(UBound(AllSections) + 1)
With AllSections(UBound(AllSections))
    .Name = Section
    ReDim .Values(1)
    .Values(1).Name = ValueName
    .Values(1).cntValue = vData
End With
End Property
Public Property Get Value(ByVal Section As String, ByVal ValueName As String) As String
' Примечание: если параметр найден не будет, то свойство
' вернет vbNullChar - символ с нулевым кодом
Dim i&, a&, uVN$, uSN$
uSN = UCase$(Section)
uVN = UCase$(ValueName)
' Просмотр всех секций
For i = 1 To UBound(AllSections)
    If UCase$(AllSections(i).Name) = uSN Then
        ' Просмотр всех параметров в секции
        For a = 1 To UBound(AllSections(i).Values)
            If UCase$(AllSections(i).Values(a).Name) = uVN Then
                ' Нашли нужный параметр
                Value = AllSections(i).Values(a).cntValue
                Exit Property
            End If
        Next
        Value = vbNullChar
        Exit Property
    End If
Next i
Value = vbNullChar
End Property
Public Property Get SectionName(ByVal Index As Long) As String
' Здесь все просто: проверка - попадает ли индекс в границы
' массива и возврат имени секции.
' Примечание: если секция найдена не будет, то свойство
' вернет vbNullChar - символ с нулевым кодом
If Index > 0 And Index <= UBound(AllSections) Then
    SectionName = AllSections(Index).Name
Else
    SectionName = vbNullChar
End If
End Property
Public Function AddSection(ByVal Section As String) As Boolean
Dim uSN$, i&
uSN = UCase$(Section)
For i = 1 To UBound(AllSections)
    If UCase$(AllSections(i).Name) = uSN Then
        ' Уже такая секция есть...
        Exit Function
    End If
Next i
' Добавляем элемент к массиву секций
ReDim Preserve AllSections(UBound(AllSections) + 1)
With AllSections(UBound(AllSections))
    .Name = Section
    ReDim .Values(0)
End With
AddSection = True
End Function
Public Property Get SectionsCount() As Long
SectionsCount = UBound(AllSections)
End Property
Public Property Let FileName(ByVal vData As String)
Dim s&, v&, l$, t&
mFilename = vData
ReDim AllSections(0)
' Файл в наличии?
If Len(Dir(mFilename)) = 0 Then
    ' Если нет, то...
    Exit Property
End If
' Считываем файл
Open mFilename For Input Access Read Lock Write As #1
Do While Not EOF(1)
    Line Input #1, l
    ' Комментарии есть?
    t = InStr(1, l, ";")
    l = LTrim$(RTrim$(l))
    ' Откомментирована вся строка
    If t = 1 Or Len(l) = 0 Then GoTo skip_line
    ' Комментарии в конце строки
    If t > 1 Then l = Left$(l, t - 1)
    If Left$(l, 1) = "[" Then
        ' Нашли секцию
        t = InStr(1, l, "]")
        If t < 3 Then GoTo skip_line
        l = Mid$(l, 2, t - 2)
        ' Секций стало на одну больше
        s = s + 1
        ' Строк в новой секции пока нет
        v = 0
        ReDim Preserve AllSections(s)
        AllSections(s).Name = l
        ReDim AllSections(s).Values(0)
    Else
        ' Нашли параметр в секцию
        ' Если ранеее не было найдено ни одной секции - пропускаем
        If s = 0 Then GoTo skip_line
        ' Разделяем строку на название параметра и на его значение
        t = InStr(1, l, "=")
        If t < 2 Then GoTo skip_line
        v = v + 1
        ' Добавляем параметр
        With AllSections(s)
            ReDim Preserve .Values(v)
            .Values(v).Name = Left$(l, t - 1)
            If t < Len(l) Then .Values(v).cntValue = Mid$(l, t + 1, Len(l) - t)
        End With
    End If
skip_line:
Loop
Close #1
End Property
Public Property Get FileName() As String
FileName = mFilename
End Property
Private Sub Class_Initialize()
ReDim AllSections(0)
End Sub
Private Sub Class_Terminate()
ReDim AllSections(0)
End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.889 из 5
Похожие ответы