LoginSignup
1
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-09-06
動作環境
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の値変更中にイベントが連発はする。
(これが許容できるかどうかはイベントの内容によるだろう)

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