動的配列の任意の要素を複数選択するには?

解決


Cappuccino  2007-03-07 05:01:13  No: 135650

Win98, VB6を使用しています。
フォーム上に動的配列のラベルコントロールを2次元で
並べており、マスメになっています。
「ある」マスからドラッグを開始し、真っ直ぐにとなりあった
マスを複数選択します。
最終的にドラッグしたマスは「どのマスからどのマスまでか」を
得るようにしたいのです。
現時点では、動的配列を2次元で表示するところまで出来ましたが、
その先がわかりません。
どなたかにお答えいただければ幸いです。
よろしくお願いいたします。


魔界の仮面弁士  2007-03-07 05:40:01  No: 135651

> 最終的にドラッグしたマスは「どのマスからどのマスまでか」を
得るようにしたいのです。
開始マスは「MouseDown イベントが発生したラベル」で良いかと。
終了マスはMouseUp イベント取得時に、x, y 座標から算出するとか。

あるいは、複数 Label での升目表示に拘らないのであれば、
使用するコントロールを 1 つの MSFlexGrid に変更し、
ドラッグ部分については MouseDown/Up イベントで
MSFlexGrid1.MouseRow/Col を取得する形にするのも手かと。


Cappuccino  2007-03-07 08:13:25  No: 135652

魔界の仮面弁士  様
> 開始マスは「MouseDown イベントが発生したラベル」で良いかと。
> 終了マスはMouseUp イベント取得時に、x, y 座標から算出するとか。
なるほど、簡潔なアイデアで感心致しました。

ところで、ドラッグしているマウスカーソルがマスに入った時、
マスの色を変えてやりたいのですが「MouseMove」で逐次座標の
計算をして判断をしてやらないといけないのでしょうか?
簡単な方法があれば、アドバイスをお願い致します。


魔界の仮面弁士  2007-03-07 08:54:51  No: 135653

> ドラッグしているマウスカーソルがマスに入った時、
> マスの色を変えてやりたいのですが

これで良いのかな。

Option Explicit

Private Sub Form_Load()
    Dim L As Label
    '本来は、デザイン時に設定しておけば十分
    For Each L In Label1
        L.OLEDropMode = vbOLEDropManual
    Next
End Sub

Private Sub Label1_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
    Label1(Index).OLEDrag
    Screen.MousePointer = MousePointerConstants.vbArrow
End Sub

Private Sub Label1_OLEDragDrop(Index As Integer, Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
    Label1(Index).BackColor = vbButtonFace
End Sub

Private Sub Label1_OLEDragOver(Index As Integer, Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single, State As Integer)
    If State = vbLeave Then
        Label1(Index).BackColor = vbButtonFace
    Else
        Label1(Index).BackColor = vbRed
    End If
End Sub

Private Sub Label1_OLEGiveFeedback(Index As Integer, Effect As Long, DefaultCursors As Boolean)
    DefaultCursors = False
End Sub

Private Sub Label1_OLEStartDrag(Index As Integer, Data As DataObject, AllowedEffects As Long)
    Data.SetData CStr(Index), vbCFText
    AllowedEffects = vbDropEffectCopy
End Sub


Cappuccino  2007-03-07 16:55:45  No: 135654

魔界の仮面弁士  様

おかげさまで、やりたいことが出来そうです。
どうもありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加