投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/11/4 10:40:13
> Dim dir As Map.Dir
VB には「Dir 関数」が標準で組み込まれているので、別の変数名にした方が良いかと思います。
また、lblMovingUp と lblMovingUp が混在している点も気になりますし、
If/ElseIf 句が lblMovingLeftthen / lblMovingRightthen なのに、
Handles 句が lblMovingLeft / lblMovingRight なのも不自然ですね。


> 多:1のイベント処理で、通常は…
自分ならこう書きます。

Private Direction As New Dictionary(Of Object, Map.Dir)()
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
 Direction.Add(lblMovingUp, Map.Dir.Up)
 Direction.Add(lblMovingDown, Map.Dir.Down)
 Direction.Add(lblMovingLeft, Map.Dir.Left)
 Direction.Add(lblMovingRight, Map.Dir.Right)
End Sub
Private Sub lblMoving_Click(sender As Object, e As EventArgs) Handles lblMovingUp.Click, lblMovingDown.Click, lblMovingLeft.Click, lblMovingRight.Click
    m.Map.Map_Move(Direction:=Direction(sender))
End Sub


> …と言う感じには書けないものでしょうか…
強いて言えば次のような書き方がありますが、参照の一致を見るのであれば、
Dictionary 等を使うか、If 判定した方が素直だと思います。

Select Case True
    Case sender Is lblMovingUp
        dir = Map.Dir.Up
    Case sender Is lblMovingDown
        dir = Map.Dir.Down
End Select
' https://github.com/dotnet/vblang/issues/568 


> タグネームを付けて処理させて例(これはエラーは出ず、期待通りに処理する)
Tag プロパティは Object 型のプロパティです。
デザイン時には文字列しかセットできませんが、実際には任意のデータを格納できますから、
Load イベントなどで最初から Map.Dir 型の値を Tag にセットしておけば、下記のように書けますよ。

m.Map.Map_Move(Direction:=sender.Tag)
'あるいは 
m.Map.Map_Move(Direction:=DirectCast(sender, Control).Tag)