C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

任意の時にバルーンヒントを表示するには

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■95240 / inTopicNo.1)  任意の時にバルーンヒントを表示するには
  
□投稿者/ NNN (1回)-(2020/07/02(Thu) 22:10:47)

分類:[.NET 全般] 

VB.NETに関する質問です。

https://dobon.net/vb/dotnet/control/balloontooltip.html


このウェブページにバルーンヒントを表示する方法が載っています。
この方法だと、カーソルがコントロールの上にある時に
表示されるようになります。

そうではなく、プログラムコード上で任意の時にバルーンヒントを表示したいのですが、
どのようにすれば良いですか?
エラーが出たときなどに、エラーの発生したコントロール上に
強制的にバルーンヒントを表示させたいのです。


引用返信 編集キー/
■95241 / inTopicNo.2)  Re[1]: 任意の時にバルーンヒントを表示するには
□投稿者/ 魔界の仮面弁士 (2769回)-(2020/07/03(Fri) 02:14:34)
No95240 (NNN さん) に返信
> プログラムコード上で任意の時にバルーンヒントを表示したいのですが、
> どのようにすれば良いですか?

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  ShowBallon(TextBox1, "エラー", "タイトル", ToolTipIcon.Warning)
End Sub

Public Sub ShowBallon(target As Control, message As String, title As String, icon As ToolTipIcon)
  ToolTip1.IsBalloon = True
  ToolTip1.ShowAlways = True
  ToolTip1.ToolTipIcon = icon
  ToolTip1.ToolTipTitle = title
  Dim pos As New Point(target.Width \ 2, target.Height \ 2)
  ToolTip1.Show(message, target, pos, 55)
  ToolTip1.Show(message, target, pos, 5000)
End Sub
引用返信 編集キー/
■95242 / inTopicNo.3)  Re[2]: 任意の時にバルーンヒントを表示するには
□投稿者/ NNN (2回)-(2020/07/03(Fri) 11:49:45)
まさにこれでした
どうもありがとうございました。

 
解決済み
引用返信 編集キー/
■95245 / inTopicNo.4)  Re[3]: 任意の時にバルーンヒントを表示するには
□投稿者/ NNN (3回)-(2020/07/03(Fri) 12:42:13)
すいません、

使っていて気になったのですが、


        ShowBallon(TextBox1, "aaa.", "ccc", ToolTipIcon.Warning)

        ShowBallon(TextBox5, "bbb.", "ddd", ToolTipIcon.Warning)

のように連続して、バルーン表示を実行した場合、
同時に複数の場所でバルーンを表示することができないようですが、
同時に表示することってできますか?

また、上記のように連続実行した場合、
枠内の文字は最初に実行したものなのに、
タイトルが次に実行したものになる場合があります。

上記の例だと
枠内の文字がaaaでタイトルがdddになってしまいます。

これは、


    Dim ShowBallonBool As Boolean = False

    Public Sub ShowBallon(target As Control, message As String, title As String, icon As ToolTipIcon)

        If ShowBallonBool = True Then Exit Sub

        ShowBallonBool = True

        ToolTip1.IsBalloon = True
        ToolTip1.ShowAlways = True
        ToolTip1.ToolTipIcon = icon

        ToolTip1.ToolTipTitle = title

        Dim pos As New Point(target.Width \ 2, target.Height \ 2)
        ToolTip1.Show(message, target, pos, 1000)

        Task.Factory.StartNew(
                         Sub()

                             Thread.Sleep(10)

                             ShowBallonBool = False

                         End Sub)

    End Sub


のようにして、連続実行を避けるようにするしかないですか?


あと、バルーンを表示したいコントロールのプロパティのToolTipに何でも良いので、
予め,文字列が代入されている場合には、そのコントロール上にバルーンが表示されるのですが
空になっていると、少しずれた位置になぜか表示されてしまいます。

これは仕様なのでしょうか?
単にTooltipに適当な文字列を入れるだけのことですが、気になります。


引用返信 編集キー/
■95246 / inTopicNo.5)  Re[4]: 任意の時にバルーンヒントを表示するには
□投稿者/ 魔界の仮面弁士 (2771回)-(2020/07/03(Fri) 13:08:44)
No95245 (NNN さん) に返信
> 同時に表示することってできますか?

表示したい数だけ、それぞれ個別に ToolTip インスタンスを用意してください。
ToolTip それぞれに、タイトルやアイコンを指定できます。


> Dim pos As New Point(target.Width \ 2, target.Height \ 2)
> ToolTip1.Show(message, target, pos, 1000)

No95241 のように、2 回 Show することをお奨めします。

これは、吹き出しバルーンの初回表示において、tail pointer の向きが、
コントロールあるいは指定座標に向かわずに、「現在のマウス座標」方向に
向いてしまう不具合を回避するために必要です。
引用返信 編集キー/
■95247 / inTopicNo.6)  Re[5]: 任意の時にバルーンヒントを表示するには
□投稿者/ NNN (4回)-(2020/07/03(Fri) 13:29:50)
ありがとうございます。
そういうことだったのですね。

