none
程式執行階段,要如何判斷表單中是否存在 tooltip RRS feed

  • 問題

  • 作業系統:winxp

    撰寫環境:VB.Net 2005

     

    請問,程式中要如何去判斷表單中已經有tooltip 這個控制項了呢?

    小弟用 Form.Controls 去找,只能取得 Button,Label、Menu等等的控制項。

    所以,無論表單中有沒有加入 ToolTip ,在 .Controls 中,都找不到。

    那麼,有什麼辦法可以由程式中判斷表單中有沒有加入 ToolTip 了呢?

    而如果有加入了,要如何去取得這個 ToolTip 呢?
    就像我們取得其它控制項一樣..如:

    Dim ctl As Control

    For Each ctl In Form1.Controls

     

    If ctl.GetType.Name = "Button" Then

    dim TmpButton as Button=ctl

    TmpButton.text="TEST"

    end if

     

    Next

     

    但是..在 .Controls 中,不會列出 ToolTip的物件啊,不知各位前輩有沒有解決的方法呢?謝謝!!!

     

    2008年4月8日 上午 08:35

解答

  • 謝謝各位大大提供的方法,其實小弟的意思是在不修改 Form1 的情況下 由 自定類別物件中去判斷 Form1 中否存在 tooltip

    看來好像是不行的樣子XD。不過還是謝謝各位大大熱心的幫忙,謝謝了。

    2008年4月17日 上午 09:17

所有回覆

  • 如果你去瀏覽 Formxxx.Designer.vb 檔案的話,就會發現 Tooltip 加入 componests 內中

    以 C# 舉例,可利用下列方法判對是否存在 Tooltip

    foreach (Component component in components.Components)
    {
        if(component is ToolTip)
        {
            MessageBox.Show("I am a tooltip");
        }
    }

    參考: Component Class
    2008年4月8日 下午 04:34
  •  

    謝謝大大的方法,但有一個問題..
    Public Sub Change(ByVal frm As Form)
         For Each tmpobj As Object In frm.Container.Components
         If tmpobj.GetType.Name = "ToolTip" Then
         TmpToolTip = tmpobj
         End If
         Next
    End Sub
    .Container.Components必須用 Me 才行,

    而小弟是須要將 Form 傳到副程式中(如上),再判斷有沒 ToolTip?不知道有沒有辦法呢..

    2008年4月10日 上午 02:22
  • 以下已測試過了   並沒有錯誤訊息出現

    Code Snippet

    Public Sub Change(ByVal frm As Form)

            For Each tmpobj As Object In frm.Container.Components

                If TypeOf tmpobj Is ToolTip Then

                    TmpToolTip = tmpobj

                End If
            Next
        End Sub

     

     

    2008年4月10日 上午 03:17
  • 先謝謝你了..

    我執行的結果,是停在 For Each tmpobj As Object In frm.Container.Components 這行

    ,錯誤訊息是 "並未將物件參考設定為物件的執行個體"。

    以下是我的程式碼:

     

    Code Snippet

        Public Sub Change(ByVal frm As Form)
            Dim tmptooltip As ToolTip
            For Each tmpobj As Object In frm.Container.Components
                If TypeOf tmpobj Is ToolTip Then
                    tmptooltip = tmpobj
                End If
            Next
        End Sub

     

     

    我是用 Change(Me) 執行副程式的。
    2008年4月11日 上午 08:53
  • SORRY

     

     Form 的 Container  是空的

     

    而 Form 的 Components  又是 Private

     

     

    所以可能要改用 其他方法

     

     

     

     


     

     

    2008年4月11日 上午 09:37
  • 不太確定這樣是不是繞遠路,參考看看

    Code Snippet

    Imports System.ComponentModel

     

    Public Class Form1

     

        Private Function HasToolTip() As Boolean

            If Me.components.Components Is Nothing Then

                Return False

            Else

                For Each c As Component In Me.components.Components

                    If TypeName(c) = "ToolTip" Then

                        Return True

                    End If

                Next

                Return False

            End If

        End Function

     

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            MessageBox.Show(Me.HasToolTip())

            Test.CheckToolTip(Me)

        End Sub

    End Class

     

    Public Class Test

        Public Shared Sub CheckToolTip(ByRef frm As Object)

            Dim o As Object = _

                 frm.GetType().InvokeMember("HasToolTip", _

                                             Reflection.BindingFlags.Instance Or _

                                             Reflection.BindingFlags.InvokeMethod Or _

                                             Reflection.BindingFlags.Public Or _

                                             Reflection.BindingFlags.NonPublic, Nothing, frm, Nothing)

            MessageBox.Show(o.ToString)

        End Sub

    End Class

     

     

    2008年4月11日 上午 11:40
    版主
  • 參考看看以下的方式:

    Form1.cs
    using System;
    using System.ComponentModel;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            public static void CheckTooltip(Form1 f1)
            {
                foreach (Component component in f1.components.Components)
                {
                    if (component is ToolTip)
                    {
                        MessageBox.Show("I am a tooltip");
                    }
                }
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                CheckTooltip(this);
            }
     
            private void button2_Click(object sender, EventArgs e)
            {
                Form2 f2 = new Form2();
                f2.f1 = this;
                f2.ShowDialog();
            }
        }
    }

    Form2.cs
    using System;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication2
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
     
            public Form1 f1;
     
            private void button1_Click(object sender, EventArgs e)
            {
                Form1.CheckTooltip(f1);
            }
        }
    }


    2008年4月11日 下午 12:07
  • 謝謝各位大大提供的方法,其實小弟的意思是在不修改 Form1 的情況下 由 自定類別物件中去判斷 Form1 中否存在 tooltip

    看來好像是不行的樣子XD。不過還是謝謝各位大大熱心的幫忙,謝謝了。

    2008年4月17日 上午 09:17