На главную

28.10.2002

Автор: Нижегородцев Сергей

Как использовать файл инициализации.

Исходники здесь

Если вы не начинающий пользователь, вы, скорее всего, знаете что такое файл с расширением ini. Такие файлы можно открыть с помощью блокнота и посмотреть их содержимое. Структура файлов инициализации очень проста и выглядит следующим образом:

[Window Position]

Left= 330

Top= 435

Width= 4800

Height= 1770

[Content]

Text=Какой-то текст

То, что описывается в квадратных скобках, называется разделом. Если же квадратных скобок нет, то это выражение. С правой стороны знака “равно” стоит название переменной. А с левой стороны стоит значение переменной. Не так сложно для понимания, не так ли?

В операционной системе Windows есть две встроенные функции для чтения и для записи информации ini-файла: GetPrivateProfileString, WritePrivateProfileString. Эти функции находятся в файле kernel32.dll.

Данная статья показывает, как работать с этими функциями.

Для начала создайте проект в VB “Standart Exe”. Затем на главной форме расположите компонент TextBox.

В нашем файле инициализации мы будем хранить расположение, размер формы и содержимое компонента Text1.

Для начала опишем API-функции. Вставьте две строки в модуль формы:

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

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

Первая функция считывает переменную из ini-файла. Ее параметры: lpApplicationName – название раздела, lpKeyName – название переменной, lpDefault – строка, возвращаемая в случае невозможности чтения переменной (такой переменной может просто не быть в файле), lpReturnedString – возвращаемое значение переменной типа строка, размер возвращаемой строки в символах (рекомендую ставить побольше), lpFileName – путь и имя файла инициализации. Данная функция возвращает количество символов в прочитанной строке. Количество не всегда будет равно nSize.

Вторая функция записывает переменную в файл инициализации. Причем, если в файле не было такой переменной в определенном разделе, то оно создается автоматически. Это же надо отметить и про файл инициализации. Если его не существовало, то после вызова данной функции он создается автоматически. Параметры:

LpApplicationName – название раздела, lpKeyName – название переменной, lpString – записываемое значение переменной (я бы не советовал подкупаться на тип Any, а записывать все в виде строки с заранее выделенной памяти для корректной работы этой функции), lpFileName – название ini-файла.

Далее нам надо вставить считывание из ini-файла в начале создания формы. Вставьте код:

Private Sub Form_Load()

Dim myLeft As Integer, myTop As Integer, myHeight As Integer, myWidth As Integer

Dim myText As String

Dim s As String

Dim charCount As Long

 

iniFile = App.Path & "\myini.ini"

s = Space(255)

charCount = GetPrivateProfileString("Window Position", "Left", "-1", s, 255, iniFile)

s = Left(s, charCount)

If s = "-1" Then Exit Sub

myLeft = CInt(s)

s = Space(255)

charCount = GetPrivateProfileString("Window Position", "Top", "-1", s, 255, iniFile)

s = Left(s, charCount)

If s = "-1" Then Exit Sub

myTop = CInt(s)

s = Space(255)

charCount = GetPrivateProfileString("Window Position", "Height", "-1", s, 255, iniFile)

s = Left(s, charCount)

If s = "-1" Then Exit Sub

myHeight = CInt(s)

s = Space(255)

charCount = GetPrivateProfileString("Window Position", "Width", "-1", s, 255, iniFile)

s = Left(s, charCount)

If s = "-1" Then Exit Sub

myWidth = CInt(s)

s = Space(255)

charCount = GetPrivateProfileString("Content", "Text", "No text in ini", s, 255, iniFile)

s = Left(s, charCount)

myText = s

Me.Left = myLeft

Me.Top = myTop

Me.Width = myWidth

Me.Height = myHeight

 

End Sub

На закрытие формы надо вставить следующий код:

Private Sub Form_Unload(Cancel As Integer)

Dim charCount As Long

Dim s As String

 

s = Str(Me.Left)

s = Left(s, Len(s))

charCount = WritePrivateProfileString("Window Position", "Left", s, iniFile)

s = Str(Me.Top)

s = Left(s, Len(s))

charCount = WritePrivateProfileString("Window Position", "Top", s, iniFile)

s = Str(Me.Width)

s = Left(s, Len(s))

charCount = WritePrivateProfileString("Window Position", "Width", s, iniFile)

s = Str(Me.Height)

s = Left(s, Len(s))

charCount = WritePrivateProfileString("Window Position", "Height", s, iniFile)

s = Text1.Text

s = Left(s, Len(s))

charCount = WritePrivateProfileString("Content", "Text", s, iniFile)

End Sub

Теперь рассмотрим, например, сохранение левой координаты угла

s = Str(Me.Left)

s = Left(s, Len(s))

charCount = WritePrivateProfileString("Window Position", "Left", s, iniFile)

Сначала присваиваем координату переменной строкового типа, затем для уверенности освобождаем память функцией Left. Хотя основное назначение этой переменной это отсечение строки с левой стороны.

И наконец, просто пишем в файл.

Рассмотрим чтение переменной из файла инициализации:

s = Space(255)

charCount = GetPrivateProfileString("Window Position", "Left", "-1", s, 255, iniFile)

s = Left(s, charCount)

If s = "-1" Then Exit Sub

myLeft = CInt(s)

Сначала освобождаем память для переменной s путем присваением пустой строки размера 255. Затем читаем s. Значение по умолчанию делаем –1. Затем отсекаем все ненужные символы с правой стороны у строки, чтобы получить настоящее значение, без мусора. Дальше проверяем на значение по умолчанию. Если, это значение по умолчанию, то выходим из процедуры, так как не удалось прочитать из файла инициализации.

Переменная iniFile = App.Path & "\myini.ini" определяется в начале работы программы и не меняется на всем протяжении работы.

Одна особенность работы с файлами инициализации – НЕЛЬЗЯ записывать и читать строки с символами перевода строки, т.е. строки с символами “Enter”. Но это можно легко обойти, если строку разбить на массив подстрок без символов перевода строки. Массив можно записать следующим образом: сначала запишите размер массива, затем пишите каждый элемент массива Array_1, Array_2, Array_3, … Где Array_N это переменная, которая будет хранить элемент из массива под номером N. Прочитать надо так: сначала считываете размер массива, затем в цикле читаете переменную “Array_” & i, где i – это счетчик в цикле.

Hosted by uCoz