動作環境
C++ builder XE4
TeeChart Lite v2013.08.130414
RAD Studio 10.2 Tokyo Update 2 (追記 2018/01/10)
TeeChart v2016.17.160129 32bit VCL
適宜データが追加されるグラフに対して、時間的に古いデータを自動的に取り除く方法を検討している。
取り除き方
- 先頭から指定の数を取り除く
- 取り除く処理のトリガーは、ある指定個数を超えた時
以下の変数をどう設定するか
- 取り除かれる数
- 取り除いた直後の残り数
以下のAとBのどちらがいいかは、その時々の状況で変わる。
A. 取り除いた後の数を150とする考え
B. 取り除かれる直前の数を150とする考え
実装
動作確認
C++ Builder XE4
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)
{
Chart1->Series[0]->XValues->DateTime = true;
Chart1->BottomAxis->DateTimeFormat = L"nn:ss";
TDateTime dt;
dt = Now();
double dval;
for (int idx=0; idx < 100; idx++) {
dval = (double)random(60);
Series1->AddXY(dt, dval, L"", clRed);
dt = IncSecond(dt, 1);
}
}
//---------------------------------------------------------------------------
static const int kNumberToKeep = 150;
void __fastcall TForm1::B_addClick(TObject *Sender)
{
TDateTime lastDt = Series1->XValues->Last();
TDateTime workDt = IncSecond(lastDt, 1);
double dval;
for (int idx=0; idx < 10; idx++) {
dval = (double)random(60);
Series1->AddXY(workDt, dval, L"", clRed);
workDt = IncSecond(workDt, 1);
}
int removeCnt = Series1->Count() - kNumberToKeep;
for (int loop=0; loop < removeCnt; loop++) {
Series1->Delete(0);
}
}
//---------------------------------------------------------------------------
ボタンが押される度に10データずつ追加される。
150を超えた時に超えた分だけ取り除かれる (上記のAの実装)。
画像
少しずつプロットが左に移動するようになった。
補足
図の作成にYUMLを使ってみた。
本当は上下でなく、左右のボックスにしたかったが、書き方がわからなかった。
YUMLのサービスが終わったとき、図がxマークになり、後からみたとき何が記載されていたかわからなくなるかも。そういう心配をする場合は画像貼り付けの方がいいのだろう。
一方で、YUMLの良い点は後からの編集が可能ということ。画像貼り付けの場合は変更する必要が出たときに画像を作成した元データをたどって、ツールを立ち上げて修正し、エクスポートしてこちらに持ってくる、という手順を踏まないといけない。