動作環境
C++ Builder XE4
症状
Unit1.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ComCtrls.hpp>
#include "editex.h"
#include "numedit.h"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE で管理されるコンポーネント
TTrackBar *TrackBar1;
TEdit *Edit1;
void __fastcall FormShow(TObject *Sender);
void __fastcall TrackBar1Change(TObject *Sender);
private: // ユーザー宣言
public: // ユーザー宣言
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "editex"
#pragma link "numedit"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
TrackBar1->Min = 30; // (1)
TrackBar1->Max = 10000;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
Edit1->Text = String(TrackBar1->Position);
}
//---------------------------------------------------------------------------
上記のコードにてTrackBar1のMinプロパティ値は30にはならない。
- 前提条件
- フォームデザインで以下となっている
- Min = 0
- Max = 10
- フォームデザインで以下となっている
理由
Maxが10なので、Minを先に30にしようとすると代入が失敗する。
try, catchでもエラーとはならない。
先にMaxを設定して、Minを設定すると代入が成功する。
void __fastcall TForm1::FormShow(TObject *Sender)
{
//TrackBar1->Min = 30; // (1)
TrackBar1->Max = 10000;
TrackBar1->Min = 30; // (2)
}
しかしながら、(Min, Max) = (0, 10)
の設定に対して、(-10, -5)
を設定する場合は「先にMaxを設定して」は失敗する。
きちんと実装するには以下のような考慮が必要かもしれない(詳細は未確認)
- if setMax < defMin # 例 (0, 10)に対して(-10, -5)設定
- Min = setMin
- Max = setMax
- if setMin > defMax # 例 (0, 10)に対して(30, 10000)設定
- Max = setMax
- Min = setMin
- etc
(追記)
C > Min, Maxどちらからセットするのが良いかの調査
にて確認した。
TeeChartのグラフ
TeeChartのグラフでも同じ問題に遭遇したことがある。