OVH Cloud OVH Cloud

Aide pour Création ActiceX

4 réponses
Avatar
TouTi
Bonjour

Pour améliorer la présentation des données (image, texte avec mise en
forme...), je me suis lancé dans la création d'un ActiveX (première fois)
représentant un combo image. Les débuts sont bons mais j'ai un gros soucis
dans la fermeture (hide ou unload) de la liste. J'aimerai lorsque je clic à
l'extérieur du combo que la liste disparait.
Pourriez vous m'aider????

Ci joint le projet à ce lien http://cjoint.com/?mslXdKN7uL

Merci

--
TouTi

4 réponses

Avatar
Jean-Marc
"TouTi" <gelapplication[Nospam]@tiscali.fr> a écrit dans le message de
news:do3f54$ced$
Bonjour

Pour améliorer la présentation des données (image, texte avec mise en
forme...), je me suis lancé dans la création d'un ActiveX (première


fois)
représentant un combo image. Les débuts sont bons mais j'ai un gros


soucis
dans la fermeture (hide ou unload) de la liste. J'aimerai lorsque je


clic à
l'extérieur du combo que la liste disparait.
Pourriez vous m'aider????

Ci joint le projet à ce lien http://cjoint.com/?mslXdKN7uL



Hello,

Ton projet ne se charge pas (aucun des vbp).
C'est parce que tu as sauvé tes fichiers avec
des path relatifs spécifiques à ton environnement.
Voici un extrait d'un des .vbp:

Path32="....controle comboessai"
...
CompatibleEXE32="....controle comboessaiCombo_image.ocx"

Ca oblige donc pour pouvoir charger tes projets de reconstruire
une arborescence identique à celle que tu utilises.

Peux tu reconstruire un projet clean?

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Jacques93
Bonjour Touti,
TouTi a écrit :
Bonjour

Pour améliorer la présentation des données (image, texte avec mise en
forme...), je me suis lancé dans la création d'un ActiveX (première fois)
représentant un combo image. Les débuts sont bons mais j'ai un gros soucis
dans la fermeture (hide ou unload) de la liste. J'aimerai lorsque je clic à
l'extérieur du combo que la liste disparait.



Pour cela, il faut "sous-classer" les messsages de ta fenêtre et
intercepter le message WM_NCACTIVATE (Non Client Activate). Dans le code
de ta feuille 'view' du composant ocx, tu ajoutes :

Private Sub Form_Load()
HookWndProc Me.Hwnd
End Sub

Private Sub Form_Unload(Cancel As Integer)
UnHookWndProc Me.Hwnd
End Sub

Ensuite, tu ajoutes un module à ton composant, et tu y colles le code :

' ---------------------------------------------------------------------
Option Explicit

Private Declare Function SetWindowLong Lib "user32" Alias _
"SetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Const GWL_WNDPROC = (-4)

Private Declare Function CallWindowProc Lib "user32" Alias _
"CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
ByVal hWnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_NCACTIVATE = &H86


Private lpfnOld As Long

Public Sub HookWndProc (hWnd as Long)
lpfnOld = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Public Sub UnHookWndProc(hWnd as Long)
SetWindowLong hWnd, GWL_WNDPROC, lpfnOld
End Sub

Public Function WindowProc(ByVal hWnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Select Case uMsg
Case WM_NCACTIVATE
If wParam = 0 Then
view.Hide
End If
End Select
WindowProc = CallWindowProc(lpfnOld, hWnd, uMsg, wParam, lParam)
End Function
' ---------------------------------------------------------------------

ATTENTION : lorsqu'on sous classe les messages, il est d'une part
impossible de mettre des points d'arrêt, de tracer le code, et en cas
d'erreur => gros plantage de l'IDE VB. Deux solutions :

- Tu ne mets le hook en place que lorsque tout le reste est bon
- Tu utilises la dll 'DbgWProc.dll' (Debug Object for AddressOf
Subclassing), téléchargeable ici :

http://www.mvps.org/vbvision/Sample_Projects.htm#Subclass_Demo_(Advanced)

avec un exemple de mise en oeuvre (Procèdure 'SubClass' dans
cSubClass.cls, avec constante de compilation conditionnelle DEBUGWINDOWPROC)


PS : Comme l'a fait remarquer Jean-Marc, essaie de faire des projets
portables d'une machine à l'autre. Deux autres conseils, si je puis me
permettre :

Ajoute 'Option Explicit' en début de code, cela force la déclaration
des variables. Et peux se faire automatiquement :

Outils => Options => Onglet 'Editeur' => Cocher 'Déclaration
obligatoire des variables'

Type tes variables. Quand tu déclares :

Dim s, nblig, haut

les 3 sont de type Variant, ce qui n'est pas la meilleure des choses.

Bon courage ;-)

--
Cordialement,

Jacques.
Avatar
Jean-Marc
"Jacques93" a écrit dans le message de
news:%23F$tu$%
Bonjour Touti,
TouTi a écrit :



Outils => Options => Onglet 'Editeur' => Cocher 'Déclaration
obligatoire des variables'

Type tes variables. Quand tu déclares :

Dim s, nblig, haut

les 3 sont de type Variant, ce qui n'est pas la meilleure des choses.



Hello,

Je rebondis sur ce que disait Jacques sur la déclaration
des variables, et en particulier des choses comme
Dim i, j, k

Le petit exemple suivant est un grand classique et la
question est très souvent posée ici:

' 8<----------------------------------
' CODE VOLONTAIREMENT ERRONE
'
Private Sub Command1_Click()
Dim i, j As Integer

i = 3 / 2
j = 3 / 2

If i = j Then
MsgBox "ouf, ils sont égaux!"
Else
MsgBox "Je ne comprend rien, ils ne sont pas égaux :-(((("
End If
End Sub
' 8<----------------------------------

Dans ce cas, i et j ne sont pas des entiers. La variable i est ici
un variant et c'est une grande source d'erreurs.

La syntaxe correcte est bien sur:

Dim i As Integer
Dim j As Integer
ou
Dim i As Integer, j As Integer

Il faudrait peut être ajouter un petit mot à ce sujet dans la FAQ.

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
TouTi
Jacques et Jean marc

Effectivement, j'ai travaillé sur ce projet que j'ai récupéré sur le net...
Je ne me suis occupé que de la partie affichage des images.. mais je vous
remercie de vos remarques et de votre aide si précieuse...

TouTi