C++ Builder XE4 > TeeChart > 클릭한 점에 가까운 계열 데이터의 명시 > 점과 값의 표시 > v0.4: 클릭시에 세로 방향으로 선을 명시하도록(듯이) 한다

운영 환경
C++ Builder XE4
TeeChart Lite v2013.08.130414 32bit VCL

지난번


  • C++ Builder XE4 > TeeChart > 클릭한 점에 가까운 계열 데이터 명시 > 점과 값 표시 > v0.3: 선에서 벗어나도 세로 스캔으로 선 찾기

  • v0.4



    클릭시 세로 방향으로 선을 명시하도록 한다.

    TShape를 사용한다.

    Unit1.h
    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <System.Classes.hpp>
    #include <Vcl.Controls.hpp>
    #include <Vcl.StdCtrls.hpp>
    #include <Vcl.Forms.hpp>
    #include <Vcl.ExtCtrls.hpp>
    #include <VCLTee.Chart.hpp>
    #include <VCLTee.TeEngine.hpp>
    #include <VCLTee.TeeProcs.hpp>
    #include <VCLTee.Series.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:    // IDE で管理されるコンポーネント
        TChart *Chart1;
        TFastLineSeries *Series1;
        TPointSeries *Series2;
        TEdit *E_xvalue;
        TEdit *E_yvalue;
        TButton *Button1;
        TShape *Shape1;
        void __fastcall FormShow(TObject *Sender);
        void __fastcall Chart1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
              int X, int Y);
    
    private:    // ユーザー宣言
    public:     // ユーザー宣言
        __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    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)
    {
        Shape1->Brush->Color = clRed;
    //  Shape1->Brush->Style = bsClear;
    //  Shape1->Brush->Style = bsHorizontal;
    //  Shape1->Brush->Style = bsFDiagonal;
        Shape1->Visible = false;
        Shape1->Pen->Style = psClear;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormShow(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);
        }
    }
    
    #define POINT_NOT_FOUND (-1)
    
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Chart1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
              int X, int Y)
    {
        // グラフ上端から下端まで走査してインデックスを見つける
        int top = Chart1->ChartRect.Top;
        int btm = Chart1->ChartRect.Bottom;
        int index = POINT_NOT_FOUND;  // 系列のインデックスが入る
        for(int ypos = top; ypos <= btm; ypos++) {
            index = Series1->Clicked(X, ypos);
            if (index != POINT_NOT_FOUND) {
                break;
            }
        }
    
        // A. クリックが外れていたとき
        if (index == POINT_NOT_FOUND) {
            return;
        }
    
        // B. クリックが線上の時に表示
    
        // 枠の追加
        double xval = Series1->XValue[index];
        double yval = Series1->YValue[index];
    
        //   枠
        Shape1->Visible = true;
        Shape1->Width = 4;
        Shape1->Left = Series1->CalcXPosValue(xval);
        Shape1->Left -= Shape1->Width / 2; // 真ん中に来るように
        Shape1->Top = Chart1->ChartRect.top;
        Shape1->Height = Chart1->ChartRect.Height();
    
        // 数値表示
        E_xvalue->Text = String().sprintf(L"%.3f", xval);
        E_yvalue->Text = String().sprintf(L"%.3f", yval);
    }
    //---------------------------------------------------------------------------
    
    

    동작 예





    이번, Series2는 사용하고 있지 않다.

    참고


  • TShape 설정에 관하여

  • htp://u670. 이 m/에서 lp 히_치 ps/치 ps0091. HTML
  • from Delphi Beginner's Tips by ohishi님


  • 정보 감사입니다.

    좋은 웹페이지 즐겨찾기