動作環境
C++ Builder XE4
関連
実装
上記の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)
{
}
//---------------------------------------------------------------------------
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);
}
// 項目名の変更
Chart1->Legend->LegendStyle = lsSeries;
Chart1->Series[0]->Name = L"XXX";
Chart1->Series[1]->Name = L"YYY";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Chart1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
int X, int Y)
{
int index = Series1->Clicked(X, Y);
if (index != -1) {
Chart1->Canvas->TextOutW(X+15, Y, Series1->ValueMarkText[index]);
} else {
Series1->Repaint();
}
}
//---------------------------------------------------------------------------
問題の部分
Unit1.cpp
// 項目名の変更
Chart1->Legend->LegendStyle = lsSeries;
Chart1->Series[0]->Name = L"XXX";
Chart1->Series[1]->Name = L"YYY";
項目名をもともとの「Series1」から「XXX」へ変更している。
それにより、下記の実行がエラーになるようだ (Series1が見えなくなる?)。
int index = Series1->Clicked(X, Y);
Series1を明示しない下記でも同じエラーとなった。
int index = Chart1->Series[0]->Clicked(X, Y);
とりあえずの対策
良い方法ではないが、下記のように一時的にSeries[0]->Nameをデフォルトにすることで、エラーは回避できる。
Unit1.cpp
void __fastcall TForm1::Chart1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
int X, int Y)
{
Chart1->Series[0]->Name = L"Series1"; // アドレス読取り違反の回避のため、デフォルトの名前に一旦戻す
int index = Series1->Clicked(X, Y);
if (index != -1) {
Chart1->Canvas->TextOutW(X+15, Y, Series1->ValueMarkText[index]);
} else {
Series1->Repaint();
}
Chart1->Series[0]->Name = L"XXX"; // FormShow時の名前に戻す
}