ToolTip - Des fois ça marche, des fois...

Résolu
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 - 21 mars 2013 à 16:05
 Utilisateur anonyme - 27 mars 2013 à 19:56
Salut à tous,

Voila, dans mon appli (dévellopée sous VB2010 avec le FW3.5), j'affiche un ToolTip sur des sections d'un diagramme de Gantt (Panel)pour informer l’utilisateur de sa nature.

     Public Sub Panel_Pnt_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs)
        Try
            Dim cible As Panel = DirectCast(sender, Panel)
            Dim ToolTip = New System.Windows.Forms.ToolTip
            Dim ID As String = cible.Tag

            ToolTip.IsBalloon = True
            ToolTip.ToolTipTitle = "Info:"
            ToolTip.UseAnimation = True
            ToolTip.InitialDelay = 0
            ToolTip.UseFading = True
            ToolTip.SetToolTip(cible, "ID: " & cible.Tag & ChrW(13) & "Titre: " & ReadTittle(cible.Tag))
        Catch ex As Exception
            WriteLog("Error Panel_Pnt_MouseEnter: Function - " & System.Reflection.MethodBase.GetCurrentMethod().Name & " - " & Date.Now & " - " & ex.Message)
        End Try
    End Sub


Le soucis, est que cela fonctionne très bien sur ma machine qui est en Seven, mais pas sur les machines clients encore pour quelques mois sous XP Pro!

Zauriez-vous une idée?

Merci! ;)

Jimy

Pensez: Réponse acceptée
'**********************************************

32 réponses

jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 1
22 mars 2013 à 09:59
J'ai trouvé, sous XP, la propriété
ToolTip.IsBalloon = True


ne fonctionne pas, je l'ai passé à false et ça marche!

Merci de ton aide Banana! ;)


Jimy

Pensez: Réponse acceptée
'**********************************************
3
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 1
21 mars 2013 à 17:37
Je viens de regarder les plateformes admissibles:
Tapez le texte de l'url ici.

[quoteWindows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professionnel Édition x64, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98
/quote

Je sius en XP Pro SP3, ca ne devrait pas poser de soucis?!

Jimy

Pensez: Réponse acceptée
'**********************************************
0
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 1
21 mars 2013 à 17:58
Pour info, j'ai teste l'évènement MouseEnter, il fonctionne correctement.


Jimy

Pensez: Réponse acceptée
'**********************************************
0
Utilisateur anonyme
21 mars 2013 à 18:38
Bonjour,

Une petite question : La clause Handles n'est pas présente ? Je suppose que tu abonnes ton panel à cet événement ailleurs dans le code (AddHandler) ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 1
21 mars 2013 à 19:29
Je n'ai pas la possibilité de te donner le code de création du contrôle dans l'heure, mais comme je l'ai dit plus haute, l'évènement "MouveEnnter" fonctionne bien, le code s’exécute correctement, seul le ToolTip ne s'affiche pas!

Jimy

Pensez: Réponse acceptée
'**********************************************
0
Utilisateur anonyme
21 mars 2013 à 21:08
C'est peut être parce que que ton tooltip est mal déclaré :
Dim ToolTip = New System.Windows.Forms.ToolTip

au lieu de :
Dim ToolTip as System.Windows.Forms.ToolTip = New System.Windows.Forms.ToolTip
0
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 1
22 mars 2013 à 08:58
Salut Banana,
En effet, ça aurait pu être ça, et cela ne mange pas de pain de bien déclarer ses contrôles, mais cela ne change rien malheureusement!

C'est étrange, j'ai place des WriteLog partout dans le code pour m'assurer de son exécution, et tout va bien, mais il ne s'affiche pas!


Jimy

Pensez: Réponse acceptée
'**********************************************
0
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 1
22 mars 2013 à 09:13
Banana, pour répondre à ta première question:


Dim Panel_Pnt as Panel
...
...
...
Panel_Pnt = New Panel()
                    With Panel_Pnt
                        .Name = "Panel_Pnt" & ID.ToString
                        .Width = myrecordset.Item("Duree") + 1
                        .Height = 25
                        .Location = New Point(LocateX, -3)
                        .BackColor = Color.White
                        .BorderStyle = BorderStyle.FixedSingle
                        .Tag = ID
                        .Cursor = Cursors.Hand
                        .BackgroundImageLayout = ImageLayout.Stretch

                    End With


                    'ajout d'un gestionnaire d'événement click
                    AddHandler Panel_Pnt.Click, AddressOf Panel_Pnt_Click
                    'ajout d'un gestionnaire d'événement MouseEnter
                    AddHandler Panel_Pnt.MouseEnter, AddressOf Panel_Pnt_MouseEnter
                    'ajout d'un gestionnaire d'événement MouseLeave
                    AddHandler Panel_Pnt.MouseLeave, AddressOf Panel_Pnt_MouseLeave

                    'ajout du controle au formulaire
                    Outils.FLP_WO_WPnt.Controls.Add(Panel_Pnt)



Jimy

Pensez: Réponse acceptée
'**********************************************
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
22 mars 2013 à 10:17
Bonjour à tous les deux,

Juste un petit rappel. Il n'est pas judicieux de créer une nouvelle instance de l'objet ToolTip à chaque passage de la souris sur l'objet.

Il est préférable de déclarer l'objet de façon unique pour la Form et uniquement de faire un SetToolTip au survol.

Exemple :
Public Class Form1

    Private _toolTip As System.Windows.Forms.ToolTip

    Public Sub New()
        InitializeComponent()
        InitToolTip()
    End Sub

    Private Sub InitToolTip()
        _toolTip = New System.Windows.Forms.ToolTip()
        _toolTip.IsBalloon = True
        _toolTip.ToolTipTitle = "Info:"
        _toolTip.UseAnimation = True
        _toolTip.InitialDelay = 0
        _toolTip.UseFading = True
    End Sub

    Public Sub Panel_Pnt_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) 
        Try
            Dim cible As Panel = DirectCast(sender, Panel)
            Dim ID As String = cible.Tag
            _toolTip.SetToolTip(cible, "ID: " & cible.Tag & ChrW(13) & "Titre: " & ReadTittle(cible.Tag))

        Catch ex As Exception
            WriteLog("Error Panel_Pnt_MouseEnter: Function - " & System.Reflection.MethodBase.GetCurrentMethod().Name & " - " & Date.Now & " - " & ex.Message)
        End Try
    End Sub

