[リストへもどる]
一括表示

投稿時間:2004/04/06(Tue) 17:01
投稿者名:さくら餅
URL :
タイトル:
Lineコントロールでの悩み
まずは説明させて頂きます。

一つのフォームにチェックボックスが2個あると仮定します。
配列になっていて、それぞれ名前は以下の通りです。
Check1(1)
Check1(2)

Lineコントロールで作成したラインが10個あると仮定します。
同じく配列になっていてLine1(1)からLine1(10)まであります。

動作は以下の通りです。
Check1(1)をクリックした場合
チェックが入った時、Line1(1)からLine(5)の色が赤になります
チェックを外した時、Line1(1)からLine(5)の色が黒になります

Check1(2)をクリックした場合
チェックが入った時、Line1(6)からLine(10)の色が赤になります
チェックを外した時、Line1(6)からLine(10)の色が黒になります

以下は構文です
Private Sub Check1_Click(Index As Integer)

Dim I As Integer

'チェックを付けた時
    If Form1.Check1(Index).value = 1 Then
        For I = Index * 5 - 4 To Index * 5
            Form1.Line1(I).BorderColor = &HFF       'Line Color = Red
        Next I
    End If

'チェックを外した時
    If Form1.Check1(Index).value = 0 Then
        For I = Index * 5 - 4 To Index * 5
            Form1.Line1(I).BorderColor = &H80000008 'Line Color = Black
        Next I
    End If

End Sub

同フォームにはコマンドボタンを用意してあり、押した時に
Lineの数だけループさせ、赤い色になっているIndexを別配列に格納します。

ここまではよいのです。

本題です(前置き長くて申し訳ありませんでした)
この場合ですと当然ですが以下のパターンしか出ません。
Line1(1)〜Line1(5)だけ赤い色
Line1(6)〜Line1(10)だけ赤い色
Line1(1)〜Line1(10)全てが赤い色
Line1(1)〜Line1(10)全てが黒い色

たとえば2と7だけ赤くしたいということが出来ません。
Lineコントロールにはクリックイベントがありません。
この場合どのように対処すべきでしょうか?
チェックボックスとは別にコンボボックスを用意して
それのチェンジイベントからLineの色を変えるしかないのでしょうか?

チェックボタン*2、Line*10として説明させて頂きましたがですが
実はその数が10倍以上あるのです。
解りやすいようにそうさせて頂きました。

・・・解りにくい所御座いましたらご指摘ください。

投稿時間:2004/04/06(Tue) 18:38
投稿者名:ねろ
URL :
タイトル:
Re: Lineコントロールでの悩み
>Lineコントロールにはクリックイベントがありません
要するにラインの上をクリックした時に色が変われば
いいのでしょうか。
Lineコントロールの代わりにPictureコントロールを
使ったらいかがですか。
Lineコントロールでやりたい場合はLineコントロールをクリックした時に、
親のコンテナにはクリックイベントが起きますから、そのコンテナのMouseDown
イベントでXとYのポジションからどのLineがクリック
されたか計算することも出来ると思います。

投稿時間:2004/04/08(Thu) 11:17
投稿者名:さくら餅
URL :
タイトル:
Re^2: Lineコントロールでの悩み
実際にどのように使用するか、画像をUP致します。
http://www.geocities.co.jp/Milkyway-Orion/5196/LineControl.jpg

ごらんの通り斜め線があるためにPictureコントロールは使用できません。
説明不足で申し訳御座いませんでした。
同様にMouseDownイベントに対しても線が重なる部分があるために
使用できなくなります。

もうちょっといい案がないか自分で考えてみます。

> >Lineコントロールにはクリックイベントがありません
> 要するにラインの上をクリックした時に色が変われば
> いいのでしょうか。
> Lineコントロールの代わりにPictureコントロールを
> 使ったらいかがですか。
> Lineコントロールでやりたい場合はLineコントロールをクリックした時に、
> 親のコンテナにはクリックイベントが起きますから、そのコンテナのMouseDown
> イベントでXとYのポジションからどのLineがクリック
> されたか計算することも出来ると思います。

