在组件的OnKeyDown、OnKeyUp 、OnMouseDown和OnMouseUp等事件的处理过程中,有一个TShiftState类型的变量Shift ,
TShiftState类型定义如下:
1
type
TShiftState
=
set
of
(ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble);
所以根据Shift的值就可以判断当键盘上的键按下时Shift 、Alt和Ctrl键的状态,或者按下鼠标左键、鼠标右键、鼠标中键、任意按键双击时的状态。
下面的例程说明了如何检测Shift、Alt和Ctrl 键是否按下。
通过菜单File | New Application 创建一个新的工程,在窗体中添加一个StatusBar组件,并在状态栏编辑器中为其添加6 个面板。
然后为窗体Form1添加OnKeyDown 、OnKeyUp 、OnMouseDown和OnMouseUp等事件的处理过程如下:
OnKeyDown事件:
1
procedure
TForm1.FormKeyDown(Sender: TObject;
var
Key: Word; Shift: TShiftState);
2 begin
3 if Shift >= [ssShift] then { 如果按下了Shift键则在第一个面板上显示Shift }
4 StatusBar1.Panels[ 0 ].Text: = ' Shift ' ;
5
6 if Shift >= [ssAlt] then { 如果按下了Alt键则在第二个面板上显示Alt }
7 StatusBar1.Panels[ 1 ].Text: = ' Alt ' ;
8
9 if Shift >= [ssCtrl] then { 如果按下了C t r l 键则在第三个面板上显示Ctrl }
10 StatusBar1.Panels[ 2 ].Text: = ' Ctrl ' ;
11
12 end ;
2 begin
3 if Shift >= [ssShift] then { 如果按下了Shift键则在第一个面板上显示Shift }
4 StatusBar1.Panels[ 0 ].Text: = ' Shift ' ;
5
6 if Shift >= [ssAlt] then { 如果按下了Alt键则在第二个面板上显示Alt }
7 StatusBar1.Panels[ 1 ].Text: = ' Alt ' ;
8
9 if Shift >= [ssCtrl] then { 如果按下了C t r l 键则在第三个面板上显示Ctrl }
10 StatusBar1.Panels[ 2 ].Text: = ' Ctrl ' ;
11
12 end ;
OnKeyUp事件:
1
procedure
TForm1.FormKeyUp(Sender: TObject;
var
Key: Word; Shift: TShiftState);
2 begin
3 { 在Shift、Alt 和Ctrl键弹起时清除状态栏中相应面板上的内容 }
4 if not (Shift >= [ssShift]) then
5 StatusBar1.Panels[ 0 ].Text: = ' ' ;
6
7 if not (Shift >= [ssAlt]) then
8 StatusBar1.Panels[ 1 ].Text: = ' ' ;
9
10 if not (Shift >= [ssCtrl]) then
11 StatusBar1.Panels[ 2 ].Text: = ' ' ;
12 end ;
13
2 begin
3 { 在Shift、Alt 和Ctrl键弹起时清除状态栏中相应面板上的内容 }
4 if not (Shift >= [ssShift]) then
5 StatusBar1.Panels[ 0 ].Text: = ' ' ;
6
7 if not (Shift >= [ssAlt]) then
8 StatusBar1.Panels[ 1 ].Text: = ' ' ;
9
10 if not (Shift >= [ssCtrl]) then
11 StatusBar1.Panels[ 2 ].Text: = ' ' ;
12 end ;
13
OnMouseDown事件:
1
procedure
TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
2 begin
3
4 if Shift >= [ssLeft] then { 按下了左键则在第四个面板上显示left }
5 Statusbar1.Panels[ 3 ].Text: = ' left ' ;
6
7 if Shift >= [ssMiddle] then { 如果按下了中键则在第五个面板上显示Middle }
8 StatusBar1.Panels[ 4 ].Text: = ' Middle ' ;
9
10 if Shift >= [ssDouble] then { 如果是双击则在第六个面板上显示Double }
11 StatusBar1.Panels[ 5 ].Text: = ' Double ' ;
12 end ;
13
2 begin
3
4 if Shift >= [ssLeft] then { 按下了左键则在第四个面板上显示left }
5 Statusbar1.Panels[ 3 ].Text: = ' left ' ;
6
7 if Shift >= [ssMiddle] then { 如果按下了中键则在第五个面板上显示Middle }
8 StatusBar1.Panels[ 4 ].Text: = ' Middle ' ;
9
10 if Shift >= [ssDouble] then { 如果是双击则在第六个面板上显示Double }
11 StatusBar1.Panels[ 5 ].Text: = ' Double ' ;
12 end ;
13
OnMouseUp事件:
1
procedure
TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
2 begin
3 { 在鼠标按键弹起时清除状态栏中相应面板上的内容 }
4 if not (Shift >= [ssLeft]) then
5 StatusBar1.Panels[ 3 ].Text: = ' ' ;
6
7 if not (Shift >= [ssMiddle]) then
8 StatusBar1.Panels[ 4 ].Text: = ' ' ;
9
10 if not (Shift >= [ssDouble]) then
11 StatusBar1.Panels[ 5 ].Text: = ' ' ;
12 end ;
2 begin
3 { 在鼠标按键弹起时清除状态栏中相应面板上的内容 }
4 if not (Shift >= [ssLeft]) then
5 StatusBar1.Panels[ 3 ].Text: = ' ' ;
6
7 if not (Shift >= [ssMiddle]) then
8 StatusBar1.Panels[ 4 ].Text: = ' ' ;
9
10 if not (Shift >= [ssDouble]) then
11 StatusBar1.Panels[ 5 ].Text: = ' ' ;
12 end ;
程序运行后,读者可以尝试按下Shift、Alt 和Ctrl键,单击或双击鼠标左键、中键和右键,观察状态栏上各面板的显示。