Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Accéder à un nom de label par concaténation

4 views
Skip to first unread message

jerome

unread,
Oct 12, 2006, 5:58:45 AM10/12/06
to
Bonjour,

J'ai un problème de syntaxte VB que j'arrive pas à régler.

J'ai 3 labels dans un formulaire
label1, label2, label3

Je récupère des champs dans une base de données et je voudrais que ces
labels prennent la valeur de ces champs

J'essaie, rst étant un curseur

I=0
Do While rst.cur.EOF = False
I = I+1
ligne = "label" & CStr(I)
myForm.ligne.Caption = rst.cur!maValeur
rst.cur.MoveNext
Loop

Mais ça ne fonctionne pas.

Comment pourrais-je faire ?

Merci par avance


troll@enfer.fr LE TROLL

unread,
Oct 12, 2006, 6:06:16 AM10/12/06
to
Bonjour,

label1.CAPTION = ...

--
Site éditeur MES ROMANS édités
http://www.manuscritdepot.com/a.joseph-attila-pusztay.1.htm
Site de MES LOGICIELS
http://irolog.free.fr
mon adresse EMail
http://irolog.free.fr/ecrire/index.htm
------------------------------------------------------------------------------------
"jerome" <jer...@hh.fr> a écrit dans le message de news:
%23XFfBUe...@TK2MSFTNGP04.phx.gbl...

jerome

unread,
Oct 12, 2006, 6:20:52 AM10/12/06
to
Je ne comprends pas la réponse.
Pour moi je voudrais faire
labelI .CAPTION =... avec I qui varie de 1 à n

Mais si je mets labelI ça ne fonctionne pas

"LE TROLL" <le tr...@enfer.fr> wrote in message
news:uJN2WYe7...@TK2MSFTNGP03.phx.gbl...

troll@enfer.fr LE TROLL

unread,
Oct 12, 2006, 6:32:00 AM10/12/06
to
Re-bonjour,
En regardant de plus rès:
C'est quoi:

myForm.ligne.
myForm ???
ligne.caption ???

Et aussi ça:


ligne = "label" & CStr(I)
myForm.ligne.Caption = rst.cur!maValeur

ligne reçoit dans une boucle "Do" label... Puis reçoit "rst..."
Ligne contient la dernière affectation (rst), faut:
ligne=
ligne=ligne & ...

Et enfin, "ligne", ça perd sa valeur à chaque passage, et a priori cette
valeur n'est pas récupérée avant ???
dim x(y)
Do...
...
x(y) = ligne ' pour conserver sa valeur...
loop


--
Site éditeur MES ROMANS édités
http://www.manuscritdepot.com/a.joseph-attila-pusztay.1.htm
Site de MES LOGICIELS
http://irolog.free.fr
mon adresse EMail
http://irolog.free.fr/ecrire/index.htm
------------------------------------------------------------------------------------
"jerome" <jer...@hh.fr> a écrit dans le message de news:
%23XFfBUe...@TK2MSFTNGP04.phx.gbl...

troll@enfer.fr LE TROLL

unread,
Oct 12, 2006, 6:33:45 AM10/12/06
to
Faut mettre:

Label1.Caption = variable & "dutexte"
Label1.Caption = variable
Label1.Caption = "dutexte"

--
Site éditeur MES ROMANS édités
http://www.manuscritdepot.com/a.joseph-attila-pusztay.1.htm
Site de MES LOGICIELS
http://irolog.free.fr
mon adresse EMail
http://irolog.free.fr/ecrire/index.htm
------------------------------------------------------------------------------------
"jerome" <jer...@hh.fr> a écrit dans le message de news:

ugmUYge7...@TK2MSFTNGP03.phx.gbl...

Clive Lumb

unread,
Oct 12, 2006, 6:44:04 AM10/12/06
to

Solution la plus simple
Créer un groupe de contrôles "MonLabel"
Ensuite on accède au texte de chaque membre par MonLabel(I).Caption

(Pour créer le groupe de façon simple, créer un label puis copier/coller et
repondre "Oui" quand VB vous demande si vous voulez créer un groupe. Repeter
à souhait)

Clive


jerome

unread,
Oct 12, 2006, 6:48:11 AM10/12/06
to
Désolé mais je ne comprends toujours pas.

Disons plus simplement que je souhaiterais faire
Dim I as integer
I=0
Do While I<=3
I = I + 1
label(I).Caption = I
Loop

donc à l'arrivée
label1.Caption = 1
label2.Caption = 2
label3.Caption = 3

