Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: удаление точки графика Chart
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
123kill12
хочу удалить одну точку с графика Series.

делаю так Series->Delete(i) где i номер нужной точки.
выдает ошибку "list index out of bounds".
я думаю это связано с тем что удаляя элемент из списка я оставляю пустое место. может нужно как то сдвинуть все элементы.
если забивать на эту ошибку. то точка удалится, а остальные не будут удаляться((((

удалить весь график и построить снова не вариант.

Код
void mouse_point(TPoint cPt)
{
    int Xx;
    double T;
    T=((double)0xFFFF)/(HorRes-90-170);
    Xx=(int)(T*(cPt.x-170));
    Form2->Series13->AddXY(Xx,general_buff[Xx],' ',clGreen);
    TLabel* l=new TLabel(Form1);
    T=((double)((Xx*20)-(otstup*20)))/1000;
    l->Caption="T:="+FloatToStr(T)+"ms";
    l->Parent=Form2->Chart1;
    l->Name="Label" + IntToStr(GNP+500);
    l->Transparent=true;
    l->Font->Size=10;
    l->Font->Color=clGreen;
    l->Top=cPt.y;
    l->Left=cPt.x;
    l->BringToFront();
    LabelList->Add(l);
    GNP++;
    l=new TLabel(Form1);
    l->Caption="U:="+FloatToStr(general_buff[Xx])+"V";
    l->Parent=Form2->Chart1;
    l->Name="Label" + IntToStr(GNP+500);
    l->Transparent=true;
    l->Font->Size=10;
    l->Font->Color=clGreen;
    l->Top=cPt.y+20;
    l->Left=cPt.x;
    l->BringToFront();
    GNP++;
}


void __fastcall TForm2::Chart1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  TPoint cPt;
  double HorX, VertY;
  int Xx;
  double T;
  HDC Disp_DC = CreateDC("DISPLAY", NULL, NULL, NULL);
  HorRes = GetDeviceCaps(Disp_DC, HORZRES);
  VertRes = GetDeviceCaps(Disp_DC, VERTRES);
  DeleteDC(Disp_DC);
  GetCursorPos(&cPt);
  if(cPt.x>170 && cPt.x<(HorRes-90))
  {
      if(cPt.y>60 && cPt.y<(VertRes-140))
      {
        if(Button == mbRight)
        {
            for(int i=0;i<(GNP/2);i++)
            {
               int Ny=((TLabel*)LabelList->Items[i])->Top;
               int Nx=((TLabel*)LabelList->Items[i])->Left;
               if(Nx>=(cPt.x-4) && Nx<=(cPt.x+4))
               {
                 if(Ny>=(cPt.y-20) && Ny<=(cPt.y+20))
                 {
                     Form2->Series13->Delete(i);
                     AnsiString S="Label"+IntToStr(i*2+500);
                     TComponent* Tc = Form1->FindComponent(S);
                     TLabel *vTl;
                     vTl = dynamic_cast<TLabel*>(Tc);
                     delete vTl;
                     S="Label"+IntToStr(i*2+500+1);
                     Tc = Form1->FindComponent(S);
                     vTl = dynamic_cast<TLabel*>(Tc);
                     delete vTl;
                 }
               }
            }
        }
        else
        {
          mouse_point(cPt);
        }
      }
  }
}
Xenia
На первый взгляд видятся такие недочёты:
1) Если при создании новой точки вы увеличиваете GNP на 2, то при удалении вам придётся GNP уменьшать на 2. А вы этого не делаете и потому в следующий раз попадаете на точки с номерами, которые уже удалили в прошлый раз.
2) Когда ищите компонент
TComponent* Tc = Form1->FindComponent(S);
то проверяйте, нашелся ли он, путем сравнения Tc с нулем. А если Tc оказался нулем, то пусть программа хотя бы ругнётся на этапе отладки.
3) При удалении компонентов делать им dynamic_cast нет необходимости.

Код
TComponent* Tc = Form1->FindComponent(S);
if( Tc)
  delete Tc;
else
  выдача сообщения об ошибке.
123kill12
я воспользовался функцией ChartClickSeries. с ней все работает.
GNP я использую для того чтоб имена случайно не совпали. эта переменная сбрасывается при нажатии на кнопку "очистить график". так и удаление списка.
вот про проверку дописал. спс.
Xenia
Цитата(123kill12 @ May 31 2011, 10:30) *
GNP я использую для того чтоб имена случайно не совпали. эта переменная сбрасывается при нажатии на кнопку "очистить график". так и удаление списка.

GNP используется вами, как предел счетчика цикла в функции Chart1MouseDown:
for(int i=0;i<(GNP/2);i++)
однако она удаляет не все точки, а только те, которые удовлетворяют "габаритным" условиям:
if(Nx>=(cPt.x-4) && Nx<=(cPt.x+4))
if(Ny>=(cPt.y-20) && Ny<=(cPt.y+20))
Это означает, что возможно удалены будут не все точки, а лишь некоторые из них. При повторном же входе в эту процедуру (MouseDown) вы окажетесь в опасной ситуации, т.к. часть точек у вас удалена с прошлого раза, но GNP осталась прежней. Поэтому в следующий раз цикл крутится, включая те точки, которых уже нет. Эта ситуация усугубляется еще и тем, что вы не проверяете результат поиска FindComponent, пытаясь удалять то, что было удалено в прошлый раз.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.