ToolTip1を複数個配置する方法なのですが、
たくさんあると管理が大変なので、
ToolTip1を使っていたら、ToolTip2、ToolTip2も使っていたら、ToolTip3というように
空きのToolTipを使用してバルーン表示させたいのですが、
ToolTipが使用中かどうか調べる方法はございますでしょうか?


引用返信 編集キー/
■95249 / inTopicNo.7)  Re[6]: 任意の時にバルーンヒントを表示するには
□投稿者/ 魔界の仮面弁士 (2772回)-(2020/07/03(Fri) 15:24:43)
No95247 (NNN さん) に返信
> ToolTip1を複数個配置する方法なのですが、
> たくさんあると管理が大変なので、

1 つのコントロールに対して複数のバルーンを使うことが無いのなら、
デザイン時生成ではなく、実行時に動的に生成した上で、
Dictionary(Of Control, ToolTip) 等で自前管理するとか。

自己生成した場合は、Dispose 漏れを防ぐために IContainer への登録も忘れずに。


If Me.components Is Nothing Then
 Me.components = New System.ComponentModel.Container()
End If
Dim tt As New ToolTip(Me.components) With {.IsBalloon = True}
引用返信 編集キー/
■95253 / inTopicNo.8)  Re[7]: 任意の時にバルーンヒントを表示するには
□投稿者/ NNN (6回)-(2020/07/04(Sat) 12:15:36)
ありがとうございます。

> 自己生成した場合は、Dispose 漏れを防ぐために IContainer への登録も忘れずに。


> If Me.components Is Nothing Then
>  Me.components = New System.ComponentModel.Container()
> End If
> Dim tt As New ToolTip(Me.components) With {.IsBalloon = True}

ここがよく分かっていないのですが
このコードを書くとプログラム終了時に自動的にDisposeされるという意味ですか?
上記のコードはどこに書けば良いですか?

Sub Form1_Load ですか?



引用返信 編集キー/
■95254 / inTopicNo.9)  Re[8]: 任意の時にバルーンヒントを表示するには
□投稿者/ 魔界の仮面弁士 (2774回)-(2020/07/04(Sat) 15:59:13)
No95253 (NNN さん) に返信
>>自己生成した場合は、Dispose 漏れを防ぐために IContainer への登録も忘れずに。

上記については No95252 でも述べているので、そちらも参考に。


自動生成される Form1.designer.vb を見ていただくとわかるかと思いますが、
ToolTip をフォームに貼った場合、こんなコードが自動生成されます。

 Friend WithEvents ToolTip1 As ToolTip

 Private components As System.ComponentModel.IContainer

 <System.Diagnostics.DebuggerStepThrough()> _
 Private Sub InitializeComponent()
  Me.components = New System.ComponentModel.Container()
  Me.ToolTip1 = New System.Windows.Forms.ToolTip(Me.components)
  ' 以下割愛
 End Sub


「コントロール」の場合は、フォームに Controls.Add などで登録されるのと同様、
一部の「コンポーネント」は、フォームに components.Add などで登録される仕様です。

フォームが Dispose された場合、Controls や components の中身も、順次 Dispose されるように
設計されているため、これらに登録しておけば、Dispose 処理を明示的に呼び出す必要がありません。

Controls.Add や components.Add していなかったものに対しては、親フォームが Dispose されても、
連動して Dispose されることはありません。ガベージコレクト任せになります。
ToolTip は Dispose が必要なコンポーネントなので、Me.components に登録しておくことをおすすめします。


>>If Me.components Is Nothing Then
>> Me.components = New System.ComponentModel.Container()
>>End If
>>Dim tt As New ToolTip(Me.components) With {.IsBalloon = True}
> ここがよく分かっていないのですが
> このコードを書くとプログラム終了時に自動的にDisposeされるという意味ですか?
> 上記のコードはどこに書けば良いですか?
> Sub Form1_Load ですか?

ToolTip は、ポップアップ表示されるという特性を持ちますが、
それ自体は Button や TextBox 同様、一つの「ウィンドウ」ですよね。

TextBox を 2 箇所同時に表示したければ、TextBox を 2 つ用意しなければならぬように、
ToolTip を同時に表示したければ、その数だけインスタンスが必要だということです。

なので、同時表示させたい数だけ、「New ToolTip」しておく必要があります。


この New をいつ行うかは任意です。自作メソッドが呼ばれたときに行っても良いですし、
Form の Load イベントなどで生成しておいてもよいでしょう。
フォームに貼って使う場合には、デザイン時に「New ToolTip(Me.components)」が行われているわけです。

たとえば、同時に 3 つ表示させることが分かっているなら、
デザイン時に 3 つ貼っておいて、それぞれを .Show すればよいと思います。通常はそれで済むはず。

一方、同時表示数が未定で、いつどのように使われるか分からない場合は致し方ないので、
表示する場所(おそらくはコントロールの場所)の数だけ用意するという手段があります。
その場合は、 No95249 で提案したように、既知のコントールかどうかを Dictionary で判断し、
未登録なら新しい ToolTip を生成するといった手が使えるかと思います。
(ただしこの場合、同時利用数以上のインスタンスを用意することになりえます)
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