End Class


Nota : Exemple testé sous XP SP3 avec "IsBalloon = True" et cela fonctionne de mon coté. Donc le problème pourrait venir d'un paramètre du projet genre "Activer les styles visuels XP" décoché.

Bonne journée à vous.
0
Utilisateur anonyme
22 mars 2013 à 13:03
Bonjour foliv57,

Il doit pouvoir le faire aussi au moment de l'instanciation de son panel sans avoir besoin de le déclarer dans l'entête de la classe.
0
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 1
22 mars 2013 à 13:37
Merci Foliv pour cet exemple très enrichissant. Cependant, cette expression ne passe pas!

    Public Sub New()
        InitializeComponent()
        InitToolTip()
    End Sub


" Un 'Sub New' partagé ne peut pas être déclaré 'Public'"

Et j'ai bien peur pour le coup de ne pas être assez calé pour la comprendre.
Jimy

Pensez: Réponse acceptée
'**********************************************
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
22 mars 2013 à 13:56
Pouvoir, oui bien entendu.

Mais en terme de ressource, cella provoque une création d'objet ToolTip pour chaque élément panel survolé dans la Form alors que la classe ToolTip est justement prévue pour gérer les messages ToolTip de plusieurs éléments (Voir documentation). Normalement le cycle de vie de ce type d'objet est le même que celui de la Form.

Concrètement, si par exemple la Form est composée de 10 panels et qu'on survol ces 10 panels à la suite. Avec la l’instanciation de ToolTip sur chaque MouseEnter on va créer 10 objets ToolTip alors qu'une seule instance d'un objet ToolTip peut gérer les messages de tous les éléments d'une Form (donc des 10 panels).

En allant même plus loin dans mon exemple de tout à l'heure. La logique d'un objet ToolTip devrait être 1) d'être créé et initialisé lors de l'initialisation de la Form 2) d'être mis à jour lorsqu'un message doit être modifié (pas forcément à chaque survol) 3) de mourir avec la Form.

Exemple avec deux panels qui affiche leur propriété "Tag" comme message ToolTip :
Public Class Form1

    Private _toolTip As System.Windows.Forms.ToolTip

    Public Sub New()

        'Initialisation des composant de la form
        InitializeComponent()

        'Initialisation du gestionaire de ToolTip
        InitToolTip()

    End Sub

    'Initialisation du gestionaire de ToolTip
    Private Sub InitToolTip()
        _toolTip = New System.Windows.Forms.ToolTip()
        _toolTip.IsBalloon = True
        _toolTip.ToolTipTitle = "Info:"
        _toolTip.UseAnimation = True
        _toolTip.InitialDelay = 0
        _toolTip.UseFading = True
    End Sub

    'Mise à jour du tag d'un panel
    Private Sub UpdatePanelTag(ByVal panel As Panel, ByVal newTag As String)
        panel.Tag = newTag
        _toolTip.SetToolTip(panel, newTag)
    End Sub

    'Chargement du formulaire
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        'Initialisation des ToolTip
        UpdatePanelTag(Me.Panel1, "Mon tool tip panel 1 initial")
        UpdatePanelTag(Me.Panel2, "Mon tool tip panel 2 initial")

    End Sub

    'Evenement quelconque sencé mettre à jour un panel ou créer un panel ou autre...
    Public Sub FaitQuelqueChose()
        UpdatePanelTag(Me.Panel1, "Mon nouveau tool tip panel 1")
    End Sub

