tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルラベルでイベントが起こらなくなる
記事No15300
投稿日: 2011/08/18(Thu) 16:23
投稿者てきーら
【環境】vb6 EnterpriseEdition、OS WindowsXp SP3、VB歴1年

ラベルをクリックするとそのCaptionを取得するプログラムを作っています
電卓をラベルで作成するイメージです
なぜラベルかというと
1.フラットなボタンを使用したい
2.コントロールをもちたくない
です

ラベルの数は150個くらいのコントロール配列で、実際の数は取得したいCaptionによって変動します
それらを電卓のように並べクリックするとCaptionを取得するのですが、いくつかイベントに反応しないラベルが存在します。そしてそれらは毎回ではなくかつ反応しなくなるIndexもバラバラです。
デバッグで調べてみてもすべてのラベルがEnabled=TrueでありZorderも最前列になっています
これはいったい何が起こっているのでしょうか?
いろいろ探してみましたが解決できないのでよろしくお願いします

[ツリー表示へ]
タイトルRe: ラベルでイベントが起こらなくなる
記事No15301
投稿日: 2011/08/20(Sat) 12:13
投稿者ミッキー
確認です。

1.150個のラベルは、1つのコントロールからコピーして増やしましたか?

例えばですが、Label1でコントロール配列をつくり、
Label1(0) 〜 Label1(149) となっているか?ということです。

2.「イベントに反応しない」というのは、プログラム上の

Private Sub Label1_Click(Index as Integer)

にブレークポイントを置いても、プログラムがストップしないということですか?

3.常にイベントに反応するラベルはありますか?
  →反応しなくなることがないラベルがあるのか?ということです。

4.3の回答が Yes の場合、反応しなくなるラベルとのプロパティ値に違いはありませんか?

[ツリー表示へ]
タイトルRe^2: ラベルでイベントが起こらなくなる
記事No15302
投稿日: 2011/08/21(Sun) 16:55
投稿者できーら
> 1.150個のラベルは、1つのコントロールからコピーして増やしましたか?

はい

> 2.「イベントに反応しない」というのは、プログラム上の
>
> Private Sub Label1_Click(Index as Integer)

そうです
Mouse_Move、MouseDownに反応しません

> 3.常にイベントに反応するラベルはありますか?

反応するかしないかはそのときによって変わります
特定のIndexがあるわけではありません

> 4.3の回答が Yes の場合、反応しなくなるラベルとのプロパティ値に違いはありませんか?

ありません
完全コピーです
FormをLoadするときに Loac(コントロール(Index)) で作成します
その後必要なPropertyを設定しますので違いはありません

よろしくおねがいします

[ツリー表示へ]
タイトルRe^3: ラベルでイベントが起こらなくなる
記事No15304
投稿日: 2011/08/21(Sun) 18:57
投稿者ミッキー
> そうです
> Mouse_Move、MouseDownに反応しません

私はクリックイベントに反応するかどうかを聞いているのですが・・・
ラベルをクリックして、そのキャプションを得たいんですよね?


> FormをLoadするときに Loac(コントロール(Index)) で作成します

最初からフォームに貼り付けているわけではないのですね。
最初からフォームに貼り付けた場合はどうなりますか?
反応したり、反応しなかったりするラベルはありますか?

[ツリー表示へ]
タイトルRe^4: ラベルでイベントが起こらなくなる
記事No15305
投稿日: 2011/08/23(Tue) 09:28
投稿者てきーら
返事が遅くなり申し訳ありません

クリックイベントでやってみましたが同様でした
ただプログラム上は左クリック、右クリックを区別しますのでMouse_Downを使用しています

当初は初めからラベルを貼り付けていました。
その時はクリックなどほぼすべてのイベントに反応しませんでした。そのIndexは不特定です。
それを数の問題だと考えプログラム上で作成する方法に変更しました

[ツリー表示へ]
タイトルRe^5: ラベルでイベントが起こらなくなる
記事No15311
投稿日: 2011/08/23(Tue) 21:43
投稿者ミッキー
試しに、ラベルの Mouse_Down イベントに以下の行を追加してみてください。

