IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

[VB6] load de shapes dans une classe ? (pour faire des contours)


Sujet :

VB 6 et antérieur

  1. #1
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut [VB6] load de shapes dans une classe ? (pour faire des contours)
    Bonjour,
    voilà je reviens faire un peu de VB6 (mon 1er amour) après avoir fait pas mal de C++ et autres PHP ces dernieres années, donc du coups quand je veux faire un truc qui "ressemble" à de la POO en VB6, je suis un peu rouillé, donc je demande votre aide.

    Voilà avant tout je vous explique le besoin :
    j'ai une appli avec plein de controles differents (dont des controles utilisateurs:vbaccelerator) et il faut que je dessine une simple bordure (type shape) et il n'est pas questions d'utiliser les bordures 3D standard (c'est non negociable...)
    tous les controles ont des proprietes left,top, width...
    ils sont dynamique (peuvent changer de taille/place) mais je sais quand c'est fini (quand ils ne bougent plus).

    Maintenant la réalisation :
    je pars sur l'utilisation du shape (qu'il faut mettre autour des controles en questions).
    Alors, me voilà partie dans un délire, ou je me serais bien vu créer une classe CBordure, avec une methode ("function" ont dit en VB6 hein) pour assigner mon objet bordure à mon controle et enfin une deuxieme methode pour mettre a jour le dessin (disp). la classe gererait un shape qu'il aurait créée dynamiquement (lors du assigne() ) et dont il possitionnerait au bon endroit et avec les bonnes taille lors du disp()

    en gros un truc qu'on pourrait utiliser de la maniere suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bord1 = NEW CBordure
    bord1.assigne(ListView1)
    '... et puis...
    bord1.disp()
    bon, voilà... il ne manque plus que std::vect pour que ca ressemble au C++ il ne faut pas rever non plus...

    bon, me voilà parti..
    je crée la classe, je crée la fonction assigne...
    mais là, le drame.. ha ben oui en VB6 le chargement dynamique d'objet (donc de shape) ca ne passe pas avec un new ? javais oublié ca, bon il y a "load" pour celà...
    ha oui il faudrait aussi lui passer le form où l'afficher ?... bon bref, je coince, il y a quelques année j'aurai mis peut être deux ou trois heure, là j'ai même un doute sur la faisabilité.

    voilà, un brouillon de ce qu'il y a dans la classe : (attention c'est pas joli joli..)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Private obj As Object
    Private hsh As Shape
     
    Private Sub Class_Terminate()
        Unload hsh ' on nettoye...
    End Sub
    Public Function assigne(o, f As Form)
        obj = o
        hsh = load f.shape(n) ' a gerer : un compteur <n> pour load
    End Function
     
    Public Function disp()
        hsh.Left = o.Left - 15     ' contour autour (15twips=1px)
        hsh.Top = o.Top - 15      ' pour l'instant je trav en twips
        hsh.Width = o.Width + 30 ' on vera par la suite...
        hsh.Height = o.Height + 30
        hsh.Visible = True
    End Function
    Ps : je crains de ne pas pouvoir faire de LOAD en dehors d'un module de form?....

    merci de vos conseils et votre aide.

  2. #2
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 091
    Points : 16 634
    Points
    16 634
    Par défaut
    Je n'avais jamais utilisé de module de Class
    Il y en a qui vont trouver ce code degeu..., mais si cela peut faire avancer le schmilblic
    Dans un module de classe nommé ClassBorder
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Option Explicit
    Dim NameCtrl As String
    'ClassBorder.
    Public Function Assign(PassCtrl As Control, Frm As Form) As Shape
    'pour changer le nom a chaque appel, ***** reste que si dynamiquement tu supprime des
    'control sur ton Form, risque de nom identique ****
    NameCtrl = "Assign" & Frm.Controls.Count
    Set Assign = Frm.Controls.Add("VB.shape", "Assign" & Frm.Controls.Count)
    With Assign
        .BackColor = 0
        .BackStyle = 0
        .BorderColor = &HFF&
        .BorderStyle = 1
        .BorderWidth = 3
        '.Container 'en lecture seule
        .DrawMode = 13
        .FillColor = &HFFFFFF
        .FillStyle = 1
        '.Index'en lecture seule
        '.Name'en lecture seule
        '.Parent 'en lecture seule
        .Shape = 4
        .Tag = ""
        .Top = PassCtrl.Top - 15
        .Left = PassCtrl.Left - 15
        .Height = PassCtrl.Height + 45
        .Width = PassCtrl.Width + 45
    End With
    Assign.Visible = True
    End Function
    Sur un Form, 2 CommandButton et un ListBox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Option Explicit
     
    Private Sub Form_Load()
    Dim Bordur As New ClassBorder
    Bordur.Assign Command1, Me
    Bordur.Assign Command2, Me
    Bordur.Assign List1, Me
    Set Bordur = Nothing
    End Sub
    Soyez indulgent, et vue l'heure ou je post, ne rigolez pas trop fort.

  3. #3
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Bonsoir
    Je ne vois pas ou est le problème,à première lecture ton code est bien parti.
    Mais pour créer une interface visible sur une form, il va te faloir descendre très bas dans la couche windows. Création d'une fenetre, gestion de sa file de message, etc.

    Et pour répondre à progelect (bonsoir au passage), ton code n'a rien de risible, c'est même du bon boulot.

  4. #4
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par ProgElecT Voir le message
    Je n'avais jamais utilisé de module de Class
    Je n'avais jamais utilisé Controls.Add()... comme quoi. (pour créer un controle en dynamique je lui mettait la propriete index à zero et je faisait des load truc(1) ...)


    j'imagine qu'il y a un moyen de supprimer ce controle (un peu comme quand on fait un unload) avec Controls.Remove(Assign) a mettre dans le destructeur de la classe : Class_Terminate()
    et comme ca, c'est parfait !

    ha en fait tu gere une collection, je viens de comprendre... super.
    en fait pour être precit, ta classe represente une collection, alors que j'etais parti pour representer un shape (oui il fallait que je fasse plusieurs instances, même pas peur) mais avec l'idée de la collection c'est pas mal.
    Sinon en partant sur mon systeme il faudrait que la collection soit en "static" (je ne sais pas si en VB6 on peu le faire) pour eviter d'avoir une collection instancié a chaque fois... peu inporte, je pars sur ta classe...


    PS : finalement j'ai gouté aux module de class il y a peu de temps (apres avoir testé d'autre language) j'avoue que c'est interessant... mais j'avais reussi à m'en passer durant des années

    Citation Envoyé par ProgElecT Voir le message
    Il y en a qui vont trouver ce code degeu..., mais si cela peut faire avancer le schmilblic
    pas du tout degeu, franchement merci, tu as carrement réaliser la classe necessaire a mon besoin, c'est vraiment super.
    Merci.

    Citation Envoyé par Delbeke Voir le message
    Bonsoir
    Je ne vois pas ou est le problème,à première lecture ton code est bien parti.
    Merci, c'est trop de compliments, mon probleme etait que j'etais bloqué a cause du load que j'utilisais pour "instancier" un shape, je n'arrivait pas a faire un load car il me semble que c'est reservé aux module de form.
    ProgElecT a astucieusement remplacé le load par un controls.add (plus pleins d'autres petits details)

    Merci a vous, a+

  5. #5
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    voilà, je suis complement parti sur le systeme de ProgElecT (ne pas instancier ma classe a chaque controle), et ca donne le code suivant :
    en esperant que ca puisse depanner qqun, j'ai commenté un peu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    Option Explicit
    'données membres :
    Private frm As Form ' le formulaire, une fois pour toute
    Private nbctrl As Long ' le nb de controle, pour le nommage
     
    ' objet de la classe : on instancie un objet pour chaque form, puis on assigne
    ' les controles à décorer d'une bordure, et voilà.
     
    'le constructeur. (appellé au "new")
    Private Sub Class_Initialize()
        nbctrl = 0
    End Sub
     
    'ha... si seulement on pouvait passer le formulaire dans le contructeur....
    Public Sub setForm(ByRef f As Form)
        Set frm = f
    End Sub
     
    'decorer un controle avec le border... retourne le shape dynamiquement créée
    Public Function Assign(PassCtrl As Control) As Shape
        Dim NameCtrl As String
        nbctrl = nbctrl + 1
        NameCtrl = "AutoShape" & nbctrl
    '    Debug.Print NameCtrl
        Set Assign = frm.Controls.Add("VB.shape", NameCtrl)
        PassCtrl.BorderStyle = 0
        With Assign
          .Tag = NameCtrl  ' le nom.
          .BackStyle = 0   ' transp
          .BorderColor = &H5A5A5A ' gris
          .BorderStyle = 1 ' solid
          .BorderWidth = 1 ' 1px
          .DrawMode = 13   ' copy-pen
          .FillStyle = 1   ' transp
          .Shape = 0       ' rectangle
          .TOp = PassCtrl.TOp - 15
          .Left = PassCtrl.Left - 15
          .Height = PassCtrl.Height + 30
          .Width = PassCtrl.Width + 30
          .Visible = True
        End With
    End Function
     
    'le destructeur.
    Private Sub Class_Terminate()
        'on laisse au form le soin de supprimer
        'les ctrl dynamique. donc rien a faire.
    End Sub
    alors bien sur, cette classe ne fait pas tout
    par exemple si le controle se deplace... mais on peut facilement retrouver le shape correspondant au controle dans frm.controls si on prends soin de recup le nom de celui-ci (dans le tag du shape) que l'on peut placer dans le tag du passctrl par exemple... mais pour l'instant ca me suffit.


    Et donc ca s'utilise ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim Bord As New CBordure
    Bord.setForm Me
    Bord.Assign Text1
    Bord.Assign Listview1
    Bord.Assign Combo1
    un grand merci ProgElecT

  6. #6
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 091
    Points : 16 634
    Points
    16 634
    Par défaut
    J'ai bien vue RESOLU, mais je voudrai t'indiquer que si le cadre a dessiner suivant le control passé dans la function et que ce control est dans un autre container que le fond du Form, il est dessiné (le cadre) sur le fond du Form, vois le code auquel j'arrive de mon coté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Set Assign = Frm.Controls.Add("VB.shape", "Assign" & Frm.Controls.Count)
    With Assign
        .BackColor = 0
        .BackStyle = 0
        .BorderColor = &H0&
        .BorderStyle = 1
        .BorderWidth = 4
        Set .Container = PassCtrl.Container '<==== l'ajout *************

  7. #7
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    Salut 3 ans aprés, je tombe sur un projet utilisant cette classe, et en suivant le lien dans mon code, je redecouvre que c'est moi qui l'ai fait !!! incroyable !
    bref, j'en profite pour ajouter une ptit methode toute simple pour signaler un changement de position du control initial, j'en profite pour liberer l'utilisation du Tag, pour un ptit tableau de gestion interne (avec allocation dynamique svp, un peu a l'arrache, mais efficace)
    maintenant quand on connais le nom du controle on peut facilement retrouver son shape associé.
    voilà le travail :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    Option Explicit
    'données membres :
    Private frm As Form ' le formulaire, une fois pour toute
    Private nbctrl As Long ' le nb de controle, pour le nommage (et le suivis)
     
    Private Type noms
      ctrl As String
      shape As String
    End Type
    Dim liens() As noms ' le tableau de suivis
    ' objet de la classe : on instancie un objet pour chaque form, puis on assigne
    ' les controles à décorer d'une bordure, et voilà.
     
    'le constructeur. (appellé au "new")
    Private Sub Class_Initialize()
        nbctrl = 0
        ReDim liens(10) As noms ' commence par un tableau de 10 liens.
    End Sub
     
    'ha... si seulement on pouvait passer le formulaire dans le contructeur....
    Public Sub setForm(ByRef f As Form)
        Set frm = f
    End Sub
     
    'decorer un controle avec le border... retourne le shape dynamiquement créée
    Public Function Assign(PassCtrl As Control) As shape
        Dim NameCtrl As String
        On Error Resume Next
        nbctrl = nbctrl + 1
     
        NameCtrl = "AutoShape" & nbctrl
     
        ' on augmente le tableau de 10 en 10... ce tableau garde les liens en memoire...
        If nbctrl Mod 10 = 0 Then ReDim Preserve liens(nbctrl + 10) As noms
        liens(nbctrl).ctrl = PassCtrl.Name
        liens(nbctrl).shape = NameCtrl
     
        Set Assign = frm.Controls.Add("VB.shape", NameCtrl)
        PassCtrl.BorderStyle = 0
     
        With Assign
    '      .Tag = NameCtrl  ' le nom. '<=== plus besoin d'utiliser TAG
          .BackStyle = 0   ' transp
          .BorderColor = &HA5A5A5 ' gris
          .BorderStyle = 1 ' solid
          .BorderWidth = 1 ' 1px
          .DrawMode = 13   ' copy-pen
          .FillStyle = 1   ' transp
          .shape = 0       ' rectangle
        Set .Container = PassCtrl.Container
          .TOp = PassCtrl.TOp - 15
          .Left = PassCtrl.Left - 15
          .Height = PassCtrl.Height + 30
          .Width = PassCtrl.Width + 30
          .Visible = True
        End With
    End Function
     
    '<=== ici la nouvelle fonction updatePos
    Public Sub updatePos(PassCtrl As Control)
     Dim shapectrl As shape, i As Long
     For i = 1 To nbctrl
        If liens(i).ctrl = PassCtrl.Name Then
            Set shapectrl = frm.Controls(liens(i).shape)
            shapectrl.Move PassCtrl.Left - 15, PassCtrl.TOp - 15, PassCtrl.Width + 30, PassCtrl.Height + 30
        End If
     Next
    End Sub
     
    'le destructeur.
    Private Sub Class_Terminate()
        'on laisse au form le soin de supprimer
        'les ctrl dynamique. donc rien a faire.
    End Sub
    on appelle donc updatePos(control) quand on vient de deplacer le controle.
    voilà.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Macro pour boucler dans une liste pour faire des tableaux/onglets
    Par Souris1 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/09/2013, 17h25
  2. Créations Shape dans une Classe
    Par Gueuz dans le forum ActionScript 3
    Réponses: 0
    Dernier message: 26/12/2010, 11h26
  3. Une classe pour mouler des instances qui soient des classes
    Par eyquem dans le forum Général Python
    Réponses: 2
    Dernier message: 03/09/2009, 17h09
  4. XI - Extraire une somme dans une periode pour faire une addition
    Par campia dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 06/12/2007, 16h41
  5. Réponses: 4
    Dernier message: 01/06/2007, 19h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo