Module avec contrôle

Résolu
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 - 24 févr. 2008 à 19:33
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 25 févr. 2008 à 15:59
Bonjour,



Je me lance dans la création d'un contrôle et je voudrais y ajouter un module pour les routines graphiques et leurs API afin de ne pas surcharger le code.



Dans le module du code de ce contrôle j'utilise With UserControl, mais dans un module externe cela ne fonctionne pas.
Donc voici ma question comment faire référence à un contrôle dans un autre module avec ou sans With ?



dans le module du contrôle j'ai ceci :
With UserControl
 .Cls
  
  If mCoin > 0 Then   '   coin avec arrondi variable
     region = CreateRoundRectRgn(0, 0, .ScaleWidth , .ScaleHeight + 1, mCoin,  mCoin)
     Call SetWindowRgn(.hWnd, region, True)
     Call DeleteObject(region)
   End If
        
   If mBiseau_Epaisseur > 0 Then Call BISEAU   > vers un autre module
   If mGradient_Style>0  Then call GRADIENT    > 
   If LenB(mTexte) > 0 Then Call TEXTE         >
   If etc...                                   >
   If etc...                                   >

   .Refresh
End With
    



Merci de votre aide et bonne soirée.



Cheyenne

11 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
25 févr. 2008 à 12:42
salut,

ou tu veux lire trop vite, ou tu veux pas chercher avec mes messages, ou tu veux juste la réponse toute cuite...

ActiveControl? rien à faire là!

Call RoundRect(.hdc,....
si tu appelles une API qui a besoin du device context (hdc), il faut lui donner....
donc dans ton UC tu as du faire
public property get hDC as long
hDC=usercontrol.hdc
end property

n'est-ce pas?!!!

ok je teste en direct...

nouveau projet exe standart, uen form, un usercontrol, un module standart
(çà serait pareil en OCX)

'   FORM1
'   contient un bouton et une instance de l'UC
Option Explicit

Private Sub Command1_Click()
    UserControl11.TEST
End Sub

'=================================

'   MODULE1
Option Explicit
Private Declare Function RoundRect Lib "gdi32" (ByVal hDC As Long, ByVal X1 As Long, ByVal Y1 As
Long, ByVal X2 As Long,
ByVal Y2 As Long, ByVal X3 As
Long, ByVal Y3 As Long)
As Long

Public Sub TOTO(ByRef objUC As Object)
    With objUC
        .Cls
        Call RoundRect(.hDC, 0&, 0&, .ScaleWidth, .ScaleHeight, 16&, 16&)
    End With
End Sub '<- et pas END IF :)

'=================================

'USERCONTROL1
Option Explicit

'PROPRIéTéS
!!!!
Public Property Get hDC() As Long
    hDC = UserControl.hDC
End Property
Public Property Get ScaleWidth() As Single
    ScaleWidth = UserControl.ScaleWidth
End Property
Public Property Get ScaleHeight() As Single
    ScaleHeight = UserControl.ScaleHeight
End Property

'INIT
Private Sub UserControl_Initialize()
    UserControl.BackColor = vbWhite
    UserControl.ScaleMode = vbPixels
End Sub

'MéTHODES
!!!!
Public Sub TEST()
    Call TOTO(UserControl.Extender)
End Sub
Public Sub Cls()
    UserControl.Cls
End Sub

qu'est-ce que çà donne?

c'est à toi de remonter les propriétés qui te seront nécessaires dans le module.
ni hdc, ni scalewidth ni quoi que ce soit n'échappe à cette obligation!

c'est bien ce que je disais dans le 2e message non?

let pour recevoir (oups j'avais mis let alors qu'on envoie), get pour envoyer/donner l'accès

ps : utilises les API plutôt que LINE etc....
le but étant une clareté et d'éviter les lignes de code dans l'UC, passe par les API en relayant juste hdc, hwnd, backcolor, forecolor, clear (cls) et les scalewidth et height.
tu n'as logiquement besoin de rien d'autre

++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
25 févr. 2008 à 15:59
pour line c'est un peu particulier, à cause des expressions comme les parenthèses et les moins, que tu ne pourras pas reproduire...

si tu pars toujours à partir de (0,0)-, alors tu peux faire une méthode du genre :
Public Sub Line(ByVal X As Single, ByVal Y As Single)
    UserControl.Line (0, 0)-(X, Y)
End Sub

que tu appelleras simplement par .line TON_X, TON_Y
++ ;)
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
24 févr. 2008 à 20:38
salut,

