Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.02.2013, 06:59
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Нестандартная задача. Создание класса

Есть задача создать класс для подгрузки (из БД или ИНИ) настроек и дальнейшего их использования в программе. Причем для более удобного использования этого класса, вид извлечения и добавления этих настроек должен выглядеть вот так:

Код:
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  
Старый 08.02.2013, 09:36
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

похожее делал так:
Код:
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  
Старый 10.02.2013, 08:42
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Что? Где в вашем сообщении ответ на мой вопрос?
Ответить с цитированием
  #4  
Старый 10.02.2013, 09:53
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

variant пробовал?
__________________
>woweook<
Ответить с цитированием
  #5  
Старый 11.02.2013, 05:00
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

А разве в варианте можно хранить экземпляр класса? Даже если и можно, я не смогу обращаться с переменной типа вариант, как с экземпляром класса. Ну разве что делать так:
with opt['Category'] as TCategory
with ['SubCategory'] as TCategory
****
И так далее. А должно выглядеть так, как я написал в первом сообщении.
Цель - сделать программу легко перевариваемую программистами, чтобы один мог написать, другой подправить. Уже наделал кучу классов для красивого кодинга в дальнейшем. Споткнулся вот на этом.
Ответить с цитированием
  #6  
Старый 11.02.2013, 08:33
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
Сообщение

вот такие варианты есть
Код:
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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:44.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter