Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Crear series dinamicamente (https://www.clubdelphi.com/foros/showthread.php?t=71509)

vivamotos 24-12-2010 09:58:40

Crear series dinamicamente
 
Buenos días,

Tengo problemas al crear series dinamicamente mirad mi codigo

Código:

//grafico es el TChart
TFastLineSeries *SerieLineas;
grafico->SeriesList->Clear();
for(indice=1;indice<x;indice++)
{
          //creo las series dependiendo de x
          SerieLineas=new TFastLineSeries(grafico);
          SerieLineas->ParentChart=grafico;
          SerieLineas->LinePen->Width=3;
          SerieLineas->Marks->Visible=true;
          SerieLineas->Marks->FontSeriesColor=true;
          SerieLineas->Marks->Font->Size=7;
          SerieLineas->Marks->Transparent=true;
          SerieLineas->Marks->Style=smsValue;
          SerieLineas->Color=taula_colors[indice];
          SerieLineas->Title=aux;

          grafico->Series[indice]->Add(tal...)
}

Hasta aquí todo correcto, me genera el gráfico de maravilla pero siempre al cerrar el programa me da un "access violation"!.

Si no genero el grafico se cierra bien, pero a la que lo genero y cierro el programa patapam (ESTO a veces)

Quisiera saber si lo estoy haciendo bien.

Grácias.

coso 24-12-2010 11:32:12

hola,
las liberas en algun lado?

Toni 24-12-2010 13:39:53

Por el fracmento de codigo que nos enseñas veo que gestionas mal los punteros, ya que estas realizando varias (x) asignaciones a un mismo puntero dentro del bucle.

Es decir si x=3, estas haciendo 3 asignaciones de memoria al puntero SeriesList con el problema que no podras liberar la memoria despues puesto que el puntero solo apuntara a la ultima asignacion de memoria.

Código Delphi [-]
//grafico es el TChart
TFastLineSeries *SerieLineas;
grafico->SeriesList->Clear();
for(indice=1;indice{
           //creo las series dependiendo de x
           SerieLineas=new TFastLineSeries(grafico);
           SerieLineas->ParentChart=grafico;
           SerieLineas->LinePen->Width=3;
           SerieLineas->Marks->Visible=true;
           SerieLineas->Marks->FontSeriesColor=true;
           SerieLineas->Marks->Font->Size=7;
           SerieLineas->Marks->Transparent=true;
           SerieLineas->Marks->Style=smsValue;
           SerieLineas->Color=taula_colors[indice];
           SerieLineas->Title=aux;

           grafico->Series[indice]->Add(tal...)
}

De esta otra forma puedes despues liberar la memoria que asignaste en cada SerieLineas.

Código Delphi [-]
//grafico es el TChart
TFastLineSeries *SerieLineas[10];  /* suponiendo que x nunca sera mayor de 10 */
grafico->SeriesList->Clear();
for(indice=1;indice{
           //creo las series dependiendo de x
           SerieLineas[indice-1]=new TFastLineSeries(grafico);
           SerieLineas[indice-1]->ParentChart=grafico;
           SerieLineas[indice-1]->LinePen->Width=3;
           SerieLineas[indice-1]->Marks->Visible=true;
           SerieLineas[indice-1]->Marks->FontSeriesColor=true;
           SerieLineas[indice-1]->Marks->Font->Size=7;
           SerieLineas[indice-1]->Marks->Transparent=true;
           SerieLineas[indice-1]->Marks->Style=smsValue;
           SerieLineas[indice-1]->Color=taula_colors[indice];
           SerieLineas[indice-1]->Title=aux;

           grafico->Series[indice]->Add(tal...)
}

..................


for(indice=1;indice{
           //elimino las series dependiendo de x
           delete SerieLineas[indice-1];
}

Espero se sirva de ayuda.

vivamotos 24-12-2010 14:46:22

Gracias
 
Muchísimas grácias!!,

Grácias por la rapidez y la gran sabíduria que teneís ha funcionado perfectamente. Ese ejemplo lo vi de alguna web pero claro al cerrar el programa petaba, como que no la liberaba.

Pero bueno ya esta ahora.


La franja horaria es GMT +2. Ahora son las 00:42:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi