-
Notifications
You must be signed in to change notification settings - Fork 0
/
ModINI.bas
216 lines (186 loc) · 7.61 KB
/
ModINI.bas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
Attribute VB_Name = "ModINI"
'
'--- Declaraciones para leer ficheros INI ---
'
' Leer todas las secciones de un fichero INI, esto seguramente no funciona en Win95
' *** Esta función no estaba en las declaraciones del API que se incluye con el VB ***
Private Declare Function GetPrivateProfileSectionNames Lib "kernel32" Alias "GetPrivateProfileSectionNamesA" _
(ByVal lpszReturnBuffer As String, ByVal nSize As Long, _
ByVal lpFileName As String) As Long
' Leer una sección completa
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
' Leer una clave de un fichero INI
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, ByVal lpKeyName As Any, _
ByVal lpDefault As String, ByVal lpReturnedString As String, _
ByVal nSize As Long, ByVal lpFileName As String) As Long
' Escribir una clave de un fichero INI (también para borrar claves y secciones)
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationName As String, ByVal lpKeyName As Any, _
ByVal lpString As Any, ByVal lpFileName As String) As Long
'
Public Function IniGet(ByVal lpFileName As String, ByVal lpAppName As String, _
ByVal lpKeyName As String, _
Optional ByVal lpDefault As String = "") As String
'
'Los parámetros son:
'lpFileName: La Aplicación (fichero INI)
'lpAppName: La sección que suele estar entrre corchetes
'lpKeyName: Clave
'lpDefault: Valor opcional que devolverá si no se encuentra la clave.
'
Dim LTmp As Long
Dim sRetVal As String
sRetVal = String$(255, 0)
LTmp = GetPrivateProfileString(lpAppName, lpKeyName, lpDefault, sRetVal, Len(sRetVal), lpFileName)
If LTmp = 0 Then
IniGet = lpDefault
Else
IniGet = Left(sRetVal, LTmp)
End If
End Function
Public Sub IniWrite(ByVal lpFileName As String, ByVal lpAppName As String, _
ByVal lpKeyName As String, ByVal lpString As String)
'
'Guarda los datos de configuración
'Los parámetros son los mismos que en IniGet
'Siendo lpString el valor a guardar
'
Call WritePrivateProfileString(lpAppName, lpKeyName, lpString, lpFileName)
End Sub
Public Sub IniDelete(ByVal sIniFile As String, ByVal sSection As String, _
Optional ByVal sKey As String = "")
'
' Borrar una clave o entrada de un fichero INI (16/Feb/99)
' Si no se indica sKey, se borrará la sección indicada en sSection
' En otro caso, se supone que es la entrada (clave) lo que se quiere borrar
'
If Len(sKey) = 0 Then
' Borrar una sección
Call WritePrivateProfileString(sSection, 0&, 0&, sIniFile)
Else
' Borrar una entrada
Call WritePrivateProfileString(sSection, sKey, 0&, sIniFile)
End If
End Sub
Public Function IniGetSection(ByVal lpFileName As String, _
ByVal lpAppName As String) As Variant
'
' Lee una sección entera de un fichero INI (27/Feb/99)
'
' Usando Collection en lugar de cParrafos y cContenido (06/Mar/99)
'
' Esta función devolverá una colección con cada una de las claves y valores
' que haya en esa sección.
' Parámetros de entrada:
' lpFileName Nombre del fichero INI
' lpAppName Nombre de la sección a leer
' Devuelve:
' Una colección con el Valor y el contenido
' Para leer los datos:
' For i = 1 To tContenidos Step 2
' sClave = tContenidos(i)
' sValor = tContenidos(i+1)
' Next
'
Dim tContenidos As Collection
Dim nSize As Long
Dim i As Long
Dim j As Long
Dim sTmp As String
Dim sClave As String
Dim sValor As String
' El tamaño máximo para Windows 95
sBuffer = String$(32767, Chr$(0))
nSize = GetPrivateProfileSection(lpAppName, sBuffer, Len(sBuffer), lpFileName)
If nSize Then
Set tContenidos = New Collection
' Cortar la cadena al número de caracteres devueltos
sBuffer = Left$(sBuffer, nSize)
' Quitar los vbNullChar extras del final
i = InStr(sBuffer, vbNullChar & vbNullChar)
If i Then
sBuffer = Left$(sBuffer, i - 1)
End If
' Cada una de las entradas estará separada por un Chr$(0)
Do
i = InStr(sBuffer, Chr$(0))
If i Then
sTmp = LTrim$(Left$(sBuffer, i - 1))
If Len(sTmp) Then
' Comprobar si tiene el signo igual
j = InStr(sTmp, "=")
If j Then
sClave = Left$(sTmp, j - 1)
sValor = LTrim$(Mid$(sTmp, j + 1))
' Asignar la clave y el valor
tContenidos.Add sClave
tContenidos.Add sValor
End If
End If
sBuffer = Mid$(sBuffer, i + 1)
End If
Loop While i
' Por si aún queda algo...
If Len(sBuffer) Then
j = InStr(sBuffer, "=")
If j Then
sClave = Left$(sBuffer, j - 1)
sValor = LTrim$(Mid$(sBuffer, j + 1))
tContenidos.Add sClave
tContenidos.Add sValor
End If
End If
End If
Set IniGetSection = tContenidos
End Function
Public Function IniGetSections(ByVal lpFileName As String) As Variant
'
' Devuelve todas las secciones de un fichero INI (27/Feb/99)
'
' Usando Collection en lugar de cParrafos y cContenido
'
' Esta función devolverá una colección con todas las secciones del fichero
' Parámetros de entrada:
' lpFileName Nombre del fichero INI
' Devuelve:
' Una colección con los nombres de las secciones
'
Dim tContenidos As Collection
Dim nSize As Long
Dim i As Long
Dim sTmp As String
' El tamaño máximo para Windows 95
sBuffer = String$(32767, Chr$(0))
' Esta función del API no está definida en el fichero TXT
nSize = GetPrivateProfileSectionNames(sBuffer, Len(sBuffer), lpFileName)
If nSize Then
' Crear una colección del tipo cParrafos que es una colección
' con elementos del tipo cContenido
Set tContenidos = New Collection
' Cortar la cadena al número de caracteres devueltos
sBuffer = Left$(sBuffer, nSize)
' Quitar los vbNullChar extras del final
i = InStr(sBuffer, vbNullChar & vbNullChar)
If i Then
sBuffer = Left$(sBuffer, i - 1)
End If
' Cada una de las entradas estará separada por un Chr$(0)
Do
i = InStr(sBuffer, Chr$(0))
If i Then
sTmp = LTrim$(Left$(sBuffer, i - 1))
If Len(sTmp) Then
tContenidos.Add sTmp
End If
sBuffer = Mid$(sBuffer, i + 1)
End If
Loop While i
If Len(sBuffer) Then
tContenidos.Add sBuffer
End If
End If
Set IniGetSections = tContenidos
End Function