LoginSignup
0
1

More than 5 years have passed since last update.

C++ Builder XE4 > TeeChart > マウスクリックにて「モジュール 'XXX.exe'のアドレス XXXでアドレスXXXに対する読み取り違反がおきました。」の発生条件と、とりあえずの対策

Last updated at Posted at 2018-10-18
動作環境
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();
    }
}
//---------------------------------------------------------------------------

2018-10-18_17h01_21.png

問題の部分

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時の名前に戻す

}

2018-10-18_17h25_06.png

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1