End Class


De cette façon on ne crée qu'un Objet ToolTip et on le met à jour uniquement quand c'est nécessaire. Celui-ci s'occupe du reste.

J'avoue que le fond de cette histoire est que je suis un malade de la mémoire vive :) Je me méfie toujours des classes qui implémentent la méthode "Dispose()". C'est souvent signe qu'il ne faut pas en créer à tour de bras.

Donc ma remarque était surtout un conseil. Les deux méthodes fonctionnent.

Normalement le problème de base (problème sous XP) ne devrait pas être lié à ma remarque, qui du coup est hors sujet sorry.

Pour approfondir il faudrait savoir comment le formulaire et les panels sont créés et si les propriétés de bases du projet ont été modifiés car pour ma part, les deux méthodes fonctionnent sous XP.
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
22 mars 2013 à 14:00
Merci Foliv pour cet exemple très enrichissant. Cependant, cette expression ne passe pas!
Code Visual Basic :

Public Sub New()
InitializeComponent()
InitToolTip()
End Sub


" Un 'Sub New' partagé ne peut pas être déclaré 'Public'"


Intéressant... Vous l'avez bien places au niveau de la classe "FLP_WO_WPnt" ?
Car d'après les post précédent vous devriez avoir ceci
Class FLP_WO_WPnt
End Class
0
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 1
22 mars 2013 à 14:11
Je crois comprendre le soucis:

Ce que me propose Foliv doit être déclaré dans la class Form.
Mais uniquement ceci (D'ailleurs, pourriez-vous m'en expliquer l'utilité?)
    Public Sub New()
        InitializeComponent()
        InitToolTip()
    End Sub    


Et le reste avec mes évenements 'MouseEnter', dans un module avec le code de création des controles. Et là ça marche sous seven et toujours pas sous XP, sauf avec "IsBalloon = False"...Et mon paramètre "Activer les styles visuels XP" est bien coché!

Jimy

Pensez: Réponse acceptée
'**********************************************
0
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 1
22 mars 2013 à 14:16
Nos messages se sont croisés, merci Foliv pour ces conseils avisés, mais le mystère reste en ce qui concerne XP...


Jimy

Pensez: Réponse acceptée
'**********************************************
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
22 mars 2013 à 14:25
Public Sub New()

Est la méthode lancée lors de la création de l'instance du formulaire.
Grossièrement cette méthode est appelée avant l'évènement "Load".
C'est dans cette méthode (appelée constructeur) que l'on va créer tous les éléments du formulaire.
La première instruction est obligatoirement
InitializeComponent()
(pour un formulaire).
On peut facilement aller jeter un coup d'oeil à cette méthode en faisant un "clic droit->Atteindre la définition" dessus. On y retrouvera la création, le positionnent et l'initialisation de chaque contrôles placés à l'aide de l'interface de visual studio. C'est parfois intéressant d'analyser la façon dont ils sont créés.

Après cette instruction vous pouvez y ajouter tout code qui vous permettrait de créer des éléments non ajoutés à l'aide de l'interface ou ne pouvant pas l'être.
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
22 mars 2013 à 14:26
mais le mystère reste en ce qui concerne XP...


Oui malheureusement. Je n'arrive pas à le reproduire pour le moment
0
Utilisateur anonyme
22 mars 2013 à 14:41
la classe ToolTip est justement prévue pour gérer les messages ToolTip de plusieurs éléments (Voir documentation)

Merci foliv57

@jimy neutron
Attention à ne pas abuser du ToolTip qui peut vite agacer un utilisateur. Prévoir une désactivation dans les options de ton appli.
0
jimy neutron Messages postés 491 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 18 novembre 2016 1
22 mars 2013 à 14:51
Merci pour cette remarque Banana. J'en prends bonne note! ;)

Jimy

Pensez: Réponse acceptée
'**********************************************
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
22 mars 2013 à 15:02
Jimy, pourriez vous me donner des informations sur l'action effectuée sur "MouseLeave" ?

Ca pourrait être une piste car on peut remarquer que lorsque le tooltip est affiché, si la sourie est au dessus, ça provoque un MouseLeave.

Et on peut remarquer qu'avec "IsBalloon = False" le curseur de la sourie n'est pas tout de suite au dessus du tooltip dès son affichage.
0
Rejoignez-nous