[VB6] Propriété Index dans control utilisateur [Résolu]

jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 14 janv. 2008 à 08:40 - Dernière réponse : PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention
- 14 janv. 2008 à 14:30
'Lut all,

Et bonne année 2008 à ceux que je n'aurais pas encore croisé.

Bon commençons l'année par une question (j'espère que je vais réussir à ce qu'elle soit claire)

-Avec VB6 SP6 + W2K
je développe une petite bibliothèque de contrôles pour le taf Et je rencontre le problème suivant:

1-J'ai deux UC appelons les UcPanel  et UcArticle
2-UcArticle contient un UcPanel dont la propriété Index est à 0 (je veux en charger plusieurs par la suite dynamiquement)
3-Dans le code je veux utiliser une boucle du genre
   For Each pn In UcPanel
       MsgBox pn.Index
   Next , ----
[code.aspx?ID= 41455 By Renfield]
Et le problème:
UcPanel ne contient pas de propriété Index.

Ce que je ne comprends pas c'est que si:

1- UcPanel  se trouve dans un fichier .ocx
2- UcArticle se trouve dans un projet a part => PAS DE PROBLEME.

Je pourrais avoir les deux séparés, ce n'est pas un souci (si je ne trouve pas de solutions).Mais franchement j'aimerais comprendre.

Ce problème m'a fait penser à plusieurs discutions où [auteur/MORTALINO/647037.aspx mortalino] (WHERE ARE YOU?), proposait une solution

Public Function NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Attribute NewEnum.VB_MemberFlags = "40"
  Set NewEnum = NomDeTaCollection.[_NewEnum]
End Function , ----
[code.aspx?ID=41455 By Renfield]
Mais hélas si c'est bien la piste à suivre je ne comprends pas pourquoi cela fonctionne dans deux projet à part.

J'aimerais bien fouiller les sources disponible mais hélas je ne peux pas télécharger les ZIP des sources.

SI quelqu'un pouvait éclairer ma lanterne (en espérant avoir été assez clair dans mes propos)
En attendant je vais continuer à fouiller le WEB.
D'avance merci de me prêter un peu de votre temps

@+: Ju£i?n
Pensez: Réponse acceptée
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 14 janv. 2008 à 13:48
3
Merci
1- UcArticle = Form=> si je suis ton raisonnement c'est la que je me trompe?



c'est bien çà, pas de souci

2- PnlEntete = Cmd1
oui (nomenclature de bouton indexé donc traité comme collection d'objets instanciés)

3- UcPanel = Btn
oui (modèle de contrôle / classe, donc type)

J'ai bien a chaque fois

un conteneur                             UcArticle             Form

un groupe de controle               PnlEntete             Cmd1

un type de Controle?

on est d'accord aussi

Et dans ce cas pourquoi cela fonctionne en faisant (..) Avec ce code dans UCArticle
beh c'est surement parce que là on ne part plus sur le même modèle ^^


forcément en mettant ton code dans UcArticle (le conteneur), alors on a
accès de suite à ce qui est posé dessus, tout comme des contrôles sur
une Form


c'est là où j'ai dû mal comprendre...

pourtant à la relecture tu as bien précisé DANS UcArticle.


ok....

'  
UcArticle
Option Explicit

Private Sub Command1_Click()
'    PnlEntete(0).Test2
    Dim Pnl As Object

    For Each Pnl In UserControl.Controls
        If TypeOf Pnl Is UcPanel Then
            MsgBox Pnl.Name & "(" & Pnl.Index & ")"
        End If
    Next
End Sub


c'est bien les contrôles qui sont sur "nous" (l'instance de UcArticle)


comme çà le serait sur une Form

là çà fonctionne !


alors pourquoi le code ci-dessous fonctionne pour un bouton et pas pour ton usercontrol ?
Dim Pnl As UcPanel

For Each Pnl In PnlEntete

   MsgBox Pnl.Index

Next


justement parce que le bouton est compilé

qu'est-ce qui dit (par exemple) que tu ne vas pas passer UcPanel en contrôle privé ou autre....

c'est une supposition ok,  mais c'est VB qui empêche (ou qui diffère)
le traitement de collection par rapport au nom du contrôle puisqu'en
effet, en groupe de projets ou ocx le code ci-dessus fonctionne


même projet : usercontrol sur container = > PnlEntete est considéré comme usercontrol

2 projets : usercontrol sur container => PnlEnteteest considéré comme collection


quelque part c'est normal puisque c'est bien VB qui gère la collection,
on a aucun moyen de modifier un index et cette propriété n'apparaît
jamais...

donc logique que l'objet soit défini pour que VB puisse le traiter comme modèle, non?


tant que ce n'est pas le cas, on doit passer par toutes les instances une à une manuellement (par In UserControl.Controls)


j'espère ne pas t'avoir encore plus embrouillé ^^
(ps : béni soit le presse-papier )
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp

Merci PCPT 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 119 internautes ce mois-ci

Commenter la réponse de PCPT
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 14 janv. 2008 à 11:43
0
Merci
salut Julien,

euh... j'avoue ne pas bien saisir d'après ton code.

UcArticle est le conteneur
UcPanel(X) les contenus

3-Dans le code je veux utiliser une boucle du genre
dans quel code? logiquement ce code serait à placer dans le conteneur pour manipuler les controles qu'il porte

mais dans ce cas In UcPanel n'as pas de sens
UcPanel a beau être une collection, on ne peut pas considérer qu'il se contient lui même

donc dans ce cas çà serait IN UCARTICLE
mais UCARTICLE (le conteneur) est l'objet, la classe plutôt.
il faut travailler sur l'objet instancié

