Visual Basic 6.0 使用者可用的事件和事件處理方式
更新:2007 年 11 月
如果您熟悉 Visual Basic 6.0 中的事件和事件處理,則 Visual Basic 2008 中的事件模型一開始可能會有些混淆,但最後會發現其實更容易使用且更加強大。
概念上的差異
在 Visual Basic 6.0 中,事件是專屬於特定物件,而且本身就具有事件處理程式碼。例如,在具有一個按鈕和一個功能表的表單上,各控制項都有專屬的 Click 事件,而您必須在各控制項的事件處理常式中撰寫程式碼,即使兩者所執行功能完全相同也一樣。
' Visual Basic 6.0
Private Sub HelpButton_Click()
HelpButton.Caption = "Help me!"
End Sub
Private Sub HelpMenu_Click()
HelpMenu.Caption = "Help me!"
End Sub
在 Visual Basic 2008 中,事件是透過委派 (Delegate) 與事件處理常式建立關聯,可讓您為多個物件建立單一事件處理常式。
Private Sub HelpButton_Click(ByVal sender As Object, ByVal e As _
System.EventArgs) Handles HelpButton.Click, HelpMenu.Click
sender.Text = "Help me!"
End Sub
在上述範例中,請注意事件宣告具有 Handles 子句,可定義將要處理的事件,在此範例中就是 HelpButton 和 HelpMenu 物件的 Click 事件。物件和事件不需要是相同的型別,例如,您可能具有單一事件處理常式,可處理按鈕的 Click 事件、文字方塊的 DoubleClick,以及計時器的 Tick 事件。
也請注意,事件宣告包含兩個參數:ByVal sender As Object 和 ByVal e As System.EventArgs。第一個參數 sender 提供引發事件的物件參考。第二個參數 e 傳遞的是指定給要處理之事件的物件。透過參考物件的屬性 (有時是方法),您可以取得一些資訊,例如:滑鼠事件 (Mouse Event) 的滑鼠位置,或是拖放事件中傳送的資料。
在下列範例中,MouseDown 事件處理常式會使用 sender 參數,判斷產生事件的物件型別、物件是否為 PictureBox,以及是否使用 e 參數將標籤 (Label) 移至發生點選動作的位置。若要複製這個範例,將兩個 PictureBox 控制項和 Label 控制項加入至表單。
Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As _
System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown, _
PictureBox1.MouseDown, PictureBox2.MouseDown
If TypeOf sender Is PictureBox Then
Label1.Location = sender.Location + e.Location
Else
MsgBox("Please click a picture")
End If
End Sub
通常每個事件會產生與第二個參數的事件物件型別不同的事件處理常式。有些事件處理常式,例如用於 MouseDown 和 MouseUp 事件的事件處理常式,則具有與第二個參數相同的物件型別 (MouseEventArgs)。針對這些類型的事件,您可使用相同的事件處理常式來處理這兩種事件。
針對傳遞不同事件物件型別的事件,您必須建立個別的事件處理常式。例如,TextBox 控制項的 TextChanged 事件會傳遞泛型 EventArgs 事件物件,而 MouseDown 事件會傳遞更特定的 MouseEventArgs 事件物件。MouseEventArgs 物件包含滑鼠事件 (例如 Button) 的特定屬性,可判斷按下的滑鼠按鈕,這些屬性並不會套用至 TextBox 控制項,如果嘗試參考這些屬性,將會造成錯誤。
除了事件處理的概念性差異以外,各種物件中部分事件的名稱和行為在 Visual Basic 2008 中會不相同。如需詳細資訊,請參閱 Visual Basic 6.0 使用者可用的 Windows Form 控制項。