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 :wink:
Version imprimable
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 :wink:
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:
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 ceciCode:obj() as control
et il me surligne dans:Citation:
message d'erreur: incompatibilité de type: tableau ou type attendu par l'utilisateur.
si vous avez des idéesCitation:
Call 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:
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 !
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! :lol: :o
j'aivais envisagé un moment d'utiliser le nom mais j'avais rien trouvé :cry:
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 :wink:
Oups, j'ai parlé trop vite :oops: : 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é... :roll:Code:
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? :lol: )
il me ditet me surligneCitation:
Procédure sub ou function non définie
si vous avez une idée...Citation:
If TypeOf Controls(a) Is Shape Then
:arrow: merci!
Cette fonction n'est pas dans le code de la form ? , un module à part ?
à la place demetCode:Controls....
pour garder référence à la form... :wink:Code:Form.Controls....
ou bien utilise une boucle For each...
:wink:Code:
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:
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 Function
en me surlignant:Citation:
Type d'argument ByRef incompatible
si quelqu'un à une idee...Citation:
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:
1
2
3
4
5 dim a as control For each a in Form.controls("NomGroupe") Debug.print a.index next
:roll: :wink:Code:
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:
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 :wink:
:wink:
Exécution :Citation:
replace(eceheaereleieee,"e","")
Mais j'arrive après la bataille désolé :wink:Citation:
charlie jt'ai trouvé
+++
Ju
Bravo sosie :lol:
juste une petite corection: si tu fait bien les replace tu obtient:salut :wink:Code: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:
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 dessusCode: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 ?