euh... le module du controle?

un module est un module, un controle est un control...
tu veux dire la procédure du controle?
le module de l'ocx contenant le controle?

à supposer la dernière proposition, il faut différencier 2 choses :
*le usercontrol (qui contient ton code)
*l'instance de ton UC (qui execute ton/son code)

si tu veux que toutes tes instances puissent aller chercher une procédure qui va s'exécuter sur.. eux-même, çà va donner quelque chose dans ce goût là :

'MODULE
public sub biseau(byref oUC as object)
'blabla
end sub

'UC
call biseau(usercontrol.extender)

à mon avis c'est là que ton problème se situait...
++
PCPT [AFCK]
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
24 févr. 2008 à 20:51
Bonjour PCPT,

Merci pour ta réponse.

En effet je me suis mal exprimé, oui il s'agit bien du module de l'ocx contenant le contrôle, c'est de là que j'appelle les routines situées dans le/les autres module(s) contenu(s) dans le projet de l'ocx.

Je vais tester ta proposition

call biseau(usercontrol.extender),
c'est celà que je désirais savoir.

Pour l'instant je vais aller dîner et je te dirais plus tard ce qu'il en est en espérant valider ta réponse, HI.

Merci encore,
Cheyenne

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

Posez votre question
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
24 févr. 2008 à 23:20
Re,


Hélas, cela ne fonctionne pas. J'ai des messages en retour comme quoi l'objet ne gère pas les méthodes.


Dans le module appellé à parir du code de l'UserControl :


Public Sub Biseau(ByRef objUC as Object)
   Dim machin as Truc


   With objUC
      if mBiseau_Style=[En relief] then
         .ForeColor=              pas bon
         Line(0,0)-(x,y)          pas bon
         ou
         obUC.Line(0,0)-(x,y)   pas bon non plus
         blabla
      end if
   End With


   machin=
   blabla
 End sub


D'autre part les variables de stockage des valeurs du contrôle ne sont pas reconnues. Elles sont déclarées Public, que ce soit dans un module ou dans le code du contrôle, c'est pareil.

Je vais finir pas tout remettre dans le code du contrôle, HI, Cela fonctionnait nickel...


Merci quand mëme, @+


Cheyenne
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
25 févr. 2008 à 00:03
normal, comme le dit le message : l'objet ne gère pas les méthodes

exemple pour forecolor, il faut forcément que tu relayes la propriété

public property let forecolor as long
forecolor=usercontrol.forecolor
.....

pareil pour line et pour toute propriété ou méthode normalement accessible par le usercontrol lui-même, puisque c'est une instance qu'on passe en paramètre

et pour les variables comme mBiseau_Style (si elle est bien PUBLIC), tu as oublié le . avant

++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
25 févr. 2008 à 01:27
Merci de l'aide, je mets cela en oeuvre demain, (enfin aujourd'hui quand tu me liras). Je ne connaissais pas le Public Property à déclarer pour pouvoir utiliser les méthodes et/ou propriétés du contrôle.


Quant au point oublié, c'est vraiment bête de ma part car je travaille le plus souvent possible avec With. On y gagne en clarté pour le code, mais en vitesse je ne sais pas.


Demain je valide ta réponse, enfin je l'espère si je ne fais pas encore de bourdes dans le code.


Bonne journée à toi.


@+ Cheyenne
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
25 févr. 2008 à 12:02
Bonjour PCPT,



