LoginSignup
1
1

More than 5 years have passed since last update.

[廃版] C++ Builder > TTrackBar > 値変更中にOnChange()が繰返し実行される > 変更終了の検知案

Last updated at Posted at 2017-09-05

(追記 2017/09/06)

下記に記載事項は「ビルド環境」「OS環境」により再現しないかもしれません。
環境が変わった時点でバグとなる可能性が考えられるため、お薦めの方法ではありません。
なんらかの参考にはなるかもしれないため、記事としては残しておきます。


動作環境
C++ Builder XE4
Windows 7 Pro (32bit)

スライダーとして使用を検討しているTTrackBar。

OnChange()イベントで処理をしようとすると、スライダー変更中の全てのイベントで処理が実行されてしまう。

例として、値を20から46に変更した場合、以下のように途中の値のイベントも発生してしまう。

qiita.png

最後の46が三つ繰り返されるところが、値の変更を終了した時点。
この振る舞いを利用して、変更終了を検知するのはどうだろうか。

変更終了の検知 v0.1

code

Unit1.cpp
//---------------------------------------------------------------------------

#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);
}
//---------------------------------------------------------------------------

qiita.png

二回実行されるが、変更中のすべてのイベントを拾うよりは「まし」ではある。

補足

マウスでTTrackBarの位置変更時は同じ値が3つ続くことがある。
キーボードでTTrackBarの位置変更時は同じ値が2つ続くことがある。

注意事項

OnChangeイベントにて同じ値が繰返し出る現象は、記事の実行環境(C++ Builder XE4)でビルドして、実行をした場合に確認している。

異なるIDEのバージョンや異なるOSでの動作については未確認である。上記に基づく実装コードを使用していると、IDEバージョンアップ時やOS変更時に「はまる」かもしれない。

1
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
1
1