Добрый день.
Мозгую над одной задачей, подумал, может у кого есть опыт в подобных вещах.
В приложении есть форма настройки выбранной учетной записи сервиса. На форме несколько контролов разного типа: чекбокс, текстовое поле, поле с выпадающим списком и др.
Есть запись, типа:
Код:
TConfig = record
Name: string[30];
Age: byte;
Active: boolean;
Obj: array[1..10] of byte;
end;
и переменная, типа
Изменение значений контролов на форме приводит к изменению переменной Config. При закрытии формы происходит сохранение этой записи на диск.
Запись TConfig в моем случае часто меняется и уже достигла более 100 элементов, в том числе массивов со своей структурой.
При добавлении нового элемента в структуру записи TConfig:
1. добавляется новый контрол на форму;
2. к этому контролу пишется процедура, которая записывает значение контрола в элемент записи TConfig.
3. в событие показа формы добавляется код, заполняющий значение контрола.
При этом есть недостаток - если сохранять запись в типизированный файл (File of TConfig), то при изменении структуры данные из старого файла не читаются. А если преобразовывать запись во что-то вроде XML или подобный формат, то надо еще править процедуры сохранения и загрузки данных.
Я попробовал реализовать задачу другим путем - создал свой класс, типа именованного списка, который хранит элементы в формате имя = значение + организовал поддержку иерархической структуры - к элементам добавил ссылку на дочерний элемент и ссылку на следующий элемент этого же уровня; сделал методы навигации по данным.
В итоге решилась масса проблем и открылись свои плюсы.
Пример записи и чтение данных из объекта-списка.
Код:
var
Config: TDataBank;
Config['Name']:='Василий';
Config['Age']:=5;
s:=Config['obj:2.Count']; // 2 элемент массива obj, свойство Count
Для заполнения формы и для изменения данных при манипуляции с контролами формы были созданы 2 универсальные процедуры, которые по имени контролов считывают и записывают данные в объекте-списке TDataBank. Поэтому исчезла необходимость под номером 2 и 3 случая использования записи.
Так же исчезла проблема с загрузкой: данные считываются по имени, а если какого-то элемента не хватает, то он просто не заполнен. При этом не требуется менять методы сохранения и загрузки.
Появилась возможность манипулировать структурой прям в runtime - при присвоении значения по неизвестному имени элемент с этим именем тут же создается в объекте-списке, в том числе массив или дочерний элемент.
Вроде все здорово, но появилась своя проблема - в процессе разработки приходится все переменные задавать как строки (Config['Name']) и если была допущена опечатка, то ошибку можно долго искать - IDE не подсказывает что название некорректное и не предлагает варианты названий переменных структуры когда поставишь точку после Config...
Приходится работать с текстовым файликом, где хранить описание всех элементов создаваемой структуры.
Есть ли у вас какая-либо практика или идеи как можно успешнее решить задачу при условии частого добавления или изменения структуры настроек?