"LE TROLL" <le tr...@enfer.fr> wrote in message

news:uXeXvme7...@TK2MSFTNGP03.phx.gbl...

troll@enfer.fr LE TROLL

unread,
Oct 12, 2006, 7:05:32 AM10/12/06
to
Non, si tu as 3 label différents, il faut les appeler par leur nom (label1,
2, 3), soit:

Dim i As Integer
For i = 1 to 3
If = 1 Then Label1.Caption = i
If = 2 Then Label2.Caption = i
If = 3 Then Label3.Caption = i
Next i

Par contre, comme a dit "Clive", si tu veux indicer un Label
labelX(i)
Il faut préalablement déclarer 3 label du même nom qui vont être indicés, tu
fais ainsi:
- Tu colles sur la form un label1
- A la souris sur ce label1 tu fais <copier>
- Toujours à la souris, à un autre endroit de la form tu fais <coller> +
<oui>
- Tu recommences une seconde fois le coller (il n'y aura pas la question)
nb: en cliquant sur l'objet, dans sa propriété Index tu pourras voir son
numéro d'ailleurs...
- Et seulement ensuite tu pourras utiliser ton label comme tu l'as indiqué,
soit:

Dim i as integer
For i = 1 to 3
Label(i).Caption = i
Next i

Si tu n'y arrives pas, dis, je te fais le code et je te l'envoie par
fichier...

--
Site éditeur MES ROMANS édités
http://www.manuscritdepot.com/a.joseph-attila-pusztay.1.htm
Site de MES LOGICIELS
http://irolog.free.fr
mon adresse EMail
http://irolog.free.fr/ecrire/index.htm
------------------------------------------------------------------------------------
"jerome" <jer...@hh.fr> a écrit dans le message de news:

uqTcpve7...@TK2MSFTNGP04.phx.gbl...

jerome

unread,
Oct 12, 2006, 7:09:34 AM10/12/06
to
Merci.

Effectivement avec les groupes de contrôle ça fonctionne.

Merci encore
.
"Clive Lumb" <clumb2@Gratuit_in_English.fr.invalid> wrote in message
news:e1OHUte...@TK2MSFTNGP05.phx.gbl...

Patrice Henrio

unread,
Oct 12, 2006, 8:13:07 AM10/12/06
to
Bonjour

Il me semble que ce qui est écrit ci-après

>Dim i As Integer
> For i = 1 to 3
> If = 1 Then Label1.Caption = i
> If = 2 Then Label2.Caption = i
> If = 3 Then Label3.Caption = i
> Next i


serait plus simple ainsi

> Label1.Caption = 1
> Label2.Caption =2
>Label3.Caption =3


"LE TROLL" <le tr...@enfer.fr> a écrit dans le message de news:
uDiHf5e7...@TK2MSFTNGP05.phx.gbl...

troll@enfer.fr LE TROLL

unread,
Oct 12, 2006, 8:30:19 AM10/12/06
to
Affirmatif, mais c'était pour lui montrer en boucle...

--
Merci beaucoup, au revoir et à bientôt :o)
------


Site éditeur MES ROMANS édités
http://www.manuscritdepot.com/a.joseph-attila-pusztay.1.htm
Site de MES LOGICIELS
http://irolog.free.fr
mon adresse EMail
http://irolog.free.fr/ecrire/index.htm
------------------------------------------------------------------------------------

"Patrice Henrio" <patrice...@laposte.net> a écrit dans le message de
news: O$PD1cf7G...@TK2MSFTNGP04.phx.gbl...

Patrice Henrio

unread,
Oct 12, 2006, 7:12:08 PM10/12/06
to
En fait le problème posé au départ est un problème souvent posé en
programmation. Cela rappelle le tableau de cézanne : ceci n'est pas une pipe
(ce n'est que la représentation d'une pipe).

Lorsque que l'on écrit
Ligne="Label1"
Cela représente seulement la chaîne de caractères décrivant le nom du label.
un peu comme "2006" n'est que l'écriture d'une entité numérique représentant
la valeur 2006.
On ne peut donc pas utiliser la valeur de Ligne ("label1") comme étant
l'objet Label1 lui-même (ils ne sont pas du même type).
De même que l'on ne peut additionner "2006" et 1 pour obtenir 2007.

A priori l'écriture

myForm.ligne.Caption="Test"

attend une propriété ligne définie avec l'objet form ou un contrôle nommé
ligne dans la forme.

Donc si j'ai un label de name "Ligne"

Dim Ligne as string
Ligne="Label1"
MyForm.ligne.Caption=Ligne

affichera le texte "Label1" dans le label Ligne et non dans le label Label1.


"jerome" <jer...@hh.fr> a écrit dans le message de news:

%239EAm7e...@TK2MSFTNGP03.phx.gbl...

Clive Lumb

unread,
Oct 13, 2006, 3:20:50 AM10/13/06
to

"Patrice Henrio" <patrice...@laposte.net> a écrit dans le message de
news:%23TrjENl...@TK2MSFTNGP04.phx.gbl...

> En fait le problème posé au départ est un problème souvent posé en
> programmation. Cela rappelle le tableau de cézanne : ceci n'est pas une
pipe
> (ce n'est que la représentation d'une pipe).
>
> Lorsque que l'on écrit
> Ligne="Label1"
> Cela représente seulement la chaîne de caractères décrivant le nom du
label.
> un peu comme "2006" n'est que l'écriture d'une entité numérique
représentant
> la valeur 2006.
> On ne peut donc pas utiliser la valeur de Ligne ("label1") comme étant
> l'objet Label1 lui-même (ils ne sont pas du même type).
> De même que l'on ne peut additionner "2006" et 1 pour obtenir 2007.
>
> A priori l'écriture
>
> myForm.ligne.Caption="Test"
>
> attend une propriété ligne définie avec l'objet form ou un contrôle nommé
> ligne dans la forme.
>
> Donc si j'ai un label de name "Ligne"
>
> Dim Ligne as string
> Ligne="Label1"
> MyForm.ligne.Caption=Ligne
>
> affichera le texte "Label1" dans le label Ligne et non dans le label
Label1.
>
Bravo pour une explication très imagée, la première fois que je vois VB et
Cézanne dans un même phrase.

Je crois que peut aussi aider à la compréhension de pourquoi cela ne marche
pas et pensant à ce qui se passe lors de la compilation.
Un label est un contrôle, membre de la collection de contrôles de la
formulaire.
Il se trouve l'index "n" dans la liste de contrôles et lorsque l'appli est
compilé toute référence à ce label se fait par son index, pas par son nom.

Si on veut absolument y accéder par son nom en runtime - par exemple composé
par programmation ou lu dans une BdD - on peut toujours utiliser la methode
suivante

Public Sub ModifCaption(NomLabel As String, Texte As String)
Dim MonControl As Control
For Each MonControl In Me.Controls
If TypeOf MonControl Is Label Then
If MonControl.Name = NomLabel Then
MonControl.Caption = Texte
End If
End If
Next
End Sub

Clive


Patrice Henrio

unread,
Oct 13, 2006, 3:44:44 AM10/13/06
to
Je crois me souvenir de mes études d'il y a 15 ans (et plus) que cela
portait un nom le fait de pouvoir se référer à un objet à partir de la
chaîne représentant le nom, un peu comme d'appeler une fonction ou une sub à
partir de son nom (le mot décrivant ce nom). Mais je ne me rappelle plus
comment cela s'appelle.


"Clive Lumb" <clumb2@gratuit_en_anglais.fr.invalid> a écrit dans le message
de news: 452f3f27$0$31934$426a...@news.free.fr...

Clive Lumb

unread,
Oct 13, 2006, 4:12:18 AM10/13/06
to

"Patrice Henrio" <patrice...@laposte.net> a écrit dans le message de
news:eAa5grp7...@TK2MSFTNGP02.phx.gbl...

> Je crois me souvenir de mes études d'il y a 15 ans (et plus) que cela
> portait un nom le fait de pouvoir se référer à un objet à partir de la
> chaîne représentant le nom, un peu comme d'appeler une fonction ou une sub
à
> partir de son nom (le mot décrivant ce nom). Mais je ne me rappelle plus
> comment cela s'appelle.
>
>
Moi aussi, et moi non plus, si tu vois ce que je veux dire ...

La fonction s'appelé souvent "eval".
Et je crois que l'action est "Canonical Coercion" ??


Vincent Guichard

unread,
Oct 13, 2006, 4:00:08 AM10/13/06
to
A noter qu'il est possible de créer une fonction réalisant cela:

'Dans toutes les forms ou la fonction doit être accessible
Public Function GetByName(n As String) As Control
Dim c As Control
For Each c In Me.Controls
If c.Name = n Then
Set GetByName = c
Exit Function
End If
Next c
End Function

'Utilisation:
Form1.GetByName("Text1").Caption = "Texte"

Vincent Guichard

Patrice Henrio

unread,
Oct 13, 2006, 6:10:59 AM10/13/06
to
Joli !