Call MsgBox("インデックスは" & CStr(Index) & " です")

マウスのクリック間隔が短いと反応しないケースがあることに気づきました。

上記の MsgBox は、クリック間隔をわざと広げるためのものです。
Private Sub Label1_MouseDown 〜 のすぐ下の行で構いません。


確認ですが、ラベルのクリック間隔が短いということはないですか?

[ツリー表示へ]
タイトルRe^6: ラベルでイベントが起こらなくなる
記事No15313
投稿日: 2011/08/24(Wed) 15:35
投稿者てきーら
それはありません
ツリーの一番下に具体例を記述していますので一度見ていただけないでしょうか?

[ツリー表示へ]
タイトルRe: ラベルでイベントが起こらなくなる
記事No15307
投稿日: 2011/08/23(Tue) 13:29
投稿者YK
こんにちは。

> ラベルの数は150個くらいのコントロール配列で、実際の数は取得したいCaptionによって変動します
> それらを電卓のように並べクリックするとCaptionを取得するのですが、いくつかイベントに反応しないラベルが存在します。そしてそれらは毎回ではなくかつ反応しなくなるIndexもバラバラです。

WithEventsを使った例です。
新規フォームを追加して実行してみて下さい。
ラベルをクリックしてみて下さい。
尚、160個のラベルを動的に追加しています。
フォームの大きさも指定してあります。

Option Explicit
Private WithEvents frmLbl   As Label
Private frmIndex            As Long
Private SubForm()           As Form1

Friend Sub Init(ByVal fLbl As Label)
    Set frmLbl = fLbl
End Sub

Friend Sub fIndex(ByVal fIdx As Long)
    frmIndex = fIdx
End Sub

Private Sub Form_Load()
    Dim i       As Long
    Dim j       As Long
    Dim cnt     As Long
    Dim Lbl(159) As Label
    
    For i = 1 To 20
        For j = 1 To 8
            cnt = ((i - 1) * 8) + (j - 1)
            Set Lbl(cnt) = Controls.Add("VB.Label", "Label" & cnt)
            With Me
                .Height = 10875
                .Left = 120
                .Top = 0
                .Width = 14055
            End With
            With Lbl(cnt)
                .Appearance = 0
                .BorderStyle = 1
                .Left = (j - 1) * 1680 + 270
                .Top = (i - 1) * 500 + 210
                .Height = 375
                .Width = 1605
                .Visible = True
            End With
            ReDim Preserve SubForm(cnt)
            Set SubForm(cnt) = New Form1
            SubForm(cnt).Init Lbl(cnt)
            SubForm(cnt).fIndex cnt
        Next
    Next
End Sub

Private Sub frmLbl_Click()
    MsgBox "Clicl No. = " & frmIndex
End Sub

[ツリー表示へ]
タイトルRe^2: ラベルでイベントが起こらなくなる
記事No15312
投稿日: 2011/08/24(Wed) 15:11
投稿者てきーら
教えていただいたコードを書いてみましたがとりあえずうまくいきました
とりあえずというのは、実はもう一つ処理を加えた後にうまくいかなくなるからなのですが・・・文章では書きづらくてですね、

【日本語】のボタンを押すとひらがなのキーボードになり
【英語】のボタンを押すと英語のキーボードになり
【フランス語】【スペイン語】・・・とあるとします
【日本語】のキーを押すと押したキーのBackColorが変更されCaptionがTextBoxに入ります
その後【英語】【フランス語】と3種類くらい種類を変更しクリックした後
【日本語】のキーボードに戻り、展開時にクリック済みのラベルのBackColorをクリック済みに変更します(クリック済み処理)
この時に右クリックに反応するものとしないものがそんざいするわけです
ちなみに右クリック処理はポップアップの展開です
左クリックには反応します
ニュアンス的には、指定したラベルが選択されていないため右クリックに反応しないようなのですが、それを回避するためにMouseMoveイベントにてMouseが指しているラベルのIndexを取得する処理が施されています

Private MIndex as Integer

Private Label_MouseMove
    Mindex=Index
End sub

Private Label_MouseDown
    If 左クリック
      Label(MIndex).BackColor変更
  Else
    Label(MIndex).BackColor変更
  End If
End sub

まだここまで検証できていないので今からしてみます
ところでMicrosoft Forms2.0のラベルを指定する場合、書式はどうなりますか?

[ツリー表示へ]
タイトルRe^3: ラベルでイベントが起こらなくなる
記事No15314
投稿日: 2011/08/24(Wed) 19:54
投稿者YK
> この時に右クリックに反応するものとしないものがそんざいするわけです
> ちなみに右クリック処理はポップアップの展開です

Forms2のLabelを使用するとそうなる可能性がありますね。

> ところでMicrosoft Forms2.0のラベルを指定する場合、書式はどうなりますか?
Microsoft Forms2.0のラベルのサンプルですけど
前述したようにMouseDownイベントがバラバラに発生するみたいです。
標準のラベルを使用して時は正常に出来ています。
下記のMouseDownイベントと
Private mBtn As String
を標準のラベルの方にも貼り付けて
試して見て下さい・ Click Eventsを外してほうがいいかも

Option Explicit
Private WithEvents frmLbl   As MSForms.Label
Private frmIndex            As Long
Private SubForm()           As Form1
Private mBtn                As String

Friend Sub Init(ByVal fLbl As Object)
    Set frmLbl = fLbl
End Sub

Friend Sub fIndex(ByVal fIdx As Long)
    frmIndex = fIdx
End Sub

Private Sub Form_Load()
    Dim i       As Long
    Dim j       As Long
    Dim cnt     As Long
    Dim Lbl(159)    As MSForms.Label
    
    For i = 1 To 20
        For j = 1 To 8
            cnt = ((i - 1) * 8) + (j - 1)
            Set Lbl(cnt) = Controls.Add("Forms.Label.1", "Label" & cnt)
            With Me
                .Height = 10875
                .Left = 120
                .Top = 0
                .Width = 14055
            End With
            With Lbl(cnt)
'                .Appearance = 0                ' このプロパティ無し
                .BorderStyle = 1
                .Left = (j - 1) * 1680 + 270
                .Top = (i - 1) * 500 + 210
                .Height = 375
                .Width = 1605
                .Visible = True
            End With
            ReDim Preserve SubForm(cnt)
            Set SubForm(cnt) = New Form1
            SubForm(cnt).Init Lbl(cnt)
            SubForm(cnt).fIndex cnt
        Next
    Next
End Sub

Private Sub frmLbl_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Select Case Button
        Case 1
            mBtn = "Left"
        Case 2
            mBtn = "Right"
        Case 4
            mBtn = "Middle"
    End Select
    MsgBox "Clicl No. = " & frmIndex & " & " & mBtn
End Sub

[ツリー表示へ]
タイトルRe^4: ラベルでイベントが起こらなくなる
記事No15315
投稿日: 2011/08/24(Wed) 23:49
投稿者テキーラ
ありがとうございます
やはり右クリックには反応しませんね

標準のラベルだとBorderColorが変更できないので、見た目を重視すると使用できないんです
だからどうしてもForms2.0のラベルを使用したかったのですが・・・

今のところの対処法として、左クリックにポップアップをつけています
ほかに方法はないのでしょうね

みなさまいろいろと教えていただきありがとうございました
BorderColorが変更でき、Focusを持たず、右クリックに反応できるコントロールがありましたら教えていただけるとありがたいです

今後ともよろしくお願いします

[ツリー表示へ]
タイトルRe^5: ラベルでイベントが起こらなくなる
記事No15316
投稿日: 2011/08/25(Thu) 03:16
投稿者Koz
Microsoft Forms 2.0 は VB 附属のコンポーネントではないので、
使うべきではないと思います。

(1) 配布の問題

[INFO] FM20.DLL の使用と再配布について
http://support.microsoft.com/kb/224305/ja

