C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Удалить динамически созданные Series в TChart  (Прочитано 9425 раз)
OnixLab
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 67


« : 09 Июль 2008, 15:41:35 »

Доброго здоровья уважаемые.
Помогите разобраться с проблемой. Пишу программу в которой на "лету" создаю графики. Количество графиков (серий) заранее не известно. Необходимо перед каждым созданием новых удалить уже существующие. Вот тут то и происходит заковыка, не работают ни Series->Clear(), ни Series->Delete(i). Причем на Delete компилятор ругается как-то странно, типа много параметров, хотя вроде нужен только один, индекс.
Конструкция:
   for (int i = 0; i < Chart->SeriesCount(); i++) {
      Chart->SeriesList->Delete(0);
   }
вроде работает, но все равно графики не исчезают, а просто сбрасываются в ноль.
Создание серий делаю так:
   for (int i = 0; i < slChart->Count; i++) {
      serChart = new TBarSeries(Chart);
      serChart->ParentChart = Chart;
      serChart->AddXY(i+1, ((TAnalysisSum *) slChart->Objects)->Y, clRed);
      Chart->AddSeries(serChart);
   }
Записан
OnixLab
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 67


« Ответ #1 : 09 Июль 2008, 16:02:34 »

Вот такая ругань от компилятора
Member function must be called or its address taken (E2235).
Что вобчем то правильно, Delete ведь функция.
Записан
oxotnik
Глобальный модератор


Сказали спасибо: +100/-15
Offline

Сообщений: 2425


« Ответ #2 : 09 Июль 2008, 16:20:35 »

а если из загнать в динамический массив:
Код
std::vector<TBarSeries*>serChartArray;
for (int i = 0; i < slChart->Count; i++) {
     serChart = new TBarSeries(Chart));
     serChartArray.push_back(serChart)
     serChartArray[i]->ParentChart = Chart;
     serChartArray[i]->AddXY(i+1, ((TAnalysisSum *) slChart->Objects[i])->Y, clRed);
     Chart->AddSeries(serChart);
 
а потом удалять:
Код
for (int i = 0; i< serChartArray.size(); i++)
    delete serChartArray[i];
serChartArray.clear();
 
« Последнее редактирование: 09 Июль 2008, 17:02:02 от oxotnik » Записан
OnixLab
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 67


« Ответ #3 : 09 Июль 2008, 16:40:58 »

а если из загнать в динамический массив:
Код
sdt::vector<TBarSeries*>serChart;
for (int i = 0; i < slChart->Count; i++) {
     serChart.push_back(new TBarSeries(Chart));
     serChart[i]->ParentChart = Chart;
     serChart[i]->AddXY(i+1, ((TAnalysisSum *) slChart->Objects[i])->Y, clRed);
     Chart->AddSeries(serChart);
 
а потом удалять:
Код
for (int i = 0; i< serChart.size(); i++)
    delete serChart[i];
serChart.clear();
 

Structure required on left side of . or .* в строке serChart.push_back(new TBarSeries(Chart)); после serChart
Pointer to structure required on left side of -> or ->* - в строке serChart->ParentChart = Chart; на индекс
Записан
Asher
Администратор


Сказали спасибо: +111/-5
Offline

Сообщений: 425


« Ответ #4 : 10 Июль 2008, 08:55:45 »

Привет.

можете попробовать FreeAllSeries()

если не поможет, то перебираете все серии, делаете им delete <здесь указатель на серию>, а потом RemoveAllSeries или сразу RemoveSeries при переборе.
что-то вроде этого
Код:
  while(0 != pChart->SeriesCount()){
   TChartSeries* pSeries = pChart->Series[pChart->SeriesCount() - 1];
   pChart->RemoveSeries(pSeries);
   delete pSeries;
  }
Записан
OnixLab
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 67


« Ответ #5 : 14 Июль 2008, 08:00:07 »

Большое спасибо всем ответившим.
Все получилось очень здорово, работает как положено.
Нашел ошибку.
Записан
bilak
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 11


« Ответ #6 : 20 Май 2010, 18:37:04 »

поделитесь пожалуйста, в чем была ошибка?
Записан
Ilya_nsk
новенький


Сказали спасибо: +0/-0
Offline

Сообщений: 1


« Ответ #7 : 27 Февраль 2012, 15:31:40 »

Ошибка, вероятно, в том, что к Series [массив] надо обращаться по индексу.
В первом посте было
Код
...
     Chart->SeriesList->Delete(0);
  ...
а требуется

Код
...
Chart->Series[0]->Free();
...
 
почувствуйте разницу...
Series[n] дает указатель на n серию, к ней потом и применяйте методы и пр.
Метода Delete у Series нет, удаляет серию Free()
При удалении нулевая серия остается до последнего. Я так и удаляю у себя

« Последнее редактирование: 27 Февраль 2012, 15:39:26 от Ilya_nsk » Записан
gumi250
Участник


Сказали спасибо: +33/-1
Offline

Сообщений: 254


« Ответ #8 : 27 Февраль 2012, 17:10:42 »

А вроде как удалять классы через Free() в С++ не правильно, нужно через delete. А Free() это для дельфи.
как то так
Код
delete Chart->Series[0];
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.106 секунд. Запросов: 22.