Читать статья по информатике, вычислительной технике, телекоммуникациям: "Модуль для работы с ассоциативными массивами в C++ Builder" Страница 2

назад (Назад)скачать (Cкачать работу)

Функция "чтения" служит для ознакомления с работой. Разметка, таблицы и картинки документа могут отображаться неверно или не в полном объёме!

внутренних списков. Поэтому, вне Builder'а – например, в MSVC++, этот класс работать не будет. Однако, при большом желании, его можно портировать (использовав list из stl и написав свою реализацию Variant).

Моя библиотека содержит три класса: ass_arrEl – класс элемента массива, ass_arr – класс простого ассоциативного массива, и его наследник – prop_ass_arr, предназначенный для работы с окнами настройки. Он «умеет» сохранять и загружать своё содержимое из реестра, заполнять им формы и заполняться содержимым формы сам.

Как работать с моими классами

Несколько наглядных примеров:

Простой массив. Работа со значениями.

#include "ass_arr.h";

ass_arr a;

// так можно создать элементы

a["name"] = "Сажин";

a["surname"] = "Бесноватый";

// а так – обратиться к их значениям

ShowMessage(a["name"].v());

ShowMessage(a["name"].v());

a["name"].v() возвращает значение типа Variant.

Работа с ключами

#include "ass_arr.h";

ass_arr a;

int i;

// Создаём два значения

a["name"] = "Сажин";

a["surname"] = "Бесноватый";

// Выводим их в цикле

for (i = 0; i < a.count(); i++)

{

// a.key(i) возвращает ключ i-го по счёту элемента.

// Ключ тоже типа Variant. Заметьте, что при выводе я напрямую

// не указываю ключей: они определяются автоматически

ShowMessage(a[a.key(i)].v());

}

В ключах не существует недопустимых символов. Вы можете использовать в качестве ключей даже имена файлов с полными путями!

Вложенные массивы. Простейшее дерево.

#include "ass_arr.h";

ass_arr a;

ass_arr* inner;

int i;

// создаём новый ассоциативный массив

inner = new ass_arr;

// заполняем его данными. (*inner)[] - обращение к оператору

// обьекта по указателю.

(*inner)["name"] = "Фёдор";

(*inner)["surname"] = "Сумкин";

// вносим его в нулевой элемент массива a

a[0] = inner;

inner = new ass_arr;

(*inner)["name"] = "Фёдор";

(*inner)["surname"] = "Чистяков";

a[1] = inner;

inner = new ass_arr;

(*inner)["name"] = "Фёдор";

(*inner)["surname"] = "Беззвестный";

// присваивать можно ссылку на массив, либо же сам массив

a[2] = *inner;

// теперь выведем поле surname второго элемента

inner = a[1].sub(); // заносим в inner ссылку на вложенный массив второго элемента

ShowMessage((*inner)["surname"]);

// выведем поле name третьего элемента (можно писать так)

ShowMessage((*(a[2]))["name"]);

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

Заполнение формы значениями массива. Загрузка значений ассоциативного массива. Сохранение ассоциативного массива в реестре и загрузка его из реестра.

Допустим, на форме mainForm два поля: TEdit login и TEdit password. Кроме того, в массиве конфигурации необходимо хранить число запусков программы (numStarts).

#include "ass_arr.h";

prop_ass_arr config;

... mainForm::onCreate(...)

{

// загружаем конфигурацию из реестра

if (!config.loadSection(HKEY_CURRENT_USER, "Software/Kuu/Passworder"))

ShowMessage("Не удалось загрузить конфигурацию из реестра");

config["numStarts"].v()=config["numStarts"].v()+1;

}

... mainForm::onShow(...)

{

// заполняем форму значениями конфигурации

config.toForm(this);

}

... mainForm::onDestroy(...)

{

// заполняем конфигурацию значениями из формы

config.fromForm(this);

if (!config.saveSection(HKEY_CURRENT_USER, "Software/Kuu/Passworder"))

ShowMessage("Не удалось сохранить конфигурацию в реестр");

}

Так просто? Да!

saveSection и loadSection поддерживают вложенные массивы неограниченного уровня вложенности.

Виктор


Интересная статья: Быстрое написание курсовой работы