Читать статья по информатике, вычислительной технике, телекоммуникациям: "Модуль для работы с ассоциативными массивами в C++ Builder" Страница 2
внутренних списков. Поэтому, вне 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 поддерживают вложенные массивы неограниченного уровня вложенности.
Виктор
Похожие работы
Интересная статья: Быстрое написание курсовой работы

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