bonjour,
je souaterais entrer dans une function que je crée un groupe de controles comme paramètre.
le problème est que je ne trouve pas comment le définir: as...?
merci de me dire si vous avez la réponse.
salut![]()
bonjour,
je souaterais entrer dans une function que je crée un groupe de controles comme paramètre.
le problème est que je ne trouve pas comment le définir: as...?
merci de me dire si vous avez la réponse.
salut![]()
Salut
Tu as créé ton groupe de quelle manière? Avec la propriété Index d'une série de contrôles ayant le même nom?
Exemple avec trois textBox (nommés txtTextes et indicés de 0 à 2), un bouton et un label.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Private Function RetournerTexte(Texte As TextBox) As String RetournerTexte = Texte.Text End Function Private Sub cmdAfficherTexte_Click() Static indice As Integer lblTexte.Caption = RetournerTexte(txtTextes(indice)) indice = IIf(indice = 2, 0, indice + 1) End Sub
Salut !
Si c'est un groupe de controles, c'est un tableau donc normalement tu peux l'utiliser comme tel (As TextBox(),...)
+++
Ju
-> zazaraignée: he bien non (désolé), mon problème etais plutot de pouvoirs utiliser différents types de controles à indice.
->Sozie: oui, je suis d'ailleur arrivé à prsque la même conclusion cette nuit (qui m'a porté conseil).pour ta solution, elle n'est même pas accepté par l'éditeur vb. pour ma part, j'ai mis:mais j'ai ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part obj() as control
et il me surligne dans:message d'erreur: incompatibilité de type: tableau ou type attendu par l'utilisateur.si vous avez des idéesCall Debog(Balle1, Obstacle, Me)
merci a tous
J'ai jeté un oeil, je pensais que ce serait plus simple que ça (mieux géré par VB, je veux dire ...)
Après avoir bidouillé un peu, voilà ce que j'ai réussi à faire :
Dans une feuille Form1 contenant :
- 3 textBox, 2 nommées Text1 (indice 0 et 1) et une nommé Text2,
- un bouton Command1,
j'ai placé le code suivant :
Et ça fonctionne !
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 Private Sub remplitMesTextBox(frmA As Form, nomCtrl As String) Dim i As Integer For i = 0 To frmA.Controls.Count - 1 If TypeOf Controls(i) Is TextBox Then If Controls(i).Name = nomCtrl Then Controls(i).Text = "remplit !" End If End If Next i End Sub Private Sub Command1_Click() remplitMesTextBox Me, "Text1" End Sub
Tu peux donc intervenir sur le groupe de contrôle désiré. En affinant (je n'ai pas le temps, sorry), on doit pouvoir intervenir sur les index souhaités avec Controls(i).Index : attention, cette propriété renvoie un erreur si l'on n'est pas sur un groupe de contrôles !
"Ce que l'on conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément." Nicolas Boileau
"Expliquer empêche de comprendre si cela dispense de chercher"
Quiz Oracle : venez tester vos connaissances !
La FAQ Oracle : 138 réponses à vos questions
Aidez-nous à la compléter
Ha! oui, évidemment! Brillant, Xo!
On a fait quelque chose de semblable en classe, en Delphi. Savais pas qu'on pouvait faire ça de manière presqu'identique en VB... J'avais essayé, sans succès... Faut croire que je ne m'y prenais pas de la bonne façon.
Bravo xo!:o
j'aivais envisagé un moment d'utiliser le nom mais j'avais rien trouvé![]()
donc félicittion.
c'est quand même incroyable qu'ils aient rien prévu pour gérer les groupes.
poste ça dans la faq, ça le merite.
merci à tous les autres.
salut![]()
Oups, j'ai parlé trop vite: ton code marche trés bien de manière normale avec un code normal mais en essayant d'adapter ton code à mon programme, je suis tombé sur un nouveau hic: voila mon code (coord et dezone sonts des type pesonalisés, define est une fonctin):
Forcément, en rajoutant ça, le code est plus comliqué...
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 Public Function Debog(balo As Control, Obstacl As String, Form As Form) Dim bal As DefZone Dim obs As DefZone Dim foc As Coord Dim i As Integer Dim a As Integer foc.Y = Form.Height / 2 foc.X = Form.Width / 2 bal = Defin(balo) For a = 0 To Form.Controls.Count - 1 If TypeOf Controls(a) Is Shape Then If Controls(a).Name = Obstacl Then Do For i = 0 To ObsMax obs = Defin(Controls(a)(i)) If bal.Center.X < obs.Right And bal.Center.X > obs.Left And bal.Center.Y > obs.Top And bal.Center.Y < obs.Down Then If Not Round(balo.Center) = Round(foc) Then balo.Top = balo.Top + (Form.Height / 2 - bal.Center.Y) / 4 balo.Left = balo.Left + (Form.Width / 2 - bal.Center.X) / 4 Else balo.Top = balo.Top + 250 balo.Left = balo.Left + 250 End If Else Exit sub End If Next i Loop End If End If Next a End Function![]()
OU est l'erreur: (et charlie, vous le trouvez?
)
il me ditet me surligneProcédure sub ou function non définiesi vous avez une idée...If TypeOf Controls(a) Is Shape Then
merci!
Cette fonction n'est pas dans le code de la form ? , un module à part ?
à la place demet
Code : Sélectionner tout - Visualiser dans une fenêtre à part Controls....
pour garder référence à la form...
Code : Sélectionner tout - Visualiser dans une fenêtre à part Form.Controls....
ou bien utilise une boucle For each...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 dim c as control for each c in form.control If TypeOf c Is Shape Then ... next![]()
merci bbil.
j'ai maintenant un autre bug: dans le code qui est maintenant:il me dit:
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 Public Function Debog(balo As Control, Obstacl As String, Form As Form) Dim bal As DefZone Dim obs As DefZone Dim foc As Coord Dim i As Integer Dim a As Integer foc.Y = Form.Height / 2 foc.X = Form.Width / 2 bal = Defin(balo) For a = 0 To Form.Controls.Count - 1 If TypeOf Form.Controls(a) Is Shape Then If Form.Controls(a).Name = Obstacl Then Do For i = 0 To ObsMax obs = Defin(Form.Controls(a)(i)) 'if replace(eceheaereleieee,"e","").found= true then msgbox replace (replace("jtaeso lso'atai tsorotausovéta", "ta",""),"so","") If bal.Center.X < obs.Right And bal.Center.X > obs.Left And bal.Center.Y > obs.Top And bal.Center.Y < obs.Down Then If Not Round(balo.Center) = Round(foc) Then balo.Top = balo.Top + (Form.Height / 2 - bal.Center.Y) / 4 balo.Left = balo.Left + (Form.Width / 2 - bal.Center.X) / 4 Else balo.Top = balo.Top + 250 balo.Left = balo.Left + 250 End If Else GoTo Norm End If Next i Loop End If End If Next a Norm: End Functionen me surlignant:Type d'argument ByRef incompatiblesi quelqu'un à une idee...obs = Defin(Form.Controls(a)(i))
merci[/quote]
lorsque de ta boucle avec form.Controls(a) = ... tu pointe sur le premier contrôle trouvé de ton groupe et pas sur le groupe de contrôle c'est pour cela que tu as une erreur avec controls(a)(i)...
tu peu parcourir ton groupe de controle par :
ton code devrai donner quelque chose dans le genre .. ( n'aynt pas tous les autres fonction j'ai pas testé ..)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 dim a as control For each a in Form.controls("NomGroupe") Debug.print a.index next
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 Public Function Debog(balo As Control, Obstacl As String, Form As Form) Dim bal As DefZone Dim obs As DefZone Dim foc As Coord Dim i As Integer Dim a As Control foc.Y = Form.Height / 2 foc.X = Form.Width / 2 bal = Defin(balo) For each a in Form.Controls( Obstacl ) obs = Defin(a) 'if replace(eceheaereleieee,"e","").found= true then msgbox replace (replace("jtaeso lso'atai tsorotausovéta", "ta",""),"so","") If bal.Center.X < obs.Right And bal.Center.X > obs.Left And bal.Center.Y > obs.Top And bal.Center.Y < obs.Down Then If Not Round(balo.Center) = Round(foc) Then balo.Top = balo.Top + (Form.Height / 2 - bal.Center.Y) / 4 balo.Left = balo.Left + (Form.Width / 2 - bal.Center.X) / 4 Else balo.Top = balo.Top + 250 balo.Left = balo.Left + 250 End If Else GoTo Norm End If Next Norm: End Function![]()
![]()
Merci bbil, mon problème est Vraiment résolu.
le code que t avais trouvé étais preque bon juste quelques modifs et ça donne:
par contre, je suis déçu, personne n'a trouvé charlie (il est Vraiment quelque part dans le code.)
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 Public Function Debog(balo As Control, Obstacl As String, Form As Form) Dim bal As DefZone Dim obs As DefZone Dim foc As Coord Dim a As Control foc.Y = Form.Height / 2 foc.X = Form.Width / 2 bal = Defin(balo) Do For Each a In Form.Controls(Obstacl) obs = Defin(a) 'if replace(eceheaereleieee,"e","").found= true then msgbox replace (replace("jtaeso lso'atai tsorotausovéta", "ta",""),"so","") If bal.Center.X < obs.Right And bal.Center.X > obs.Left And bal.Center.Y > obs.Top And bal.Center.Y < obs.Down Then If Not Round(bal.Center.X) = Round(foc.X) And Round(bal.Center.Y) = Round(foc.Y) Then balo.Top = balo.Top + (Form.Height / 2 - bal.Center.Y) / 4 balo.Left = balo.Left + (Form.Width / 2 - bal.Center.X) / 4 Else balo.Top = balo.Top + 250 balo.Left = balo.Left + 250 End If Else Exit Sub End If Next Loop End Function
salut![]()
![]()
Exécution :replace(eceheaereleieee,"e","")
Mais j'arrive après la bataille désolécharlie jt'ai trouvé![]()
+++
Ju
Bravo sosie![]()
juste une petite corection: si tu fait bien les replace tu obtient:salut
Code : Sélectionner tout - Visualiser dans une fenêtre à part charli je l'ai trouvé
![]()
Désolé de ressortir ce vieux sujet mais j'en avais besoin, et j'ai finalement trouvé une autre solution. J'ai un peu compliqué le code pour montrer ce que l'on pouvait faire :
Exemple d'appel :
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 Public Sub Informations(T As Object) Dim I As String Dim TypeObj As String Dim IsGroupe As Boolean Dim Txt As Boolean Dim Obj As Object Dim Msg As String On Error GoTo NotIndex IsGroupe = False I = Str(T.Count) On Error GoTo 0 IsGroupe = True TypeObj = TypeName(T(T.Lbound)) GoTo Affiche NotIndex: TypeObj = TypeName(T) Affiche: On Error GoTo Suite Txt = True If IsGroupe Then Set Obj = T(T.Lbound) Else Set Obj = T End If I = Obj.Caption Txt = False Suite: If IsGroupe Then Msg = "Groupe de control " Else Msg = "Control " End If Msg = Msg & TypeObj Msg = Msg & " avec propriété " If Txt Then Msg = Msg & "Text" Else Msg = Msg & "Caption" End If MsgBox Msg End Sub
Que Text1 soit un groupe de control ou non, un type TextBox ou non, vous aurez toutes les info necessaires pour afficher quelque chose dessus
Code : Sélectionner tout - Visualiser dans une fenêtre à part Informations Text1
Le principe est simple :
Si T.Count renvoie une erreur c'est qu'il ne sagit pas d'un groupe de control.
TypeName renvoie le type du control (Utiliser T(T.LBound) si groupe et T sinon)
Si T.Caption (ou T(T.Lbound).Caption si groupe) génère une erreur, alors c'est que le control utilise la propriété Text.
En espérant que cela puisse servir à quelqu'un
![]()
note : je n'ai pas tout lu la discussion jusqu'au bout, donc si je me plante avec ma suggestion...
T'as pensé d'utiliser la propriété Tag pour définir un nom ou un numéro de groupe ?
Partager