Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс на базе TChartSeries 
:(
    Опции темы
Locky
Дата 24.4.2006, 06:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.4.2006

Репутация: нет
Всего: нет



Ситуация следующая.
Создается класс на базе TChartSeries. Требуется добавить к нему несколько дополнительных полей.
Код

TUniSeries = class(TChartSeries)
 Public
  GrNum,CatNum:byte;
  Constructor create(AOwner:TComponent;gn:byte);
 End;

…

Contructor TUniSeries.create(AOwner:TComponent;gn:byte);
Begin
 Inherited create(AOwner);
 GrNum:=gn;
End;


Вопрос в следующем. Мне нужно, чтобы объект создавался не ChartSeries, а LineSeries, PointSeries или AreaSeries в зависимости от параметра gt. Возможно ли так сделать? Разумеется, не создавая отдельные классы под разные типы графиков.
Заранее благодарен.
 
PM MAIL   Вверх
Alexeis
Дата 25.4.2006, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Locky, возможен только следующий вариант новый класс должен содержать в себе все объекты перечисленных классов. содержать переменные процедурного типа. Затем в конструкторе создавть нужный объект и присваивать все его методы, так как это реализовано в KOL. Можно и подругому в public объявить их общего предка, а в конструкторе создавать любого его наследника и привваивать переменной предка таким образом прдок будет реагировать как любой его наследник. Пример - реализация lines в memo(можно посмотреть код VCL) - описан как абстрактный TStings, реализуется на самом деле TMemoStrings. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Locky
Дата 25.4.2006, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.4.2006

Репутация: нет
Всего: нет



Цитата(alexeis1 @ 25.4.2006,  10:22)
новый класс должен содержать в себе все объекты перечисленных классов. содержать переменные процедурного типа. Затем в конструкторе создавть нужный объект и присваивать все его методы, так как это реализовано в KOL. Можно и подругому в public объявить их общего предка, а в конструкторе создавать любого его наследника и привваивать переменной предка таким образом прдок будет реагировать как любой его наследник. Пример - реализация lines в memo(можно посмотреть код VCL) - описан как абстрактный TStings, реализуется на самом деле TMemoStrings.

Т.е., если я правильно понял, Вы говорите о подобном варианте:

Код

  TUniSeries=class
   public
    Ser:TChartSeries;
    CatNum:byte;
  End;
...

constructor TUniSeries.create(AOwner:TCOmponent;gt:byte);
begin
 inherited create;
 case gt of
  1,2,4,5:Ser:=TLineSeries.create(AOwner);
  0:Ser:=TPointSeries.create(AOwner);
  3:Ser:=TAreaSeries.create(AOwner);
 end;
 CatNum:=gt;
end;


Я так изначально делал и действительно так получалось, но в определенный момент у меня возникла следующая ситуация (я просматриваю сериесы, которые ассоциированны с определенным TChart):

Код

Var nls:TChartSeries;

For i:=0 to Ch.SeriesCount-1 do
 Begin
  Nls:=TChartSeries(ch.SeriesList[i]);
//и в этом месте мне надо получить доступ к объекту типа TUniSeries (конкретно мне нужно просмотреть поле CatNum).
И вот как это сделать я так и не сообразил.
 End;


При этом я точно знаю, что все сериесы в данном чарте, являются полями ser из соответствующих TUniSeries, но как добраться до самого UniSeries неясно. Это вообще возможно?
 
PM MAIL   Вверх
Alexeis
Дата 25.4.2006, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Может так  TUniSeries(ch.SeriesList[i]).CatNum  или я вопрос не понял?? 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Locky
Дата 25.4.2006, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.4.2006

Репутация: нет
Всего: нет



Цитата(alexeis1 @ 25.4.2006,  13:52)
Может так  TUniSeries(ch.SeriesList[i]).CatNum  или я вопрос не понял??

Наверное, тут как раз я недопонимаю ситуацию.
Я полагал так, что если я обращаюсь к ch.SeriesList[i], то это обращение к сериесу. А поле CatNum ведь не у сериеса, а у класса TUniSeries.
Так как Вы предложили я тоже пробовал реализовывать. Получилось, что всегда поле CatNum равно 0, хотя реально оно не 0.

Мне пришел в голову только один выход, но я не знаю насколько он вообще правомочен.
Все объекты типа TUniSeries у меня хранятся в NumSerList, который определен как TList.
А далее я делаю так:

Код

var nls:TChartSeries;
      uninls:TUniSeries;

...

   for i:=0 to ch.SeriesCount-1 do
    begin
     nls:=TChartSeries(ch.SeriesList[i]);
     for j:=0 to NumSerList.Count-1 do
      if TUniSeries(NumSerList.items[j]).ser=nls then
       uninls:=TUniSeries(NumSerList.items[j]);
//тут действия с Uninls
    end;


Т.е. я сравниваю непосредственно переменную, куда присвоен сериес из чарта и поле ser объекта TUniSeries из листа, где они хранятся. Если равенство, то я беру текущий TUniSeries из листа.
Вроде бы так получилось, но мне хотелось бы понять - это вообще нормальный или "кривой" подход. Вдруг, если подход "кривой" он в дальнейшем даст какие-то проблемы (сбои)? 
PM MAIL   Вверх
Alexeis
Дата 25.4.2006, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Locky, Это и называется полиморфизм smile  smile 
Единственное чего следует избегать это uninls := nil; - тогда удаляется реальный объект, вместо этого следует использовать
pointer(uninls) := nil; для очистки переменной 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Locky
Дата 25.4.2006, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.4.2006

Репутация: нет
Всего: нет



Цитата(alexeis1 @ 25.4.2006,  14:38)
Locky, Это и называется полиморфизм smile  smile 
Единственное чего следует избегать это uninls := nil; - тогда удаляется реальный объект, вместо этого следует использовать
pointer(uninls) := nil; для очистки переменной

Иными словами - сие правильно? smile
Про приравнивание nil я уже в курсе smile
Спасибо за консультацию.
Последний вопрос:
Правильно ли я понимаю, что при присвоении одной объектной переменной другой, они указывают на один и тот же адрес в памяти? 
PM MAIL   Вверх
Alexeis
Дата 25.4.2006, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Locky @  25.4.2006,  13:54 Найти цитируемый пост)
Правильно ли я понимаю, что при присвоении одной объектной переменной другой, они указывают на один и тот же адрес в памяти? 


Конечно! Ведь объектная переменная это и есть указатель 
 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0842 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.