第十二章 事件 12-1 KeyPress 12-2 KeyDown及KeyUp 第十二章 事件 12-1 KeyPress 12-2 KeyDown及KeyUp 12-3 MouseDown、MouseUp及 MouseMove 12-4 DragOver與DragDrop
在本章之前,本書常用的事件為滑鼠的Click事件及表單的Active及Create事件, 本章的重點則是集中介紹一些鍵盤的 KeyPress、KeyDown及KeyUp事件、滑鼠的MouseDown、MouseUp、MouseMove、DragOver(拖曳且越過)及DragDrop(拖曳且放置)等常用事件,學習本章之後,將有助於提昇電玩控制、影像繪圖等軟體的靈活度。
12-1 KeyPress 當使用者按一下鍵盤的一般字元、倒退鍵及Enter鍵等具有ASCII碼的鍵時,都會產生KeyPress事件,電腦並傳回按鍵的字元。KeyPress的語法如下: procedure TForm1.來源物件 KeyPress(Sender: TObject; var Key: Char); 以上語法說明如下: Key 傳回使用者所按的字元。
範例12-1a 示範KeyPress事件的用法。
12-2 KeyDown及KeyUp 上一節的KeyPress僅能傳回一般字元、倒退鍵及Enter鍵,對於一些功能鍵、移位鍵及按鍵的同時是否按下 、 及 鍵則沒有反應。若要偵測以上特殊鍵功能,或深入研究到底是鍵盤被按下去、或彈上來的特殊時點,則可使用本節的KeyDown及KeyUp,KeyDown與KeyUp的語法完全相同,如下所示: //KeyDown procedure TForm1.來源物件KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); //TShiftState 是集合型態 //KeyUp procedure TForm1.來源物件KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); 以上語法說明如下: Key 鍵盤各鍵的Unicode。
傳回按鍵的同時是否也按Shift 、Ctrl 或 Alt鍵,Shift值如下表,其型態是集合。 以下範例可印出使用者所按鍵盤的Unicode、Shift參數及回應使用者按鍵的同時是否按下 Shift 、 Ctrl 及 Alt 鍵。 Shift值 按下之鍵 ssShift Shift鍵 ssCtrl Ctrl鍵 ssAlt Alt鍵
範例12-2a 示範KeyDown事件。
範例12-2b 請設計一個踩影子遊戲,遊戲規則如下: 使用者用鍵盤的上、下、左、右 鍵及加速鍵操控螢幕的鐵錘,錘打依亂數自由移動的笑臉圖案,當鐵錘打到笑臉時印出使用者按鍵次數及使用時間。 程式說明: 本例使用表單的KeyDown事件,表單的KeyDown較為特殊,其使用前提是表單不得含有任何具有KeyDown事件的元件,例如Edit、Button及Memo等元件。
範例12-2c 同上範例,但採用炮彈發射型,笑臉左右移動、鐵錘向上發射,並可由使用者加速、減速、向左及向右移動。
12-3 MouseDown、MouseUp及MouseMove 滑鼠的最常用事件為Click與DblClick,若要進一步得知是滑鼠的何鍵被按、按鍵的滑鼠指標座標及按鍵的同時是否也按鍵盤的 、及 ,則應使用本節的MouseDown、MouseUp或MouseMove。其中MouseDown是任意滑鼠鍵被按均產生此事件,MouseUp則是產生於滑鼠任意鍵被按下去且彈上來時,MouseMove則只要使用者將滑鼠移過某物件上方時,該物件即產生MouseMove事件,以上三事件語法如下: //MouseDown procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); //TShiftState 是集合型態 //MouseUp procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); //MouseMove procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
並非所有物件的MouseDown與MouseUp皆有Button參數,只有少 以上語法說明如下: 1. Button參數 並非所有物件的MouseDown與MouseUp皆有Button參數,只有少 數的物件有此參數,例如Form與Image。此參數可傳回滑鼠的那 一鍵被按,其型態是TMouseButton的列舉型態,傳回值如下表。 2. Shift參數 Shift是一種集合型態,傳回滑鼠被按下或放開時鍵盤 、 或 鍵被按的情形,但有些物件沒有Button參數,故此參數亦傳回滑鼠的何鍵被按一下或放開,Shift參數值如下表: 3. X,Y 傳回滑鼠按鍵被按、或放開的座標位置 Button的值 被按下或放開之滑鼠鍵 mbLeft 左鍵 mbRight 右鍵 mbMiddle 中間鍵 Shift的值 按鍵情形 ssShift 鍵盤 Shift 被按 ssCtrl 鍵盤 Ctrl 被按 ssAlt 鍵盤 Alt 被按 ssLeft 滑鼠左鍵被按 ssMiddle 滑鼠中間鍵被按 ssRight 滑鼠右鍵被按
範例12-3b 請設計一個簡易繪圖程式,其功能如下: 1. 使用滑鼠當作畫筆。 2. 滑鼠按鍵的左右鍵分別代表紅色與綠色 3. 鍵盤的 Shift 、 Ctrl 及 Alt 分別代表筆寬為1、2及4
12-4 DragOver與DragDrop DragOver是將某物件拖曳至另一物件上方的事件,DragDrop是將某物件拖曳至另一物件上方並放下的事件,兩者都牽涉兩個物件的互動,其語法如下: //DragDrop procedure TForm1.目的物件DragDrop(Sender, Source: TObject; X, Y: Integer); //DragOver procedure TForm1.目的物件DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); 以上語法說明如下: 1. 目的物件 目的物件可為表單或任意元件。 2. Source 其型態為物件,代表拖曳的來源物件,請看範例說明。
傳回來源物件進入或離開目的物件,型態為TDragState的列舉型態,其值如下表: 4.X,Y 傳回滑鼠於目的物件的座標。 DragOver與DragDrop的產生有兩種模式,其一是手動模式(dm Manual),另一是自動模式(dmAutomatic),使用方式是由DragMode屬性設定,預設值為dmManual。手動模式必須由程式設計者使用Drag方法拖曳,本書暫不予介紹。本書僅介紹自動模式,當程式設計者將DragMode設為dmAutomatic時,使用者即可拖曳物件。其次,拖曳的過程若要顯示被拖曳的物件,則應使用DragOver事件顯示其過程。最後,放下時所要處理的事則交由DragDrop事件處理,請看以下範例。 State值 意義 dsDragLeave 離開 dsDragMove 進入
範例12-4a 示範DragOver的用法。
範例12-4b 請寫一個兒童語文測驗程式,題目要求如下: 1.由使用者拖曳圖片至相對的文字上方放下 2.當圖片接近文字時,文字出現“Hello”問候語 3.當圖片離開文字時,文字出現“Bye”問候語 4.若圖片與文字相符,則圖片消失,否則電腦發出Beep聲,使用者可繼續尋找對應的文字。 程式說明: if(Source=img.Chip) 本例表單上有兩個物件可被拖曳,當目的物件 (表單)有來源物件DragOver時,應使用Source判斷來源物件為何。本例使用if敘述判斷來源物件,程式較好理解但較冗長,下一範例可改善此缺點。
範例12-4c 請設計一個3×3的智慧方塊,使用者可將依亂數排列的小方塊重新排列。 程式說明: (Source as TEdit).Left:=x ; 上例使用if敘述判斷Source的來源,但來源物件多時,程式就顯得冗長,本例採用上式直接設定來源物件的屬性,才能簡化程式的撰寫。
範例12-4d 同上範例,但是幫使用者尋找最佳的落點,就如同Windows的接龍遊戲,使用者只要將紙牌丟在目的地附近,電腦會幫使用者尋找恰當的落點。 程式說明: 1. 本例定義每一物件的左上角座標如下: 2.當拖曳物件時,滑鼠當時的座標(X,Y)即與以上9個位置比較,何者距離最短,則是該物件的落點,並將該物件移至正確的位置。 (65,65) (130,65) (195,65) (65,130) (130,130) (195,130) (65,185) (130,195) (195,195)
習題 同範例12-4d,但應預防使用者跨方塊拖曳方塊,也就是只能拖曳方塊至緊臨的空白位置,而不能跨過方塊。