c++ builder XE4, 10.2 Tokyo > TDateTime | 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

やりたいこと

  • データの時刻に合わせて、時間軸を自動的に変更したい

関連 http://qiita.com/7of9/items/de690c703d2d3e758607

Unit1.cpp
#include <DateUtils.hpp>

...

#if 0
static const int kRangeMinutes = 10;
#else
static const int kRangeMinutes = 2;
#endif

TDateTime __fastcall TFormGraphTemplate::TimeAxis_getRoundedDateTime_each10min(TDateTime srcDt)
{
    int dt_min = srcDt.FormatString(L"nn").ToInt();
    int reduce_min = dt_min % kRangeMinutes ; // for every 10 min
    int reduce_sec = srcDt.FormatString(L"ss").ToInt();

    TDateTime outDt = IncMinute(srcDt, - reduce_min);
    outDt = IncSecond(outDt, - reduce_sec);

    return outDt;
}

void __fastcall TFormGraphTemplate::TimeAxis_autoChangeRange_10min(TDateTime srcDt)
{
    TDateTime curEdDt = Chart1->BottomAxis->Maximum;

    if (srcDt <= curEdDt) {
        return; // do nothing
    }

    TDateTime setStDt = TimeAxis_getRoundedDateTime_each10min(srcDt);
    TDateTime setEdDt = IncMinute(setStDt, kRangeMinutes);

    Chart1->BottomAxis->SetMinMax(setStDt, setEdDt);
}

関連ページと比べて「現在時刻の秒」も対応した。

kRangeMinutes はテスト用に入れたconst変数。リファクタリングでは取り除く。

TimeAxis_autoChangeRange_10min()はデータがプロットされるたびに呼んでおけば、データの時刻がグラフの時間軸範囲を超えたときに、時間軸が変更される。

実際やってみたところ、自動変更はされるが見た目はいまいち。

現在試験実装している別の表示の仕方の方がよさそうだが、簡易的な実装としてはこれでもいい。