2017-02-03 21 views
-1

は、VCLを作成し、アプリケーションとメインフォームのOnMouseDownイベントハンドラの書き込みにフォーム:CTRLキーのみが押されたときのシフト値?

procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
    if Shift = [ssCtrl] then 
    ShowMessage('CTRL pressed'); 
end; 

次にアプリ、押しを実行していない他の修飾キーで、Ctrlキーを押しながら、フォームをクリックしてください。メッセージは表示されません。なぜ今なのか?

Shiftの場合、CTRLキーだけを押した場合の値はどれですか?

+2

なぜあなたはデバッガで「Shift」を評価してこれに答えなかったのですか? Ctrlキーの1つだけが押されても、Shiftキーの内容が[ssCtrl]ではないことがすぐに分かりました。 – MartynA

答えて

5

TShiftStateタイプは次のように定義されています

type 
    TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble, 
    ssTouch, ssPen, ssCommand, ssHorizontal); 

あなたが見ることができるように、あるだけの修飾キーの状態よりも多くの情報が含まれています。

あなたはCTRLキーを押しながら、フォームをクリックすると、Shiftがこの値を持っている:[ssCtrl,ssLeft]。これは、のCTRLキーが押されていて、左のマウスボタンが押されていることを示しています。この情報は、デバッガを使用して簡単に取得できることに注意してください。実行中にデバッグを使用してプログラムの状態を検査する方法を学ぶことは、非常に重要なスキルです。

修飾キーの状態をテストする場合は、修飾キーではないすべてをマスクする必要があります。交差点を設定した*オペレータを使用してください。これにより、関心のある列挙値だけに情報をカットすることができます。

if Shift*[ssShift, ssAlt, ssCtrl] = [ssCtrl] then 
    .... 
+0

華麗!ジェリードッジの答えは正しかったですが、これはよりエレガントです。 – user1580348

+0

いいえ、Jerryの答えは間違っています。 –

+0

なぜ彼は間違っていますか? – user1580348

1

TShiftStateは、複数の値がある可能性があることを意味する列挙型セットです。 if Shift = [ssCtrl]を実行するときは、が正確にであるかどうかを確認しています。しかし、他の価値があるかもしれません。だからではなく、

、次の操作を行います。

if ssCtrl in Shift then 
    ... 
+0

これは 'Ctrl'と' Shift'の両方の修飾キーを押したままにすると 'True'になります。しかし、問題は「CTRLキーだけが押された場合、Shiftはどのような値を持っていますか? – user1580348

+0

@ user1580348あなたはすでに正しいと思います。問題は、あなたの小切手をどうやってやっていたかでした。 –

+0

@user - もちろんssCtrlです。しかし、あなたがフォームをクリックすると言う問題では、それはもはや*コントロールキーだけではありません。あなたの質問は矛盾しています。 –

関連する問題