投稿時間:2004/04/08(Thu) 17:28
投稿者名:るしぇ
Eメール:
URL :
タイトル:
Re^3: Lineコントロールでの悩み
参考になれば…どうぞ。もともと高次方程式の概略を知るために書いたコード
なので点画ですが…直線ならLineでいいですよね。もっと簡単でいいコードに
して下さい。

' 必要コントロール PictureBox x1(picGraph) ,CommandButton x3(Command1,Command2,Command3)
Option Explicit

Private mStep As Double
Private mSpace As Integer
Private mFlag(44) As Boolean

Private Sub Command3_Click()
    Dim i As Long
    
    With Me.picGraph
        ' 線を引く
        picGraph.Line (0, 3)-(10, 9), RGB(255, 255, 0)
        ' 点を描画する
        PicturePSetChangeAll True
    End With

End Sub

Private Sub Form_Load()
    mStep = 0.3
    mSpace = 5
    picGraph.Scale (0, mSpace * 2 + mSpace)-(100, -(mSpace * 1 + mSpace))
    Me.picGraph.AutoRedraw = True
    Me.Show
    Command1_Click
End Sub

Private Sub Command1_Click()
    Dim i As Long
    
    ' 画面のクリア
    Me.picGraph.Cls
    ' 強制描画
    For i = 0 To UBound(mFlag)
        mFlag(i) = False
    Next
    PicturePSetChangeAll Not mFlag(0)
End Sub

Private Function Houteisiki(ByVal ValueX As Double, ByVal Mode As Integer) As Double
    With Me.picGraph
        Select Case Mode
        ' おまけ
        Case 1
            If ValueX >= 0 And ValueX <= 4 Then
                Houteisiki = 2 * ValueX - 2
            Else
                Houteisiki = 1 / 4 * ValueX + 5
            End If
        ' 1からの線
        Case 11
            Houteisiki = (mSpace / .ScaleWidth * 0) * ValueX + mSpace * 2
        Case 12
            Houteisiki = (mSpace / .ScaleWidth * -1) * ValueX + mSpace * 2
        Case 13
            Houteisiki = (mSpace / .ScaleWidth * -2) * ValueX + mSpace * 2
        Case 14
            Houteisiki = (mSpace / .ScaleWidth * -3) * ValueX + mSpace * 2
        ' 2からの線
        Case 21
            Houteisiki = (mSpace / .ScaleWidth * 1) * ValueX + mSpace * 1
        Case 22
            Houteisiki = (mSpace / .ScaleWidth * 0) * ValueX + mSpace * 1
        Case 23
            Houteisiki = (mSpace / .ScaleWidth * -1) * ValueX + mSpace * 1
        Case 24
            Houteisiki = (mSpace / .ScaleWidth * -2) * ValueX + mSpace * 1
        ' 3からの線
        Case 31
            Houteisiki = (mSpace / .ScaleWidth * 2) * ValueX + mSpace * 0
        Case 32
            Houteisiki = (mSpace / .ScaleWidth * 1) * ValueX + mSpace * 0
        Case 33
            Houteisiki = (mSpace / .ScaleWidth * 0) * ValueX + mSpace * 0
        Case 34
            Houteisiki = (mSpace / .ScaleWidth * -1) * ValueX + mSpace * 0
        ' 4からの線
        Case 41
            Houteisiki = (mSpace / .ScaleWidth * 3) * ValueX + mSpace * -1
        Case 42
            Houteisiki = (mSpace / .ScaleWidth * 2) * ValueX + mSpace * -1
        Case 43
            Houteisiki = (mSpace / .ScaleWidth * 1) * ValueX + mSpace * -1
        Case 44
            Houteisiki = (mSpace / .ScaleWidth * 0) * ValueX + mSpace * -1
                
        End Select
    End With
End Function

Private Sub picGraph_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim i As Integer
    
    With Me.picGraph
        For i = 0 To 44
            Select Case i
                Case 1, 11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44
                    ' 絶対値が一定範囲内の時に色変え
                    If Abs(Y - Houteisiki(X, i)) < Abs(.ScaleHeight) / 300 Then
                        PicturePSetChangeOneNo (i)
                    End If
                Case Else
            End Select
        Next
    End With
