Infobulle type DHTML dans Access

lebourgjf Messages postés 29 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 6 août 2004 - 3 août 2004 à 09:09
lebourgjf Messages postés 29 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 6 août 2004 - 5 août 2004 à 11:32
Bonjour,

je cherche à créer des infobulles dans des formulaires Access 2000 sur le même modèle que ce que l'on peut faire en DHTML.

Lorsque la souris survole un contrôle, une infobulle s'affiche (et reste affichée tant que le pointeur y est). Lorsque la souris quitte le contrôle, elle disparait.

L'intérêt par rapport à la propriété ControlTipText est de pouvoir la personnaliser, y mettre tout le texte que l'on souhaite...

Jusqu'à présent, j'ai essayé 2 solutions :

- en créant une zone de texte dans un formulaire. Solution pénible car nécessite d'éditer au préalable le formulaire en mode Design et de faire attention à ce que les dimensions de la zone de texte ne dépassent pas les dimensions du formulaire.

- en utilisant un formulaire dédié à l'affichage des infos. Assez pratique. 2 limites à noter : attention à la dimension du formulaire pour du texte "très long" (j'utilise le code Autosizetext de Stephen Lebans). Les contrôles ne disposent pas d'une propriété onmouseout permettant la fermeture du formulaire (je le masque quand le pointeur se trouve sur la section Détail). De plus, d'une base à l'autre : ne pas oublier d'importer le formulaire, le mettre en forme....

j'ai parcouru le site et j'ai trouvé quelques pistes intéressantes (dont celle de RenField et son infobulle multi-lignes. Programmé sous VB, je ne vois pas comment l'adapter sous MS Access) mais après quelques tests, je cale.

Bref, toute info est la bienvenue.

15 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 août 2004 à 10:06
Pour les infobulles que j'ai réalisées, il faut un controle qui aies un hWnd.

les controles de Acces n'en ont pas, ils sont juste dessinés

il deviennent de vrais controles lorsqu'ils ont le focus. Voila pourquoi avant d'interagir via le code avec eux, il faut faire un SetFocus.

Il est alors possible de récupérer son handle via l'API GetFocus

Amusez-vous ! ;)
Renfield - thomas_reynald@msn.com
Admin CodeS-SourceS
0
lebourgjf Messages postés 29 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 6 août 2004
3 août 2004 à 14:24
Bien compris,

j'ai récupéré son handle par la fonction suivante (trouvée sur : http://www.mvps.org)

**********************************
Private Declare Function apiGetFocus Lib "user32" _
Alias "GetFocus" _
() As Long

Function fhWnd(ctl As Control) As Long
On Error Resume Next
ctl.SetFocus
If Err Then
fhWnd = 0
Else
fhWnd = apiGetFocus
End If
On Error GoTo 0
End Function
**********************************

J'ai importé ton code VB dans Access.

Au chargement d'un formulaire (comportant un bouton de commande nommée command0 et un dim ToolTip as new ReyToolTips), je fais :

call ToolTip.add ("tip",fhWnd(me.command0),"titre","texte" RTI_Info, False, False)

J'obtiens une erreur 424 (object requis).

Qui c'est qui n'a pas tout compris : Access ou moi ?
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 août 2004 à 14:53
essaye de tester a cet endroit si l'objet ToolTip a bien été créé :

MsgBox ToolTip Is Nothing 


doit renvoyer False

sinon, ton probleme viens surment de Command0
le nom est il exact ?

Amusez-vous ! ;)
Renfield - thomas_reynald@msn.com
Admin CodeS-SourceS
0
lebourgjf Messages postés 29 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 6 août 2004
3 août 2004 à 15:28
Tout d'abord merci Renfield pour me consacrer "un peu" de temps. Super sympa.

Le ToolTip est bien créé puisque ton instruction renvoie False.

Pour le nom du contrôle, je pense qu'il est exact puisque je me suis laissé guider en tapant Me.Com...

Je peux t'envoyer la base Access (garantie sans virus !!!) sur une adresse email si tu le souhaites.

Est-ce possible que l'erreur d'object requis provienne d'un mauvais passage de paramètres ?

J'ai pourtant bien créé les modules de classe (Le ToolTip est créé)...
0

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

Posez votre question
lebourgjf Messages postés 29 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 6 août 2004
3 août 2004 à 15:44
En faisant l'exécution en pas à pas,

- le handle du controle est récupéré
- la collection est créée et newTT ajouté avec la clé (initialisation de mBackColor et mForeColor)
- lors de newTT.attach, l'erreur se produit juste pendant/après l'instruction de création de la fenêtre

mhWnd = CreateWindowEx(WS_EX_TOPMOST,TOOLTIPS_CLASSA,vbNullString,Style, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,me.hwnd,0,App.hInstance,0)

Lors de l'appel de cet api, tous les variables sont définies sauf App.hInstance (et Me.hwnd = 0)

Le pointeur va dans la classe ReyToolTip à la fonction Property Get hwnd(), en sort et tout de suite après fait l'erreur.

Est-ce que le 'Me.hwnd' ou App.hInstance pourrait être incriminé ?
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 août 2004 à 16:37
Le App.Hinstance.....

pour t'en assurer, tu peux toujours taper

? App.hInstance dans la fenetre de debug (Ctrl + G)

remplace cette variable propre à VB par 0

Amusez-vous ! ;)
Renfield - thomas_reynald@msn.com
Admin CodeS-SourceS
0
lebourgjf Messages postés 29 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 6 août 2004
3 août 2004 à 23:20
c'était bien le App.hinstance qui posait problème. En le mettant à 0, çà passe.

