Работа с файлами INI

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
denver
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 27.06.2003 (Пт) 23:03

Работа с файлами INI

Сообщение denver » 27.06.2003 (Пт) 23:06

Значится так: Подключаю к проекту библиотечку Microsoft Word 8.0/9.0 Object Library, в ней есть обьект SYSTEM и свойство этого обьекта PrivateProfileString. С помощью него можно читать и писать файлы типа myfile.ini

System.PrivateProfileString("d:\ MyFile.INI", "test1", "key1") = "andy" - создаём в INI файле запись типа

[test1]
key1=andy

Но при запуске проекта выскакивает ругательное окошко:"ActiveX component can't create object".

Может кто знает в связи с чем это происходит и как решить эту проблемку ??? Заранее спасибо.

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 28.06.2003 (Сб) 2:10

Может зарегистрировать осх?
Нафиг он, кстати, нужен?
Код: Выделить всё
' В модуль
Private Declare Function GetPrivateProfileInt Lib "kernel32" _
Alias "GetPrivateProfileIntA" _
(ByVal strSection As String, _
  ByVal strKeyName As String, _
  ByVal lngDefault As Long, _
  ByVal strFileName As String) As Long

 

Private Declare Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileStringA" _
  (ByVal strSection As String, _
   ByVal strKeyName As String, _
   ByVal strDefault As String, _
   ByVal strReturned As String, _
   ByVal lngSize As Long, _
   ByVal strFileName As String) As Long

 

Private Declare Function WritePrivateProfileString Lib "kernel32" _
  Alias "WritePrivateProfileStringA" _
  (ByVal strSection As String, _
    ByVal strKeyNam As String, _
    ByVal strValue As String, _
    ByVal strFileName As String) As Long
Public Function GetValueString(strSection As String, _
  strKey As String, strFile As String) As String
Dim strBuffer As String * 256
Dim intSize As Integer
On Error GoTo PROC_ERR

intSize = GetPrivateProfileString(strSection, strKey, "", _
strBuffer, 256, strFile)
GetValueString = Left$(strBuffer, intSize)

PROC_EXIT:
  Exit Function

PROC_ERR:
  MsgBox "Ошибка: <" & Err.Number & "> - " & Err.Description, _
  vbExclamation = vbOKOnly, "GetValueString"
  Resume PROC_EXIT
End Function
Public Function SetValue(strSection As String, strKey As String, _
strValue As String, strFile As String) As Integer
Dim intStatus As Integer
On Error GoTo PROC_ERR

intStatus = WritePrivateProfileString(strSection, strKey, _
strValue, strFile)
SetValue = (intStatus <> 0)

PROC_EXIT:
  Exit Function

PROC_ERR:
  MsgBox "Ошибка: <" & Err.Number & "> - " & Err.Description, _
  vbExclamation = vbOKOnly, "SetValue"
  Resume PROC_EXIT
End Function

' В форму
  чтение
GetValueString("Раздел", "Имя параметра", "Путь до ini")
  запись
SetValue("Раздел", "Имя параметра", "Значение", "Путь до ini")
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

denver
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 27.06.2003 (Пт) 23:03

Сообщение denver » 28.06.2003 (Сб) 9:06

Постоялец, СПАСИБО, всё заработало :))))

Chuvak
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 11.03.2003 (Вт) 8:39
Откуда: Russia, Ozёrsk

Сообщение Chuvak » 30.06.2003 (Пн) 10:03

вопрос к MEMBER:
а если структура INI такая
Код: Выделить всё
[devices]
device1=qwert
device2=asdfg
device3=zxcvb
.....
device15=yuiop
.....



т.е. число ключей не известно.
Как, например, значения ключей загнать в массив?

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 30.06.2003 (Пн) 10:51

Не понял вопроса. Вышеприведённый код позволяет сделать то, о чём вы спрашиваете.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

denver
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 27.06.2003 (Пт) 23:03

Сообщение denver » 30.06.2003 (Пн) 11:29

Chuvak писал(а):вопрос к MEMBER:
а если структура INI такая
Код: Выделить всё
[devices]
device1=qwert
device2=asdfg
device3=zxcvb
.....
device15=yuiop
.....



т.е. число ключей не известно.
Как, например, значения ключей загнать в массив?


Хххмммм, дак если обращаешся к ключам, то знаеш их имена, а этого достаточно чтобы вытянуть из них значения.

