Проверьте код. Который сохраняет правильно а открывает криво.
***************************************************
Public apl As String
Private Sub Command1_Click()
Dim l As Integer
Dim key As String
Text = InputBox(" ")
If Text = "" Then Exit Sub
key = Text
On Error Resume Next
l = Int(Text)
If l <> Int(key) Then
On Error GoTo er1:
TreeView1.Nodes.Add apl, 4, key, Text
End If
On Error Resume Next
TreeView1.SelectedItem.Expanded = True
TreeView1.SelectedItem.key = apl
Exit Sub
er1: key = key & "k"
Resume 0
End Sub
Private Sub Command2_Click()
Dim masi As String
IniNewSekPrivate "Предмет", App.Path & "\Private.ini"
For i = 2 To TreeView1.Nodes.Count
'создать секции и ключи с значениями
a = TreeView1.Nodes.Item(i).Parent.key
masi = masi & TreeView1.Nodes.Item(i) & "=" & a & "|"
Next
masi = masi
lTemp = IniWriteMassPrivate("Предмет", masi & ";;", App.Path & "\Private.ini")
End Sub
Private Sub Form_Load()
TreeView1.Nodes.Add , 0, "Предмет", "Предмет"
Dim Str1 As String
Str1 = IniMassKeyPrivate("Предмет", App.Path & "\Private.ini")
Dim Nim As Integer
Dim s1 As String
Do
Nim = InStr(Str1, ";")
If Nim > 1 Then
s1 = Mid$(Str1, 1, Nim - 1)
key = s1
t1 = IniStringPrivate("Предмет", s1, App.Path & "\Private.ini")
On Error GoTo er:
TreeView1.Nodes.Add t1, 4, key, s1
Str1 = Mid$(Str1, Nim + 1)
End If
Loop While Nim > 1
Exit Sub
er: key = key & "k"
Resume 0
End Sub
Private Sub TreeView1_Click()
On Error GoTo er:
apl = TreeView1.SelectedItem.key
Exit Sub
er: apl = 0
End Sub
Нужно сделать открытие правильное.
Форма содержит Treeview1, Command1 Command3
Открытие происходит при загрузке формы.
'Читает целый параметр из файла Win.INI
Public Declare Function GetProfileInt Lib "kernel32" Alias "GetProfileIntA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal nDefault As Long) As Long
'Читает секцию из файла Win.INI
Public Declare Function GetProfileSection Lib "kernel32" Alias "GetProfileSectionA" (ByVal lpAppName As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long
'Читает строку из файла Win.INI
Public Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long
'Читает целый параметр из любого файла .INI
Public Declare Function GetPrivateProfileInt Lib "kernel32" Alias "GetPrivateProfileIntA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal nDefault As Long, ByVal lpFileName As String) As Long
'Читает секцию из любого файла .INI
Public Declare Function GetPrivateProfileSection Lib "kernel32" Alias "GetPrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
'Читает строку из любого файла .INI
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 Long, ByVal lpFileName As String) As Long
'Записывает секцию в любой файл .INI
Public Declare Function WritePrivateProfileSection Lib "kernel32" Alias "WritePrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpString As String, ByVal lpFileName As String) As Long
'Записывает строку в любой файл .INI
Public Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As Any, ByVal lpFileName As String) As Long
'Записывает секцию в файл Win.INI
Public Declare Function WriteProfileSection Lib "kernel32" Alias "WriteProfileSectionA" (ByVal lpAppName As String, ByVal lpString As String) As Long
'Записывает строку в файл Win.INI
Public Declare Function WriteProfileString Lib "kernel32" Alias "WriteProfileStringA" (ByVal lpszSection As String, ByVal lpszKeyName As String, ByVal lpszString As String) As Long
'При изменении значений в файле Win.ini рассылает сообщение об изменении всем приложениям
Public Declare Function PostMessageByString Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Public Const WM_WININICHANGE = &H1A
Public Const HWND_BROADCAST = &HFFFF&
'+++++++++++++++++++++++++++++++++++++++++++++++++
'Работа с любыми (приватными) файлами .ini
'=================================================
Public Function IniLongPrivate(SekName As String, KeyName As String, IniFileName As String) As Long
'Читает целый параметр из любого файла .INI
'-------------------------------------------------
'SekName - имя секции (регистр не учитывается)
'KeyName - имя ключа (регистр не учитывается)
'9999 - возвращаемое функцией значение, если ключ не найден
'IniFileName - имя файла .ini (если путь к файлу не указан,файл ищется в папке Windows)
IniLongPrivate = GetPrivateProfileInt(SekName, KeyName, 9999, IniFileName)
End Function
Public Function IniStringPrivate(SekName As String, KeyName As String, IniFileName As String) As String
'Читает строковый параметр из любого файла .INI
'-------------------------------------------------
'SekName - имя секции (регистр не учитывается)
'KeyName - имя ключа (регистр не учитывается)
'"Нет ключа" - возвращаемое функцией значение, если ключ не найден
'IniFileName - имя файла .ini (если путь к файлу не указан,файл ищется в папке Windows)
Dim sTemp As String * 256 'строковый буфер(под значение ключа)
Dim nTemp As Integer 'в неё запишется количество символов в строке ключа
nTemp = GetPrivateProfileString(SekName, KeyName, "Нет ключа", sTemp, 255, IniFileName)
IniStringPrivate = Left$(sTemp, nTemp)
'ограничение - параметр не может быть больше 255 символов
End Function
Public Function IniMassivPrivate(SekName As String, IniFileName As String) As String
'Читает все имена и значения ключей в
' заданной секции, из любого файла .INI
'-------------------------------------------------
'SekName - имя секции (регистр не учитывается)
'IniFileName - имя файла .ini (если путь к файлу не указан,файл ищется в папке Windows)
'+++++++++++++++++++++++++++++++++++++++++++++++++
'Функция заполняется подстроками с ключами и их значениями,
'подстроки разделяются нуль-символами, два нуль-символа
'подряд завершают строку.
Dim sTemp As String * 256 'строковый буфер(для подстрок){в Win95 мах 32767}
Dim nTemp As Integer 'в неё запишется количество символов записаных в буфер
'обрезаем буфер слева на количество считанных символов
'и заменяем {нуль-символы} на {;}(чтобы использовать как простую строку)
IniMassivPrivate = Replace(Left$(sTemp, nTemp), Chr$(0), ";"
End Function
Public Function IniMassSecionPrivate(IniFileName As String) As String
'Читает все имена секций из любого файла .INI
'-------------------------------------------------
'IniFileName - имя файла .ini (если путь к файлу не указан,файл ищется в папке Windows)
'+++++++++++++++++++++++++++++++++++++++++++++++++
'Функция заполняется подстроками с именами секций,
'подстроки разделяются нуль-символами, два нуль-символа
'подряд завершают строку.
Dim sTemp As String * 256 'строковый буфер(для подстрок){в Win95 мах 32767}
Dim nTemp As Integer 'в неё запишется количество символов записаных в буфер
'обрезаем буфер слева на количество считанных символов
'и заменяем {нуль-символы} на {;}(чтобы использовать как простую строку)
IniMassSecionPrivate = Replace(Left$(sTemp, nTemp), Chr$(0), ";"
End Function
Public Function IniMassKeyPrivate(SekName As String, IniFileName As String) As String
'Читает все имена всех ключей из любого файла .INI
'-------------------------------------------------
'IniFileName - имя файла .ini (если путь к файлу не указан,файл ищется в папке Windows)
'SekName - имя секции (регистр не учитывается)
'+++++++++++++++++++++++++++++++++++++++++++++++++
'Функция заполняется подстроками с именами ключей,
'подстроки разделяются нуль-символами, два нуль-символа
'подряд завершают строку.
Dim sTemp As String * 256 'строковый буфер(для подстрок){в Win95 мах 32767}
Dim nTemp As Integer 'в неё запишется количество символов записаных в буфер
'обрезаем буфер слева на количество считанных символов
'и заменяем {нуль-символы} на {;}(чтобы использовать как простую строку)
IniMassKeyPrivate = Replace(Left$(sTemp, nTemp), Chr$(0), ";"
End Function
Public Function IniWriteStrPrivate(SekName As String, KeyName As String, Param As String, IniFileName As String) As Long
'Записывает строковый параметр в любой файл .INI
'-------------------------------------------------
'SekName - имя секции (регистр не учитывается)
'KeyName - имя ключа (регистр не учитывается)
'Param - значение,записываемое в ключ (не пустая строка)
'IniFileName - имя файла .ini (если путь к файлу не указан,файл ищется в папке Windows)
Dim nTemp As Long
'Чтобы не удалить ключ, проверяем не пустой ли Param
If Param <> "" Then
nTemp = WritePrivateProfileString(SekName, KeyName, Param, IniFileName)
IniWriteStrPrivate = 1
Else
IniWriteStrPrivate = 0
End If
End Function
Public Function IniWriteMassPrivate(SekName As String, Mass As String, IniFileName As String) As Long
'Записывает имена и значения ключей в секцию приватного файла .INI
'старые ключи уничтожаются и перезаписываются
'-------------------------------------------------
'SekName - имя секции (регистр не учитывается)
'Mass - строка с ключами и параметрами (не пустая строка)
'IniFileName - имя приватного файла .ini
Dim nTemp As Long
Dim nError As Long
'проверяем на наличие ошибок (пример)
If Mass = "" Then
nError = 1 'ошибка-пустая строка (будут удалены все ключи)
Else
If Right$(Mass, 2) <> ";;" Then
nError = 2 'ошибка-строка не заканчивается двумя (;
End If
End If
If Dir$(IniFileName, vbNormal) = "" Then nError = 3 'ошибка-не найден указанный файл .ini
If SekName = "" Then nError = 4 'ошибка-пустое имя ключа
If nError = 0 Then
Mass = Replace(Mass, "|", Chr$(0))
nTemp = WritePrivateProfileSection(SekName, Mass, IniFileName)
IniWriteMassPrivate = nError
Else
IniWriteMassPrivate = nError
End If
End Function
Public Function IniDelKeyPrivate(SekName As String, KeyName As String, IniFileName As String)
'Удаляет ключ в заданной секции в приватном файле .INI
'-------------------------------------------------
'SekName - имя секции (регистр не учитывается)
'KeyName - имя ключа (регистр не учитывается)
'IniFileName - имя файла .ini (если путь к файлу не указан,файл ищется в папке Windows)
Dim nTemp As Long
nTemp = WritePrivateProfileString(SekName, KeyName, vbNullString, IniFileName)
End Function
Public Function IniDelAllKeyPrivate(SekName As String, IniFileName As String)
'Удаляет все ключи в заданной секции в приватном файле .INI
'заодно удаляет и саму секцию!
'-------------------------------------------------
'SekName - имя секции (регистр не учитывается)
'IniFileName - имя файла .ini (если путь к файлу не указан,файл ищется в папке Windows)
Dim nTemp As Long
nTemp = WritePrivateProfileString(SekName, vbNullString, vbNullString, IniFileName)
End Function
Public Function IniNewSekPrivate(SekName As String, IniFileName As String)
'Создаёт новую секцию (пустую) в приватном файле .INI
'если секция существует - "ничего не происходит"
'-------------------------------------------------
'SekName - имя секции (регистр не учитывается)
'IniFileName - имя файла .ini (если путь к файлу не указан,файл ищется в папке Windows)
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
'| Работа с файлом Win.ini |
'+++++++++++++++++++++++++++++++++++++++++++++++++++++
'| Используйте данные функции при работе с Win.in они|
'| работают быстрее. |
'|+++++++++++++++++++++++++++++++++++++++++++++++++++|
'| будте осторожны при изменении файла Win.in и не |
'| забывайте посылать сообщение WM_WININICHANGE если |
'| вы изменили данные других приложений. |
'////////////////////////////////////////////////////
Public Function WinIniMessage(SekName As String)
'Посылает сообщение об изменении файла Win.ini всем открытым приложениям
'SekName - имя секции (регистр не учитывается)
Dim nTemp As Long
nTemp = PostMessageByString(HWND_BROADCAST, WM_WININICHANGE, 0, SekName)
End Function
Public Function WinIniNewSeksion(SekName As String)
'Создаёт новую (пустую) секцию в Win.in
'если секция существует "ничего не происходит"
'-------------------------------------------------
'SekName - имя секции (регистр не учитывается)
Dim nTemp As Long
Public Function WinIniDelSeksion(SekName As String)
'Удаляет секцию вместе с ключами.
'-------------------------------------------------
'SekName - имя секции (регистр не учитывается)
Dim nTemp As Long
Public Function WinIniDelKey(SekName As String, KeyName As String)
'Удаляет ключ из заданной секции.
'-------------------------------------------------
'SekName - имя секции (регистр не учитывается)
'KeyName - имя ключа (регистр не учитывается)
Dim nTemp As Long
Public Function WinIniWriteKeyString(SekName As String, KeyName As String, Param As String)
'Записывает (перезаписывает или создаёт) новое значение ключя в заданной секции.
'-------------------------------------------------
'SekName - имя секции (регистр не учитывается)
'KeyName - имя ключа (регистр не учитывается)
'Param - новое значение ключа
Dim nTemp As Long
Public Function WinIniWriteMassString(SekName As String, Mass As String)
'Записывает имена и значения ключей в секцию Win.ini
'старые ключи уничтожаются и перезаписываются
'если секции не существует она создаётся в конце файла
'-------------------------------------------------
'SekName - имя секции (регистр не учитывается)
'Mass - строка с ключами и параметрами (не пустая строка)
Dim nTemp As Long
Dim nError As Long
'проверяем на наличие ошибок (пример)
If Mass = "" Then
nError = 1 'ошибка-пустая строка (будут удалены все ключи)
Else
If Right$(Mass, 2) <> ";;" Then
nError = 2 'ошибка-строка не заканчивается двумя (;
End If
End If
If SekName = "" Then nError = 4 'ошибка-пустое имя секции
If nError = 0 Then
Mass = Replace(Mass, ";", Chr$(0))
nTemp = WriteProfileSection(SekName, Mass)
End If
End Function
Public Function WinIniLong(SekName As String, KeyName As String) As Long
'Читает целый параметр из любого файла .INI
'-------------------------------------------------
'SekName - имя секции (регистр не учитывается)
'KeyName - имя ключа (регистр не учитывается)
'9999 - возвращаемое функцией значение, если ключ не найден
WinIniLong = GetProfileInt(SekName, KeyName, 9999)
End Function
Public Function WinIniString(SekName As String, KeyName As String) As String
'Читает строковый параметр из Win.ini
'-------------------------------------------------
'SekName - имя секции (регистр не учитывается)
'KeyName - имя ключа (регистр не учитывается)
'"Нет ключа" - возвращаемое функцией значение, если ключ не найден
Dim sTemp As String * 256 'строковый буфер(под значение ключа)
Dim nTemp As Integer 'в неё запишется количество символов в строке ключа
nTemp = GetProfileString(SekName, KeyName, "Нет ключа", sTemp, 255)
WinIniString = Left$(sTemp, nTemp)
'ограничение - параметр не может быть больше 255 символов
End Function
Public Function WinIniMassiv(SekName As String) As String
'Читает все имена и значения ключей в
' заданной секции, из файла Win.ini
'-------------------------------------------------
'SekName - имя секции (регистр не учитывается)
'+++++++++++++++++++++++++++++++++++++++++++++++++
'Функция заполняется подстроками с ключами и их значениями,
'подстроки разделяются нуль-символами, два нуль-символа
'подряд завершают строку.
Dim sTemp As String * 256 'строковый буфер(для подстрок){в Win95 мах 32767}
Dim nTemp As Integer 'в неё запишется количество символов записаных в буфер
nTemp = GetProfileSection(SekName, sTemp, 255)
'обрезаем буфер слева на количество считанных символов
'и заменяем {нуль-символы} на {;}(чтобы использовать как простую строку)
WinIniMassiv = Replace(Left$(sTemp, nTemp), Chr$(0), ";"
End Function
Public Function WinIniMassSecion() As String
'Читает все имена секций из файла Win.ini
'+++++++++++++++++++++++++++++++++++++++++++++++++
'Функция заполняется подстроками с именами секций,
'подстроки разделяются нуль-символами, два нуль-символа
'подряд завершают строку.
Dim sTemp As String * 512 'строковый буфер(для подстрок){в Win95 мах 32767}
Dim nTemp As Integer 'в неё запишется количество символов записаных в буфер
'обрезаем буфер слева на количество считанных символов
'и заменяем {нуль-символы} на {;}(чтобы использовать как простую строку)
WinIniMassSecion = Replace(Left$(sTemp, nTemp), Chr$(0), ";"
End Function
Public Function WinIniMassKey(SekName As String) As String
'Читает все имена ключей в заданной секции в файле Win.ini
'+++++++++++++++++++++++++++++++++++++++++++++++++
'SekName - имя секции (регистр не учитывается)
'Функция заполняется подстроками с именами секций,
'подстроки разделяются нуль-символами, два нуль-символа
'подряд завершают строку.
Dim sTemp As String * 512 'строковый буфер(для подстрок){в Win95 мах 32767}
Dim nTemp As Integer 'в неё запишется количество символов записаных в буфер
'обрезаем буфер слева на количество считанных символов
'и заменяем {нуль-символы} на {;}(чтобы использовать как простую строку)
WinIniMassKey = Replace(Left$(sTemp, nTemp), Chr$(0), ";"
End Function
Private Sub Form_Load()
Dim Str0 As String
Dim Str1 As String
Dim Nim As Integer
Dim Sim As Integer 'имя секции
Dim s1 As String, s0 As String
Dim key As String
Dim t1 As String
Dim iniFN As String
iniFN = App.Path & "\Private.ini"
Str0 = IniMassSecionPrivate(iniFN)
Do 'по секциям
Sim = InStr(Str0, ";"
If Sim > 1 Then
s0 = Mid$(Str0, 1, Sim - 1)
TreeView1.Nodes.Add , 0, s0, s0
Str1 = IniMassKeyPrivate(s0, iniFN)
Do 'по ключам
Nim = InStr(Str1, ";"
If Nim > 1 Then
s1 = Mid$(Str1, 1, Nim - 1)
key = s1
t1 = IniStringPrivate(s0, s1, iniFN)
TreeView1.Nodes.Add s0, 4, key, s1
Str1 = Mid$(Str1, Nim + 1)
End If
Loop While Nim > 1 'по ключам
Str0 = Mid$(Str0, Sim + 1)
End If
Loop While Sim > 1 'по секциям
End Sub