LoginSignup
1
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-09-06
動作環境
C++ Builder XE4

関連

処理と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

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

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

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

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