Chuvak
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 11.03.2003 (Вт) 8:39
Откуда: Russia, Ozёrsk

Сообщение Chuvak » 30.06.2003 (Пн) 13:18

было написано
Код: Выделить всё
' В форму
    чтение
GetValueString("Раздел", "Имя параметра", "Путь до ini")

а если у меня 15 параметров или 20, или ещё больше... точно неизвестно.
если было бы ровно, скажем 10 параметров, то 10 раз использую функцию и всё нормально, а здесь у меня такая неопределённость.
выше приведённой функцией эту задачу не решить, либо я чего-то не догоняю.

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 01.07.2003 (Вт) 11:15

Есть такая штука - циклы называется. For Next там и прочее... :)
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

Chuvak
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 11.03.2003 (Вт) 8:39
Откуда: Russia, Ozёrsk

Сообщение Chuvak » 01.07.2003 (Вт) 11:57

а как узнать количество ключей(параметров) в разделе для цикла

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 01.07.2003 (Вт) 12:03

Не пойму я вас. ИНИ ваш, а вы у меня спрашиваете, как узнать, сколько записей в ини файле... Да никак. Потому что это не нужно. Если запись будет отсутствовать, то код возвратит "".
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

Chuvak
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 11.03.2003 (Вт) 8:39
Откуда: Russia, Ozёrsk

Сообщение Chuvak » 01.07.2003 (Вт) 12:25

вполне понятный и ясный ответ

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 01.07.2003 (Вт) 13:25

Chuvak писал(а):вполне понятный и ясный ответ

И не верный!

Код: Выделить всё
Private 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


Код: Выделить всё
Public Function LoadProfileSection( _
        ByVal SectionName As String, _
        Optional ByVal IniFileName As String = vbNullString _
) As Variant

    Const max_char          As Long = 32767
    Dim s                   As String
    Dim i                   As Long
    Dim arr()               As String
    Dim v                   As Variant
   
    s = String$(max_char, vbNullChar)
    i = GetPrivateProfileSection(SectionName, ByVal s, Len(s), ByVal IniFileName)
    If (i = 0) Then GoTo ExitRoutine
   
    s = Left$(s, i - 1)
    v = Split(s, vbNullChar)
    If (UBound(v) < 0) Then GoTo ExitRoutine
   
    ReDim Preserve arr(1, UBound(v))
    For i = 0 To UBound(v)
        arr(0, i) = GetNextItemFromValueList(v(i), "=", vbTextCompare)
        arr(1, i) = v(i)
    Next
    LoadProfileSection = arr
ExitRoutine:
    On Error Resume Next
    Erase v, arr
End Function


Функция GetNextItemFromValueList() возвращает подстроку до искомого символа и обрезает исходную. Код очевиден и не приводится.

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 01.07.2003 (Вт) 16:06

skiperski
Это к чему?
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 01.07.2003 (Вт) 16:16

К тому, что Chuvak спрашивал как вычитать значения заранее не зная ни их кол-ва, ни их имён. Ты написал: "Да никак". Chuvak безропотно согласился с этим лаконичным ответом. А задача, тем не менее, решабельная. Пример выше как раз это и демонстрирует.

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 01.07.2003 (Вт) 17:06

А я голову ломал, чего ему надо...
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

Chuvak
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 11.03.2003 (Вт) 8:39
Откуда: Russia, Ozёrsk

Сообщение Chuvak » 03.07.2003 (Чт) 7:58

у меня почему-то массив arr всегда пустой получается

Chuvak
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 11.03.2003 (Вт) 8:39
Откуда: Russia, Ozёrsk

Сообщение Chuvak » 03.07.2003 (Чт) 10:58

всё, теперь работает

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 03.07.2003 (Чт) 12:28

тихо сам с собою я веду беседу...

moderator
Модератор
Модератор
 
Сообщения: 1896
Зарегистрирован: 10.12.2001 (Пн) 18:11
Откуда: Украина, Харьков

Сообщение moderator » 03.07.2003 (Чт) 23:35

skiperski писал(а):тихо сам с собою я веду беседу...


Молодцы! :)
Модератор
http://www.vbstreets.ru / moderator@vbstreets.ru

... Почетные награды: [*], [+], [!]. Все еще впереди...


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: AhrefsBot и гости: 24

    TopList