|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Сохранение и загрузка записи с часто изменяемой структурой
Добрый день.
Мозгую над одной задачей, подумал, может у кого есть опыт в подобных вещах. В приложении есть форма настройки выбранной учетной записи сервиса. На форме несколько контролов разного типа: чекбокс, текстовое поле, поле с выпадающим списком и др. Есть запись, типа: Код:
TConfig = record Name: string[30]; Age: byte; Active: boolean; Obj: array[1..10] of byte; end; Код:
var Config: TConfig; Запись 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... Приходится работать с текстовым файликом, где хранить описание всех элементов создаваемой структуры. Есть ли у вас какая-либо практика или идеи как можно успешнее решить задачу при условии частого добавления или изменения структуры настроек? |