2009-03-28 8 views
1

Delphiでは、フォームの右側にスクロールバーコンポーネント(縦向き)を追加しました。マウスが動かずにボタンがまだ押されていることを検出するにはどうすればよいですか?

ユーザーがマウスでUpArrowまたはDownArrowボタンをクリックしたときにフォームのビューとスクロールバーのサムの位置を変更できるように、Scrollbar OnChangeイベントを追加しました。

しかし、OnChangeイベントは、矢印上でマウスボタンを最初に押すとトリガされるように見えます。

すべてのスクロールバーコントロールは、マウスを矢印の上に押したまま、コマンドを繰り返してスクロールを続けることに気付きました。この動作を実装したいと思います。

したがって、マウスが矢印の上にとどまっている間にユーザーがマウスを移動してマウスボタンを押し続けているかどうかを簡単に検出できますか?


結論。どういうわけか私のプロジェクトのスクロールバーの何かが壊れてしまった。 ScrollBarを削除してもう一度追加した後、問題はなくなりました。

これは私が解決するのに多くの時間を要した難しい問題の1つです。ご協力いただきありがとうございます。私はこの質問を閉じます。

答えて

4

OnScrollイベントを使用してください。

次のコードは、マウスがスクロールバーの矢印ボタンを押している間は、メモに 'xxx'を追加します。デルファイ6.

procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode; 
    var ScrollPos: Integer); 
begin 
    Memo1.Lines.Add('xxx'); 
end; 
+0

第OnScroll以降に変更されたが、同じことをし初期クリックを検出するためにOnChangeとして使用します。しかし、どちらも、イベントが続行されるべきであることを絶えず伝えていない彼らは最初のボタンを1回だけ処理します。私はスクロールを続けることができるようにマウスが押されたままであるかどうかを確認する必要があります – lkessler

+0

私のDelphi 6インストールで動作します。 –

+0

それを確認してくれてありがとう、Neil。あなたのテストはDelphi 2009でもうまくいきます。問題の原因につながったと思います。私が使用するコンポーネント(TElScrollBar)は、TScrollBarのように動作しないので、そのコンポーネントに問題があります。これについてはLMDにお問い合わせします。 – lkessler

3

自動繰り返しがTTIMERを有効にして、アクションを再実行する必要があるかどうかのOnTimer()イベントハンドラでチェックし、無効にすることです処理する通常の方法でテストタイマーではない場合サンプルコードが必要な場合は、SynEditコントロールで、ドラッグアンドドロップ操作の自動スクロールに同様の手法を使用したことを覚えているようです。

0

コンポーネントが探しているビヘイビアをカプセル化せず、利用可能なメソッドでビヘイビアーを簡単にシミュレートできない場合は、必要なもののほとんどを実行する最も近いコンポーネントを実際にサブクラス化し、 。

私はいくつか余分な仕事が関わっていることを知っていますが、実際にはより良い方法です。今Delphiで、私はサブクラス化コンポーネントは、余分な作業のビットだけでなく、フォーム設計用のIDEから使用することができるようにするために必要なことを思い出しているようだ、多分これはバージョン7

+0

特別な作業は必要ありません。(私はバージョン1.0からDelphiを使用しています) –

関連する問題