Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > программное создание серий графика


Автор: gordmiand 14.8.2008, 22:41
подскажите как программно создать (и работать с нимив дальнейшем) заданное n- количество новых серий для имеющегося "чистого" графика Chart?

Автор: volvo877 14.8.2008, 23:11
Очень просто:

Код
    for(int i = 0; i < 10; i++) {
        TLineSeries *new_serie = new TLineSeries(NULL); // Создаем 10 LineSeries
        new_serie->Title = "Serie" + IntToStr(i);
        new_serie->Color = clRed;
        Chart1->AddSeries(new_serie);
    }
, а теперь заносим во вторую серию 20 точек со случайной ординатой:
Код
    for(int i = 0; i < 20; i++) {
        Chart1->Series[2]->AddY(random(100), "", clBlue);
    }

Автор: mrbrooks 15.8.2008, 08:17
более того эта тема 100% поднималась на форуме.

Автор: Annihilator 17.8.2008, 21:08
делал я тут как-то smile
Код

void TForm1::graph(int m, float *mas)
{
    const int graph_quan=1; // колическтво графиков (можно ввести с клавы -сам решишь)
    static TFastLineSeries **line;  // TFastLine - тип графика
    static h=1; // будем каждый раз строить с аргументом (h*n)
    float  j=2;
    int n;
    randomize();
    if (Chart1->SeriesCount())// если до этого в нашем чарте были графики
    {
        for (n = 1; Chart1->SeriesCount(); n++)
        delete line[n-1];
        delete line;
    }
    line = new TFastLineSeries*[graph_quan];  // указатель на массив серий
    for (int n = 1; n <= graph_quan; n++,h++)
    {
        line[n-1]= new TFastLineSeries(Chart1); // создадим саму серию
        line[n-1]->SeriesColor=(n%2)?(clRed):(clGreen);    // цвет если хошь
        line[n-1]->LinePen->Width=1.6;    // толщину если хошь
        Chart1->AddSeries(line[n-1]);    // добавим серию к нашему чарту
        for (int i=0; i<m; i++,j+=28.0/m)
        Chart1->Series[n-1]->AddXY(j, *(mas+i));
    }

}

Автор: gordmiand 19.8.2008, 01:27
подскажите пож-та по этой же тематике как программно можно использовать легенду (видима/невидима), толщину линий и подписи по осям...

Автор: petlyura 19.8.2008, 09:37
Код

Chart1->Legend->Alignment = laBottom; // расположение легенды
Chart1->Legend->Visible = true; // false; видимость легенды

Chart1->LeftAxis->SetMinMax( 0, 1001 ); // пределы на левой оси
Chart1->LeftAxis->LabelsOnAxis = false; // показывать мин и макс
Chart1->LeftAxis->Labels = true; // показывать метки


Есть такое событие OnGetAxisLabel, так вот в нем можно творить следующее:
Код

//------------------------------------------------------------------------------
void __fastcall TСhart::GetAxisLabel(TChartAxis*Sender,TChartSeries*Series, int ValueIndex,String& LabelText)
{
if(!Sender->Horizontal)  // только для оси абсцисс
   return;
TDateTime d = CurrentDateTime;  // расчеты, что выводить
d=d-(double)(CurrentPoint-StrToFloat(LabelText))*DateTimeStep[dtOneSecond];
TDateTime LastTime=d-(int)d;

LabelText=LastTime;   // выводить то, что в LastTime
}


А перед этим можно настройки оси абсцисс выполнить

Код

Chart1->BottomAxis->Labels = true;
Chart1->BottomAxis->MinorTickLength = 0;
Chart1->BottomAxis->TickOnLabelsOnly = 0;
Chart1->BottomAxis->Automatic=false;
Chart1->BottomAxis->AutomaticMaximum = false;
Chart1->BottomAxis->AutomaticMinimum = false;
Chart1->BottomAxis->RoundFirstLabel=false;
Chart1->BottomAxis->LabelStyle=talValue;
Chart1->BottomAxis->LabelsFont->Charset = DEFAULT_CHARSET;
Chart1->BottomAxis->LabelsFont->Height = -10;
Chart1->BottomAxis->LabelsFont->Style.Clear();
Chart1->BottomAxis->LabelsSize = 0;
Chart1->BottomAxis->AxisValuesFormat="######0.#";
Chart1->BottomAxis->Ticks->Color = clBlack;

Автор: gordmiand 20.8.2008, 09:25
подскажите пож-та как сделать очистку графиков, созданных динамически?

я делаю так:

Код


if (Chart1->SeriesCount())      

{
        for (n = 0; n<Chart1->SeriesCount(); n++)
        delete Chart1->Series[n];                                   //удаление имеющихся (если есть) серий
}




   for(int i = 0; i < 5; i++) 
    {
        TLineSeries *seria = new TLineSeries(NULL); 
        Chart1->AddSeries(seria);
    }




но при вариациях количества отображаемых динамически созданных серий выдается ошибка (access violation at address ...) - что-то не нравится удаление дин-х серий.....в чем ошибка или может не так их надо очищать?



Автор: mrbrooks 20.8.2008, 10:03
очистку делай так же в цикле
 
Код

for (n = 0; n<Chart1->SeriesCount(); n++) Series[n]->Clear();

Автор: gordmiand 27.8.2008, 17:15
подскажиет как программно задавать тип создаваемой серии (и особенно тип серии 3D)

Автор: gordmiand 28.8.2008, 02:10

Код


  if (Chart30->SeriesCount())      

{
        for (n = 0; n<Chart30->SeriesCount(); n++)
        delete Chart30->Series[n];
}





  for(int nfg = 0; nfg < Kolser; nfg++)
    {
        TLineSeries *new_serie = new TLineSeries(NULL); 
        Chart30->AddSeries(new_serie);

    }


по идее должно создаватсья ровно Kolser-серий, но судя по количеству серий в легенде данного чарта - это не так....в чем ошибка??? подскажите пожаааалуйста как правильно это сделать!!!!!
и скажите как программно задавать тип создаваемой серии (и особенно тип серии 3D)?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)