|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
Нестандартная задача. Создание класса
Есть задача создать класс для подгрузки (из БД или ИНИ) настроек и дальнейшего их использования в программе. Причем для более удобного использования этого класса, вид извлечения и добавления этих настроек должен выглядеть вот так:
Код:
var Opt:TMyClass; //экземпляр класса Var1:integer; begin Opt := TMyClass.Create; Opt['Category']['SubCategory']['SubSubCategory']['Option1'] := 'qwe'; {Строчка выше означает, что класс должен создать (если ранее не создано) категорию 'Category', в ней Подкатегорию 'SubCategory', в ней еще подкатегорию 'SubSubCategory' (то есть все в виде дерева), в ней опцию 'Option1' и присвоить этой опции значение 'qwe'} Var1 := Opt['Category']['Option2']; {Строчка выше означает, что переменной Var1 типа integer должно присвоиться значение опции 'Option2' из категории 'Category', если данные опция и категория созданы } end; То есть при первом же рассмотрении встает вопрос, как сделать так, чтобы у дефолтной property функции для read и write имели разные типы данных? Типа того: Код:
TCategory = Class; TMyClass = Class private function GetV(Name:string):TCategory; procedure SetV(Name:string;Value:STRING); public property Cat[Name:string]:TCategory read GetV write SetV; default; end; |
#2
|
|||
|
|||
похожее делал так:
Код:
procedure InitIni; begin inimap := TiniManager.Create('ini.ini') inimap.define('section', 'somevar', '100', TInt.Create(@intvar)); inimap.define('section', 'somevar2', 'default', TStr.Create(@strvar)); inimap.define('section', 'somevar3', 'yes', TBool.Create(@boolvar)); inimap.define('main', 'form-x', '100', TProp.Create(Form1, 'left')); inimap.define('main', 'form-y', '100', TProp.Create(Form1, 'top')); end; inimap.write; inimap.read; хотя TProp.Create(...) можно заменить разными версиями метода .define >woweook< Последний раз редактировалось Pyro, 08.02.2013 в 09:56. |
#3
|
||||
|
||||
Что? Где в вашем сообщении ответ на мой вопрос?
|
#4
|
|||
|
|||
variant пробовал?
>woweook< |
#5
|
||||
|
||||
А разве в варианте можно хранить экземпляр класса? Даже если и можно, я не смогу обращаться с переменной типа вариант, как с экземпляром класса. Ну разве что делать так:
with opt['Category'] as TCategory with ['SubCategory'] as TCategory **** И так далее. А должно выглядеть так, как я написал в первом сообщении. Цель - сделать программу легко перевариваемую программистами, чтобы один мог написать, другой подправить. Уже наделал кучу классов для красивого кодинга в дальнейшем. Споткнулся вот на этом. |
#6
|
|||
|
|||
вот такие варианты есть
Код:
Var1 := Opt['Category','Option2']; Var1 := Opt['Category']['Option2'].get Var0 := Opt['Category','Sub'].get('Option1'); with Opt['Category','Sub'] do begin Var1 := get('Option2') Var2 := get('Option3') end а предыдущий код который я выкладывал - для того что бы избавиться от дублирования при записи/чтении >woweook< Последний раз редактировалось Pyro, 11.02.2013 в 09:03. |