Показать сообщение отдельно
  #1  
Старый 17.03.2018, 19:04
Dredfil Dredfil вне форума
Прохожий
 
Регистрация: 17.03.2018
Сообщения: 16
Версия Delphi: Delphi 10.2
Репутация: 10
По умолчанию Сохранение и загрузка записи с часто изменяемой структурой

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

Есть ли у вас какая-либо практика или идеи как можно успешнее решить задачу при условии частого добавления или изменения структуры настроек?
Ответить с цитированием