Bravo.

A plus
"Vincent Guichard" <vg.bleu...@wanadoo.fr> a écrit dans le message de
news: 452f5470$0$5094$ba4a...@news.orange.fr...

Vincent Guichard

unread,
Oct 13, 2006, 6:23:15 AM10/13/06
to
Patrice Henrio a écrit :

> Joli !
>
> Bravo.
>
> A plus
Bah, c'est à peu de chose prêt ce qu'a posté Clive dans sa réponse.
Elle serait d'ailleurs arrivée plus tôt sur mon serveur, je n'aurais pas
posté la mienne .

Vincent Guichard

Clive Lumb

unread,
Oct 13, 2006, 8:17:33 AM10/13/06
to

"Vincent Guichard" <vg.bleu...@wanadoo.fr> a écrit dans le message de
news:452f7f63$0$5069$ba4a...@news.orange.fr...

Et Clive avait pensé à faire la même chose, mais a préferé une solution
labello-centrique pour éviter la gestion des erreurs si on donne le nom d'un
autre type de contrôle.

Au fait, est-ce qu'un d'entre vous aurait pris le temps d'écrire un fonction
pour remplacer "TypeOf" pour permettre plus de facilité...?
Style:
sub MonTypeOf(Mycontrol)
if typeof MyControl is Label then MonTypeOf="Label" : exit sub
if etc.
end sub


Vincent Guichard

unread,
Oct 13, 2006, 8:48:35 AM10/13/06
to
Clive Lumb a écrit :

> sub MonTypeOf(Mycontrol)
> if typeof MyControl is Label then MonTypeOf="Label" : exit sub
> if etc.
> end sub
Je viens d'aller jeter un oeil à la doc (ce qu'il faudrais toujours
faire), et celle-ci indique:

> Vous pouvez passer la collection Controls(index) à une fonction dont l'argument est spécifié en tant que classe Controls. Vous pouvez aussi accéder aux membres à partir de leur nom. Par exemple :
>
> Controls("Command1").Top
>
> Vous pouvez utiliser le mot-clé TypeOf avec l'instruction If, ou la fonction TypeName, pour déterminer le type d'un contrôle dans la collection Controls.
>


Donc en fait, plutôt que ma fonction, un simple
Form1.Controls("Text1").Caption = "Texte"
marche aussi bien (voire mieux) :)

Et TypeName est la fonction que tu cherches :)
Debug.Print TypeName(Form1.Controls("Text1")) 'Affiche TextBox

Vincent Guichard (si seulement j'avais le temps d'aprendre MSDN par
coeur ^^)

Clive Lumb

unread,
Oct 13, 2006, 8:59:33 AM10/13/06
to
Vincent Guichard wrote:
> Clive Lumb a écrit :
>> sub MonTypeOf(Mycontrol)
>> if typeof MyControl is Label then MonTypeOf="Label" : exit sub
>> if etc.
>> end sub
> Je viens d'aller jeter un oeil à la doc (ce qu'il faudrais toujours
> faire), et celle-ci indique:
>
>> Vous pouvez passer la collection Controls(index) à une fonction dont
>> l'argument est spécifié en tant que classe Controls. Vous pouvez
>> aussi accéder aux membres à partir de leur nom. Par exemple :
>>
>> Controls("Command1").Top
>>
>> Vous pouvez utiliser le mot-clé TypeOf avec l'instruction If, ou la
>> fonction TypeName, pour déterminer le type d'un contrôle dans la
>> collection Controls.
>>
>
>
> Donc en fait, plutôt que ma fonction, un simple
> Form1.Controls("Text1").Caption = "Texte"
> marche aussi bien (voire mieux) :)

En plus c'est logique.
J'ai bien utilisé un syntaxe semblable pour accèder aux labels d'un
DataReport, pourquoi n'y avais-je pensé ?


> Et TypeName est la fonction que tu cherches :)
> Debug.Print TypeName(Form1.Controls("Text1")) 'Affiche TextBox

Tiens !
Je suis passé totalement à coté de celui-là, jamais connu, jamais utilisé.
Comme quoi on peut toujours apprendre.
Je me coucherai moins bête ce soir (mais avec quelques neurones en moins)

Merci


JLuc

unread,
Oct 21, 2006, 6:20:36 AM10/21/06
to
Je préconiserai plus un codage du type :

For i = 1 To 3
Controls("Label" & i).Caption = "Essai " & i
Next


jerome a formulé ce jeudi :

--
____
( O | O )
--
_oooO_ JLuc _Oooo_

O-\O


0 new messages