c++ builder XE4, 10.2 Tokyo > TeeChart > 한 번 그린 시리즈 중 일부를 제거하고 그리는 구현

운영 환경
C++ builder XE4
    TeeChart Lite v2013.08.130414
RAD Studio 10.2 Tokyo Update 2 (追記 2018/01/10)
    TeeChart v2016.17.160129 32bit VCL

TeeChart에서 그린 꺾은선형 차트에서, 어느 범위만큼 선을 자르고 싶은 경우가 있다.

이를 위한 구현

Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <DateUtils.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    Chart1->Series[0]->XValues->DateTime = true;
    Chart1->BottomAxis->DateTimeFormat = L"nn:ss";

    TDateTime dt;

    dt = Now();

    double yval;
    for (int idx=0; idx < 10; idx++) {
        yval = (1+ idx) % 2;
        Series1->AddXY(dt, yval, "", clRed);
        dt = IncSecond(dt, 1);
    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::breakLine()
{
    double xvals[2000];
    double yvals[2000];

    Series1->TreatNulls = tnDontPaint;

    int serCnt = Series1->Count();
    for(int sidx = 0; sidx < serCnt; sidx++) { // sidx: series index
        xvals[sidx] = Series1->XValue[sidx];
        yvals[sidx] = Series1->YValue[sidx];
    }

    Series1->Clear();

    for(int sidx = 0; sidx < serCnt; sidx++) { // sidx: series index
        if (sidx >= 3 && sidx < 5) {
            Series1->AddNullXY(xvals[sidx], yvals[sidx]);
            continue;
        }
        Series1->AddXY(xvals[sidx], yvals[sidx]);
    }
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    breakLine();
}
//---------------------------------------------------------------------------
breakLine() 에서 조건 if (sidx >= 3 && sidx < 5) { 에 의해 선을 자르도록 하고 있다.

결과



자르기 전





자른 후





보충



기본적으로는 AddXY() 하는 처리 모두에 AddNullXY() 관련의 처리를 실장하면 되지만, 그것이 여러가지 기능으로 사용되고 있을 때에, 개개의 AddXY() 에 각각 실장하는 것은 유지보수의 점에서 좋지 않다.

문득, "한 번 그린 그래프를 선을 자르고 다시 그리면 좋을 것"이라고 생각하고, 이 실장을 시도했다.

double []를 사용하고 있지만,이 근처는 STL의 vector가되고 list 나름을 사용하는 것이 좋을지도 모른다.

좋은 웹페이지 즐겨찾기