jrivet
Messages postés7393Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 2012
-
14 janv. 2008 à 08:40
PCPT
Messages postés13280Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 2018
-
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
PCPT
Messages postés13280Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201848 14 janv. 2008 à 13:48
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
PCPT
Messages postés13280Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201848 14 janv. 2008 à 11:43
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
jrivet
Messages postés7393Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 14 janv. 2008 à 11:56
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.
jrivet
Messages postés7393Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 14 janv. 2008 à 12:42
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
jrivet
Messages postés7393Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 14 janv. 2008 à 13:57
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