TrackBarをMouseUpした時のイベント取得

解決


kyouichi  2011-10-09 00:32:58  No: 41002

D6_Personal/OS=Win XP
お世話になります。TrackBarもしくはScrollBarを使い、ある変数を増減し終わった時点(MouseUpの時点)で計算+結果表示をさせたいのですがMouseUpに相当するイベントが取得できません。何か掴む方法はあるのでしょうか?  TrackBarの各種イベントにBeepを入れて調べたのですがわかりませんでした。初歩中の初歩の質問だと思いますがよろしくお願いします。


D  2011-10-09 02:14:47  No: 41003

TTrackBarやTScrollBarを継承してMouseUpイベントをpublicなりpublishedなりにして使うのがまっとうな方法だと思いますが、OnChangeイベント中でマウスの左ボタンが押されているかを判定して押されていなかったら計算処理を行うという簡易な方法もあります。

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  if not(BOOL(Hi(GetAsyncKeyState(VK_LBUTTON)))) then
  begin
    //計算+結果表示
  end;
end;

OnChangeイベントはトラックバーのつまみを放した時にも(2回)起きるのでこれでいけます。

TScrollBarの場合はOnChangeイベントではなくOnScrollイベントがTrackBarのOnChangeイベントと同じ動作になるようです。
ちなみにつまみをの部分を触って放した時は2回、それ以外の場所を触って放した時は1回とイベントの起きる回数が違っています。
TScrollBarのOnChangeイベントはマウスボタンを離した時には起きませんでした。


kyouichi  2011-10-09 03:03:11  No: 41004

D様、お答えいただきありがとうございました。
早速試してみたところTrackBarだけをいじる限り正しく動きました。
しかし現在作っているプログラムではTrackBarのPositionは他の変数と連携しているため他の変数が変わるたびにPositionが変わってその度にイベントが発生することがわかりました。やはりMouseUpがほしいところです。
  
>>TTrackBarやTScrollBarを継承してMouseUpイベントをpublicなりpublishedなりにして使うのがまっとうな方法だと思いますが

とありますがかなり難しい課題でしょうか?  説明不足で申し訳ありませんでしたがよろしくお願いします。


D  2011-10-09 05:48:17  No: 41005

>他の変数が変わるたびにPositionが変わってその度にイベントが発生する
  変数が変わるときにTrackBarのPositionをセットしているということかな。
それならば計算処理をしてほしくないときにTrackBarのTagを1にセットしてOnChangeイベントの中でTagの値を見て処理を振り分けるという方法もありかと。

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  if (BOOL(Hi(GetAsyncKeyState(VK_LBUTTON)))) 
  or (TrackBar.Tag = 1)
  then
  begin
    TrackBar.Tag := 0;
    Exit;
  end;

  //計算+結果表示
end;

>とありますがかなり難しい課題でしょうか?
  難しくはないですが手間はかかります。

「コンポーネント」メニューの「コンポーネントの新規作成」を選択します。
出てきたダイアログの「上位クラス」で「TTrackBar [ComCtrls]」を選択します。
「クラス名」は「TMyTrackBar」とか「TMouseEventTrackBar」とかなんとか適当に。
「パレットページ名」はこのコンポーネントをインストールした後に表示されるパレットのページ名を選択しますが、後で「コンポーネント」メニューの「パレットの設定」で変更できるのでデフォルトの「Sample」のままで良いと思います。
「ユニットファイル名」はこの新規コンポーネントのソースファイルになります。
[OK]ボタンを押すとソースコードが表示されるので

type
  TMouseEventTrackBar = class(TTrackBar)
    private
      { Private 宣言 }
    protected
      { Protected 宣言 }
    public
      { Public 宣言 }
    published
      { Published 宣言 }
      property OnMouseUp;
    end;

というように必要なプロパティをpublished部に付け足して保存します。
MouseDownやMouseMoveのイベントも欲しければ同様にpublished部に付け足します。

「コンポーネント」メニューの「コンポーネントのインストール」を選択します。
出てきたダイアログに「既存のパッケージへ追加」と「新規パッケージに追加」のタブがありますが「新規パッケージに追加」の方が問題が起きたときに切り分けできて楽かなと思います。
「ユニットファイル名」には↑で保存したソースコードを指定します。
「パッケージファイル名」はコンポーネントのプロジェクトファイルのようなものです。
適当(あるいは適切)に名前をつけます。
[OK]ボタンを押すと「インストールするにはコンパイルしないとならない」とかなんとか言われるので言われるががままにします。

するとパレットのSampleタブの最後にトラックバーのアイコンが追加されているはずなのでそのトラックバーのアイコンをフォームに貼り付けてイベントの一覧にOnMouseUpがあれば成功、と。

ざっとこんな感じです。

あとつまみの部分以外を触って放した時にもOnMouseUpイベントは起きるのでその対策が必要ならつまみの部分のRectを取得しないといけないので手間がかかります。
その対策の必要がなければこのままでOKかと思います。
対策が必要なら以下を参考にどうぞ。

http://drang.s4.xrea.com/program/lib/myTrackBar.pas

思いつきの命名だったりするのでその辺は自分なりに変更するなどして下さい。


kyouichi  2011-10-09 20:05:47  No: 41006

D様、ご親切にご指導いただきありがとうございました。
お蔭様でご回答いただいた「if (BOOL(Hi(GetAsyncKeyState(VK_LBUTTON)))) 
  or (TrackBar.Tag = 1)」で企図する結果が得られましたので大変ありがたく感謝しております。これからいくつかのTrackBarに実装していきたいと思います。  実はこのコードは私には高度すぎて理解はできませんが結果オーライで使わせていただきます。
TMouseEventTrackBarに関してはますますかなりハードルが高いので別途テストコードを使って挙動を勉強したいと思います。  大変ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加