C++ Builder > TTrackBar と TEdit > 値の同期 > { TTrackBar:OnChange | TEdit:OnExit | TEdit:OnKeyDown } > TTimer使用

```txt:動作環境
C++ Builder XE4
```

### 関連

- [[廃版] C++ Builder > TTrackBar と TEdit > 値の同期 > TTrackBar:OnChange | TEdit:OnExit](http://qiita.com/7of9/items/45b89da2df61425a051d)

- [C++ Builder > TTrackBar > 値変更中にOnChange()が繰返し実行される > TTimer利用によるOnChange回数の緩和](http://qiita.com/7of9/items/d4c63ea0f2c09c3762fb)

### 処理とcode

- TTrackBarの値とTEditの値を同期する
- それぞれの変更時に特定の共通処理を行う

```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 <Vcl.ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TTrackBar *TrackBar1;
	TEdit *Edit1;
	TMemo *Memo1;
	TTimer *TimerTrackBarChange;
	void __fastcall TrackBar1Change(TObject *Sender);
	void __fastcall TimerTrackBarChangeTimer(TObject *Sender);
	void __fastcall Edit1Exit(TObject *Sender);
	void __fastcall Edit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
private:	// ユーザー宣言
	void __fastcall updateSetting(TObject *Sender);
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;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	TrackBar1->Min = 0;
	TrackBar1->Max = 100;
	TrackBar1->Frequency = 10;

	TimerTrackBarChange->Enabled = false;
	TimerTrackBarChange->Interval = 300; // msec

	Memo1->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
	if (TrackBar1->Focused() == false) { // 他のコンポーネントから変更された場合
		return;
	}

	if (TimerTrackBarChange->Enabled) {
		return;
	}

	TimerTrackBarChange->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TimerTrackBarChangeTimer(TObject *Sender)
{
	Edit1->Text = IntToStr(TrackBar1->Position);

	updateSetting(Sender); // 希望の処理

	TimerTrackBarChange->Enabled = false;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::updateSetting(TObject *Sender)
{
	TComponent *cmpPtr = (TComponent *)Sender;
	Memo1->Lines->Add(L"" + cmpPtr->Name + L": ["
		+ IntToStr(TrackBar1->Position)
		+ L"] "
		+ Now().FormatString(L"yyyy/mm/dd hh:nn:ss.zzz"));
}

void __fastcall TForm1::Edit1Exit(TObject *Sender)
{
	int val = StrToIntDef(Edit1->Text, -1);
	if (val < 0) {
		return;
	}

	TrackBar1->Position = val;
	updateSetting(Sender); // 希望の処理
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift)

{
	if (Key != VK_RETURN) {
		return;
	}

	int val = StrToIntDef(Edit1->Text, -1);
	if (val < 0) {
		return;
	}

	TrackBar1->Position = val;
	updateSetting(Sender); // 希望の処理
}
//---------------------------------------------------------------------------

```

### 結果

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/738f36bd-112b-4190-2723-8169aee9d018.png)


上記(1)-(4)において、それぞれ以下を実行している。

- TTrackBarの値を変更
- TEditにてReturnキー入力 (値の確定)
- TEditからフォーカスをはずす

(3)のところでTTrackBarイベントが二回発生しているが、300msec以上の空きになっている。