(追記 2017/09/06)
下記に記載事項は「ビルド環境」「OS環境」により再現しないかもしれません。
環境が変わった時点でバグとなる可能性が考えられるため、お薦めの方法ではありません。
なんらかの参考にはなるかもしれないため、記事としては残しておきます。
C++ Builder XE4
Windows 7 Pro (32bit)
スライダーとして使用を検討しているTTrackBar。
OnChange()イベントで処理をしようとすると、スライダー変更中の全てのイベントで処理が実行されてしまう。
例として、値を20から46に変更した場合、以下のように途中の値のイベントも発生してしまう。
最後の46が三つ繰り返されるところが、値の変更を終了した時点。
この振る舞いを利用して、変更終了を検知するのはどうだろうか。
変更終了の検知 v0.1
code
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
static int pre = -1;
if (pre == TrackBar1->Position) {
Memo1->Lines->Add("End change");
}
pre = TrackBar1->Position;
String val = IntToStr(TrackBar1->Position);
Memo1->Lines->Add(val);
}
//---------------------------------------------------------------------------
二回実行されるが、変更中のすべてのイベントを拾うよりは「まし」ではある。
補足
マウスでTTrackBarの位置変更時は同じ値が3つ続くことがある。
キーボードでTTrackBarの位置変更時は同じ値が2つ続くことがある。
注意事項
OnChangeイベントにて同じ値が繰返し出る現象は、記事の実行環境(C++ Builder XE4)でビルドして、実行をした場合に確認している。
異なるIDEのバージョンや異なるOSでの動作については未確認である。上記に基づく実装コードを使用していると、IDEバージョンアップ時やOS変更時に「はまる」かもしれない。