çà donne :

    Dim pn As Control
    For Each pn In UserControl
        'On Error Resume Next
        Debug.Print pn.Name & "(" & pn.Index & ")"
   Next

et si ta demande est de mettre ton code dans la form,  par chance ce n'est pas possible (par défaut).
UcArticle sera un unique controle, peut importe ce qu'il contient
çà serait à toi de faire un membre ou méthode de communication pour y accéder

j'suis passé à côté de quelquechose?
++ ;)
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Commenter la réponse de PCPT
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 14 janv. 2008 à 11:56
0
Merci
Salut [auteur/PCPT/401740.aspx PCPT] , et merci d'avoir pris le temps pour essayer de comprendre mon problème.

Alors je vais essayer d'être plus clair.

- UcArticle et UcPanel  sont dans le meme projet OCX
- Mon UcArticle est le conteneur d'un groupe de contrôle PnlEntete de type  UcPanel (PnlEntete(0), PnlEntete(1), PnlEntete(2))
- Dans UcArticle J'aimerais mettre à un moment

Dim PnlAs UcPanel

For Each PnlIn PnlEntete
   MsgBox Pnl.Index
Next, ----
[code.aspx?ID= 41455 By Renfield]

Tout comme dans un formulaire on ferait avec un formulaire (et qui fonctionne) contenant un groupe de controle Cmd1 de type CommandButton
On peux mettre pour balayer le groupe de controle.
Dim Btn As CommandButton

For Each Btn In Cmd1
   MsgBox Btn.Index
Next, ----
[code.aspx?ID =41455 By Renfield]

Voila ce que je souhaiterais faire. Je sais qu'il serait possible d'utiliser les Méthodes LBound et Ubound d'un groupe de controle. mais j'aimerais savoir pourquoi avec index cela ne marche pas.

@+: Ju£i?n
Pensez: Réponse acceptée
Commenter la réponse de jrivet
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 14 janv. 2008 à 12:30
0
Merci
re,

on en revient donc à ce que je t'indiquais :
For Each Pnl In PnlEntete n'a pas de sens dans ce cas de figure

tu compares (à juste titre) avec For Each Btn In Cmd1
ok! mais le code n'est pas DANS CommandButton mais bien dans Form1

dans UcArticle je poste 3 instance de UcPanel nommés PnlEntete indéxés de 0 à 2, et un bouton

'  
UcArticle
Option Explicit

Private Sub Command1_Click()
    PnlEntete(0).Test
End Sub

'-------------------------------

'   UcPanel
Option Explicit

Public Sub Test()
    Dim Pnl As Object
    
    For Each Pnl In UserControl.ParentControls
        If TypeOf Pnl Is UcPanel Then
            MsgBox Pnl.Name & "(" & Pnl.Index & ")"
        End If
    Next
End Sub

++ ;)
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Commenter la réponse de PCPT
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 14 janv. 2008 à 12:42
0
Merci
Re,

Et encore merci, vraiment, pour perdre un peu de temps.

Non vraiment je ne comprend pas.
Pourquoi ne peut ton pas faire cette analogie? pourquoi n'a t elle pas de sens?

1- UcArticle = Form=> si je suis ton raisonnement c'est la que je me trompe?
2- PnlEntete = Cmd1
3- UcPanel = Btn

J'ai bien a chaque fois Un conteneur UcArticle et Form un groupe de controle PnlEntete et Cmd1 et un type de Controle?

Et dans ce cas pourquoi cela fonctionne en faisant

'PnlEntete toujours le groupe de controle
'de type UcPanel contenu dans UcArticle
'Avec ce code dans UCArticle
Dim i As Integer
For i = PnlEntete.Lbound To PnlEntete.Ubound
   'peu d'intéret puisque Index = i mais
   'c'est pour l'exemple
   MsgBox PnlEntete(i).Index    'D'ailleurs en ouvrant la parenthese il marqe Item(Integer) As _UcPanel
Next, ----
[code.aspx?ID=41455 By Renfield]

Je dois être bête à manger du foin mais je pensais pouvoir faire ceci plus facilement.

PS: je n'ai pas tres bien compris
"ok! mais le code n'est pas DANS CommandButton mais bien dans Form1"
@+: Ju£i?n
Pensez: Réponse acceptée
Commenter la réponse de jrivet
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 14 janv. 2008 à 13:57
0
Merci
Re,
Bon et bien je crois que ce complément de réponse doit être celui que j'attendais (c'est pas qu'il m'arrange mais il faut s'y faire tant pis).:

"justement parce que le bouton est compilé
qu'est-ce qui dit (par exemple) que tu ne vas pas passer UcPanel en contrôle privé ou autre....

c'est une supposition ok,  mais c'est VB qui empêche (ou qui diffère)
le traitement de collection par rapport au nom du contrôle puisqu'en
effet, en groupe de projets ou ocx le code ci-dessus fonctionne"

Je vais donc passer par deux .OCX et puis ca ira bien.
Encore merci pour ton attention.

PS: C'étais bien toujours dans UCArticle que je placais le code.
@+ Sur le forum : Ju£i?n
Pensez: Réponse acceptée
Commenter la réponse de jrivet
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 14 janv. 2008 à 14:30
0
Merci
çà peut être lié aussi au fait que la propriété Public est forcément false en exe, et forcément True en ocx s'il n'y a qu'un seul usercontrol

comment VB pourrait-il faire une collection de contrôles qu'il ne peut (techniquement) voir

++ bon courage 
Commenter la réponse de PCPT

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.