Как сохранить значения включенных флажков при закрытии программы - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д