cppBuilder
#migrated

C++ Builder XE4, 10.2 Tokyo > TTrackBar と TTrackBar > 値の同期 > OnChange | Focused()時に処理

動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)

関連: C++ Builder > TTrackBar > 値変更中にOnChange()が繰返し実行される > 変更終了の検知案
関連: C++ Builder > TTrackBar と TEdit > 値の同期 > TTrackBar:OnChange | TEdit:OnExit

OnChangeイベントを用いた複数コンポーネントの値の同期について。

Focused()を使うという案を聞いた。

二つのTTrackBar のOnChangeで試してみた。

code

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>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE で管理されるコンポーネント
    TTrackBar *TrackBar1;
    TTrackBar *TrackBar2;
    TMemo *Memo1;
    void __fastcall TrackBar1Change(TObject *Sender);
    void __fastcall TrackBar2Change(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 resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------

static const bool kUseTrackBarFocued = false;

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    Memo1->Lines->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
    if (kUseTrackBarFocued && TrackBar1->Focused() == false) {
        return;
    }

    TrackBar2->Position = TrackBar1->Position;
    Memo1->Lines->Add(L"TrackBar1Change");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::TrackBar2Change(TObject *Sender)
{
    if (kUseTrackBarFocued && TrackBar2->Focused() == false) {
        return;
    }

    TrackBar1->Position = TrackBar2->Position;
    Memo1->Lines->Add(L"TrackBar2Change");
}
//---------------------------------------------------------------------------

Focused()不使用

kUseTrackBarFocued = false

qiita.png

  • (1)の部分: TrackBar1を変更
  • (2)の部分: TrackBar2を変更

再帰的にイベントが発生している。

Focused()使用

kUseTrackBarFocued = true

qiita.png

  • (1)の部分: TrackBar1を変更
  • (2)の部分: TrackBar2を変更

再帰的なイベント発生は抑止できた。
TrackBarの値変更中にイベントが連発はする。
(これが許容できるかどうかはイベントの内容によるだろう)