End Sub

Private Sub Command2_Click()
    Dim wColorFlag As Boolean
    Dim wChangeNo() As Integer
    Dim i As Integer
    Dim n As Integer
    
    wColorFlag = Not mFlag(11)
    
    ReDim wChangeNo(UBound(mFlag))
    For i = 0 To 44
        Select Case i
            Case 11, 12, 13, 14
                If mFlag(i) <> wColorFlag Then
                    wChangeNo(n) = i
                    n = n + 1
                End If
            Case Else
        End Select
    Next
    If n = 0 Then Exit Sub
    
    ReDim Preserve wChangeNo(n - 1)
    PicturePSetChangeNo wChangeNo

End Sub

Private Sub PicturePSetChangeAll(ByVal ColorFlag As Boolean)
    Dim wChangeNo() As Integer
    Dim i As Integer
    Dim n As Integer
    
    ReDim wChangeNo(UBound(mFlag))
    For i = 0 To 44
        Select Case i
            Case 1, 11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44
                If mFlag(i) <> ColorFlag Then
                    wChangeNo(n) = i
                    n = n + 1
                End If
            Case Else
        End Select
    Next
    If n = 0 Then Exit Sub
    
    ReDim Preserve wChangeNo(n - 1)
    PicturePSetChangeNo wChangeNo
End Sub

Private Sub PicturePSetChangeOneNo(ByVal ChangeNo As Integer)
    Dim wChangeNo(0) As Integer
    wChangeNo(0) = ChangeNo
    PicturePSetChangeNo wChangeNo
End Sub

Private Sub PicturePSetChangeNo(ByRef ChangeNo() As Integer)
    Dim wX1 As Double
    Dim wColors() As Long
    Dim n As Integer
    Dim i As Integer
    
    ' 描画色の設定
    n = UBound(ChangeNo)
    ReDim wColors(n)
    For i = 0 To n
        mFlag(ChangeNo(i)) = Not mFlag(ChangeNo(i))
        wColors(i) = BooleanColor(mFlag(ChangeNo(i)))
    Next
    
    ' 点の描画
    With Me.picGraph
        .DrawWidth = 3
        wX1 = .ScaleLeft
        Do While wX1 < .ScaleLeft + .ScaleWidth
            
            For i = 0 To n
                picGraph.PSet (wX1, Houteisiki(wX1, ChangeNo(i))), wColors(i)
            Next
                
            wX1 = wX1 + mStep
        Loop
        .DrawWidth = 1
    End With
End Sub

Private Function BooleanColor(ByVal ColorFlag As Boolean) As Long
    If ColorFlag Then
        BooleanColor = RGB(255, 0, 0)
    Else
        BooleanColor = RGB(0, 0, 0)
    End If
End Function

投稿時間:2004/04/08(Thu) 20:54
投稿者名:ねろ
Eメール:
URL :
タイトル:
Re^3: Lineコントロールでの悩み
重なる所が有るんじゃLineにクリックイベントが有っても駄目ですね。
案1、マウスが線の上に来たら、ListBoxをポップアップさせて、マウスの下にある線を表示しその中から
   変えたい線を選ぶ。ListBoxは「1−2」、「1−3」こんな表示にする
案2、案1とほぼ同じですが、線の上をクリックしたらListBoxを出してその中から色を変えたい線を選ぶ。
案3、変えたい線の始点を右クリックし、その線の終点を右クリックした時その間の線の色を変える。
案4、線の上をクリックすると色が変わる、交差点をクリックすると交差している線全ての色が変わる。
案5、右又は左のノードをクリックすると反対側のノードがポップアップListで表示されその中から
   変えたい線を選ぶ。
案6、メニューの中の色変更を選択すると小さな丸い色付きの円が現れこれをマウスでドラックして落とした所
   の下にある線の色が円の色に変わる、円の上をクリックしたとき変わるようにしても良い。
案7、TextBoxを用意して「1−3」等と入れるとその間の線の色が変わる。「1−ALL」や「1−2,5,8」
   などと入力しても良い。
まだ沢山案はあるけど、ちょっと疲れたので、この位で。