A mon grand désapointement, je suis toujours en rade...

Toujours le même problème, l'objet ne gère pas, etc...



Dans le code du contrôle :
   Call TOTO((UserControl.ActiveControl)

Procédure appelée dans un module pour le graphisme :

Public Sub TOTO(ByRef objUC as Object)
   ---
   With objUC


      ---
      Call RoundRect(.hdc, 0, 0, .ScaleWidth , .ScaleHeight, 16, 16)
      ---
   End With
   ---
End If
Par contre dans le code du contrôle avec With UserConrol, c'est bon



objUC.Line(x1,y1)-(x2,y2) ou Line (x1,y1)-(x2,y2) ne marche pas non plus, l'objet ne gère pas. Il en résulte que depuis le module je ne peux rien dessiner sur le contrôle.

Tu me parlais des Public Property Let
Tout cela avec les Get sont dans le code du contrôle en Public.

@+ Cheyenne
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
25 févr. 2008 à 14:13
Re,


Ok, ne te fâches pas. Je ne cherche pas du code tout fait, loin de là, mais simplement des explications et/ou la correction du code.


Je ne savais pas qu'il fallait aussi mettre dans le code de l'UC les Property Get pour le hDc, ScaleWidth, etc... du fait que lorsque j'appelle les API depuis le code de l'UC, ça marche.


Mais maintenant que j'ai un module, c'est effectivement différent, il faut bien récupérer ces paramètres. Je croyais naïvement pouvoir en disposer avec le With objUC mais puisqu'ils ne sont pas récupérés depuis l'UC comme tu me l'indiques, ils ne sont donc pas passés avec usercontrol.extender. (J'avais mis ActiveControl pour essais).
Pour le End Sub à la place du End If, c'est une erreur car je n'ai pas fait de copier-coller du code.


J'avais bien pensé à passer les hDc et autres en paramètres, mais c'était pour éviter de les écrire à chaque fois. De toutes façons if faut qu'ils figurent quelque part, soit en passage de paramètres soit dans les Property.


Je tiens à préciser qu'avant de poster, j'avais chercher sur le site et le Net des exemples de contrôles, mais je n'en ai pas trouvé avec des modules comme je souhaite faire. En général ces modules contiennent les API ou travaillent avec les hDc passées en paramètes, comme tu me le suggère.


Je vais essayer ultérieurement le code d'essai que tu m'as envoyé et en tirer tous les enseignements. Mais pour l'instant il faut que je m'absente(étant à la retraite je suis surbooké, HI)


Je te tiens au courant et encore merci de ta disponiblité.


Cheyenne
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
25 févr. 2008 à 15:08
je ne suis pas fâché ne t'en fait pas ^^
c'est juste que c'est ce que j'expliquais au début (différence entre usercontrol et instance du usercontrol) mais je n'ai peut-être pas été assez clair

en fait comme tu passes une instance en paramètre (et tu n'as pas le choix), le module n'a accès qu'à la même chose que ce que tu pourrais voir dans la fenêtre de propriété en posant l'UC à partir la form.
donc width et height par exemple sont accessibles.
scalewidth (par défaut) ne l'est pas...
visible est accessible, alors que l'UC lui (dans le code de l'UC) n'y a pas accès

j'espère que je me suis un peu mieux expliqué ;)
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
25 févr. 2008 à 15:10
C'est excellent.



J'ai compris pour les Get, il en faut obligatirement un par propriété (comme tu me l'as indiqué) si l'on veut disposer de celle-ci dans un module et le fait de ne pas mettre le Let correspondant permet uniquement de lire la propriété.

Je vais abuser, pour information si je veux absolument utiliser Line ou Circle sans passer par une API, comment dois-je m'y prendre dans le module. ?

Du coup, je valide ta dernière réponse car c'est la plus complète et la plus explicite.(du moins pour moi !)

Merci à toi et bonne continuation.

Bien amicalement de Cheyenne
Rejoignez-nous