L'infobulle est bien créée (ouf), s'affiche (ré-ouf) mais... pas au bon endroit :

- l'infobulle est affichée lorsque la souris pointe sur la partie de fenêtre listant les formulaires de la base.
- Lorsque la souris pointe sur le formulaire ouvert et/ou le controle , l'infobulle n'est pas affichée (ce qui signifie que l'infobulle est attachée à la partie de fenêtre).

Dans la procédure Attach, l'instruction GetClientRect hwnd, R renvoie une zone 0,0,886,595 (je suis en 1024*768).

Pourtant le hwnd est bien celui correspondant au bouton de contrôle Commande0 et ti.hwnd reçoit le hwnd et ensuite Call SendMessage(mhWnd, TTM_ADDTOOLA, 0, ti).

Donc je comprends pas pourquoi c'est attaché à la partie de fenêtre (et donc c'est logique d'avoir ces coordonnées de zone sensible).

Ah, je suis sûr d'être près du but. Où est donc ce petit boulon à revisser ?
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 août 2004 à 23:38
Essaye de remplacer GetClientRect par GetWindowRect......

content que tu t'approches de la chose ;)

Amusez-vous ! ;)
Renfield - thomas_reynald@msn.com
Admin CodeS-SourceS
0
lebourgjf Messages postés 29 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 6 août 2004
4 août 2004 à 08:39
j'ai essayé différentes solutions, en vain.

Tout se passe comme si Access se fichait du handle du contrôle, pourtant bien défini.

Sur Mvps, j'ai lu :

"Par contre, puisque les contrôles d'Access ne se comportent pas du tout comme ceux de VB, il y a peu de choses qu'on peut faire avec cette poignée (handle). "

Cela vaut-il aussi pour cette idée d'infobulle ?

Je vais essayer de ne pas passer par le handle mais uniquement par les coordonnées de la souris.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
4 août 2004 à 08:43
Je sais pas.... il s'affiche bien pourtant

pas au bon endroit, mais bon.....
il faudrait décaler la zone sensible, en somme....

Amusez-vous ! ;)
Renfield - thomas_reynald@msn.com
Admin CodeS-SourceS
0
lebourgjf Messages postés 29 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 6 août 2004
4 août 2004 à 15:35
Salut,

la nuit doit porter conseil...

J'ai "épuré" ton code en ne recourant pas aux classes ni à la collection et en liant à l'évènement mousemove le code suivant :

Attach fhWnd(Me.controle),"titre","texte",RTI_Info, false,false

Et çà marche ! (même ne ne modifiant pas GetClientRect)...

la dernière ligne droite : comment faire pour que l'infobulle ne soit pas affichée plusieurs fois (à cause du mousemove) ?

- tu vas me répondre : en définissant l'attachement 1 seule fois au chargement du formulaire.

- oui, mais si je souhaite que l'infobulle (titre et texte principalement) puisse être modifiée après une saisie de l'utilisateur sur le formulaire ? Que penses-tu de cette idée :

1. pour afficher qu'une seule fois : créer une variable globale recevant le handle de l'infobulle et tester avant création si elle est à 0 ou non. Si 0 alors on la crée, sinon on passe son chemin.

2. pour modifier le titre et le texte :
2.1 pour le titre, je passe par le Call SendMessage,
2.2 pour le texte : je mets ti en variable globale je modifie ti.lpszText et ensuite un coup de Call SendMessage (mhWnd,TTM_ADDTOOLA,0,ti).
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
4 août 2004 à 16:56
oui, ca semble une solution correcte..... vu que tu as "démodularisé" mon code....

Amusez-vous ! ;)
Renfield - thomas_reynald@msn.com
Admin CodeS-SourceS
0
lebourgjf Messages postés 29 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 6 août 2004
5 août 2004 à 01:06
Merci pour tout Renfield... :big)

J'espère que tu ne m'en voudras pas d'avoir taillé dans le vif avec ton code très pro... De toute façon, je ferai référence à toi dans les lignes de code (mais je n'ai aucune prétention à diffuser quoi que ce soit).

Une dernière (?!) question concernant les caractéristiques de la fenêtre créée. Pour un tooltip, tu utilises de mémoire la classe tooltip_class32. Y a t'il la possibilité d'en utiliser d'autres ? je pensais à une classe qui permettrait l'affichage d'infos sous forme de tableau. Peut-être est-ce impossible mais quand je découvre l'étendue des possibilités, j'ai l'impression qu'il n'y a quasiment aucune limite...
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
5 août 2004 à 09:56
La class Tooltip est faite dans un certain but.... c'est elle qui definit si elle se montre etc...

maintenant, a y reflechir, il s'agit d'une fenetre comme les autres.... il doit être possible de faire un SetParent pour y rattacher un autre contrôle, comme fenêtre Fille....

A creuser....

Bonne continuation, et merci de ta perseverance

Amusez-vous ! ;)
Renfield - thomas_reynald@msn.com
Admin CodeS-SourceS
0
lebourgjf Messages postés 29 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 6 août 2004
5 août 2004 à 11:32
En effet, je viens de tester avec succès l'inclusion d'une fenêtre fille dans la fenêtre.

Comme je développe sous VBA Access, j'obtiens des trucs bizarroïdes concernant les hwnd. Je clos le sujet des infobulles et poste un nouveau sujet sur le hwnd sous Access.

J'en profiterai aussi pour poser la question d'écriture et de mise en forme de texte dans une fenêtre créée par createWindowEx (et là j'ai du boulot pour apprendre).
0
Rejoignez-nous