(2) 動作の不具合

「[VB] FM20.DLL を使用している Visual Basic アプリケーションの
"Error 7 - Out of Memory" エラー メッセージ」
http://support.microsoft.com/kb/241245/ja

「原因」のところに

FM20.DLL を Visual Basic やそのほかの開発者向け製品で
使用すると、多くの問題が発生することがわかっています。
このファイルを Visual Studio 製品で使用することは、
推奨もサポートもされません。

との記述があります。

ググって見ると、こんなのがありました。

ActiveX Basic Control Library
http://www.vector.co.jp/soft/win95/prog/se127438.html?ds
ラベルの BorderColor を変更できるようです。

他にもいろいろあるとは思いますが、ユーザコントロールを
自作する手もあります。

[ツリー表示へ]
タイトルRe^6: ラベルでイベントが起こらなくなる
記事No15317
投稿日: 2011/08/25(Thu) 09:37
投稿者てきーら
ありがとうございます
早速試してみます

[ツリー表示へ]
タイトルRe^5: ラベルでイベントが起こらなくなる
記事No15318
投稿日: 2011/08/25(Thu) 11:55
投稿者YK
こんにちは
> やはり右クリックには反応しませんね
標準のラベルだと此方ではチャンと動作しますが。

[ツリー表示へ]
タイトルRe^6: ラベルでイベントが起こらなくなる
記事No15319
投稿日: 2011/08/25(Thu) 21:29
投稿者テキーラ
あ、標準のLabelは反応します
しかしながら以前にも書いたようにBorderColorを変更できないと使えないので
時間がないですが自作を検討してみます
ありがとうございました

[ツリー表示へ]
タイトルRe^7: ラベルでイベントが起こらなくなる
記事No15320
投稿日: 2011/08/26(Fri) 10:24
投稿者YK
> あ、標準のLabelは反応します
> しかしながら以前にも書いたようにBorderColorを変更できないと使えないので
だったらBorderColorプロパティをもったコントロールを被せたら如何でしょうか。
Private Sub Form_Load()
    Dim i           As Long
    Dim j           As Long
    Dim cnt         As Long
    Dim Lbl(159)    As Label
    Dim Shp(159)    As Shape
            
    With Me
        .Height = 10875
        .Left = 120
        .Top = 0
        .Width = 14055
    End With
    
    For i = 1 To 20
        For j = 1 To 8
            cnt = ((i - 1) * 8) + (j - 1)
            Set Lbl(cnt) = Controls.Add("VB.Label", "Label" & cnt)
            With Lbl(cnt)
                .Appearance = 0
                .BorderStyle = 0
                .Left = (j - 1) * 1680 + 270
                .Top = (i - 1) * 500 + 210
                .Height = 375
                .Width = 1605
                .Visible = True
            End With
            Set Shp(cnt) = Controls.Add("VB.Shape", "Shape" & cnt)
            With Shp(cnt)
                .BackColor = &H80000005
                .BackStyle = 0
                .BorderStyle = 1
                .BorderColor = &HFF&
                .BorderWidth = 3
                .Left = (j - 1) * 1680 + 270
                .Top = (i - 1) * 500 + 210
                .Height = 375
                .Width = 1605
                .Visible = True
            End With
            
            ReDim Preserve SubForm(cnt)
            Set SubForm(cnt) = New Form1
            SubForm(cnt).Init Lbl(cnt)
            SubForm(cnt).fIndex cnt
        Next
    Next
End Sub

[ツリー表示へ]
タイトルRe^8: ラベルでイベントが起こらなくなる
記事No15325
投稿日: 2011/09/01(Thu) 00:11
投稿者できーら
ありがとうございます
ラベルとShapeの組み合わせでそこはクリアすることが出来ました
もうひとつ、ボタンをAlignment左寄せで作る必要があったのでそこで悪戦苦闘していました
ラベルにラインで影を作って立体的に見せることでクリアできましたが、そこまでしないと出来ないことにもどかしさを感じております

本当にありがとうございました

[ツリー表示へ]