Appel d'une variable dont le nom est obtenu par une formule

Bonjour à tous,

J’essaye depuis 2 jours de faire appel à une variable dont le nom est obtenu à partir d’une formule … et oualou !

J’ai repris l’exemple Advanced Based Shape Painter en y ajoutant une fonctionnalité : afficher les valeurs RVB et leur traduction en hexadécimal.

J’ai donc en variables R, V et B et pour l’hexadécimal V1à V6 avec V1=INT(R/16), V2=MOD(R/16) et ainsi de suite jusqu’à V6.
Une fois V1 à V6 calculés, il me faut vérifier si leur valeur est supérieure à 9 pour leur affecter les valeurs A pour 10 à F pour 15 si c’est le cas.

Je fais donc une boucle dans laquelle je veux balayer les variables V1 à V6 et affecter les valeurs hexadécimales. J’ai créé une variable Rang qui peut varier de 1 à 6. L’idée est de concaténer “V” et la valeur de Rang dans une variable ID_Variable pour dire sur quelle variable on travaille.

J’ai vu dans l’exemple, à l’événement 3.2.6, qu’il est possible d’utiliser une syntaxe du type :
Faire = Variable(Shape) à la variable Shape[VariableString(Shapes.Size)].Type)
Dans cet exemple, la variable Shape.Size est une variable enfant. A priori les [] remplacent aussi le point qui sépare le nom de la structure et de l’enfant.

Je ne suis pas tout à fait dans ce cas puisque je n’utilise pas de structure.

Je fais donc pour mes tests :

Faire = +1 à la variable Rang
(je pars d’une valeur initiale à 0)

Faire = “V”+VariableString(Rang) au texte de la variable ID_Variable
(si je l’affiche dans un Objet Texte, ça marche : c’est bien concaténé et j’obtiens V1)

Faire = “Test” au texte de la variable [VariableString(ID_Variable)]
(rien ne se passe … et le débogger n’affiche rien dans le contenu de la variable)
:frowning:

Je crois avoir à peu près tout essayé comme syntaxe pour la troisième ligne, je n’y arrive pas !

Si vous avez la réponse, merci d’avance !

Les variables ont un nom fixe, par contre, tu peux utiliser les variables comme des structures, auquel cas, tu pourrais avoir des variables du genre :

MyVar["1"] MyVar["2"] MyVar["blabla"] ...
Et là, tu pourras mettre une expression à la place de “blabla” (Mais, en tous cas, la première partie de nom de la variable doit être fixe).

Bonjour Victor,

Tout d’abord merci de ta réponse.

Ce que j’essaye de faire, ce n’est pas de modifier le nom d’une variable. Mes variables V1 à V6 sont créées et c’est à elles que je veux faire appel. Mais pour plus d’efficacité, je dois pouvoir faire appel à V1 jusqu’à V6 à l’intérieur d’une boucle. D’où mon idée de concaténer “V”+“Rang” pour dire sur quelle variable je travaille.

Ce que je n’arrive pas à faire c’est, une fois que j’ai fait ma concaténation dans ID_Variable de dire que je veux travailler sur la variable qui correspond à cette concaténation et qui existe puisque je l’ai déclarée.

Je joints 2 images écran tirées des exemples Multiple Levels With External Layouts et Advanced Shape Based Painter.
C’est surtout la formule utilisée dans le premier exemple qui m’intéresse.
Exemples.pdf (134 KB)

La formule utilisée dans le premier est utilisée pour autre chose qu’un nom de variable (une expression texte). Pour les noms de variables, c’est différent et il faut faire comme je t’ai dit (et comme la deuxième capture d’écran de ton PDF d’ailleurs)
Il faut utiliser ce que je t’ai dis, c’est-à-dire V[“1”], V[“2”]… Cela ne marchera que comme ça, on ne peut pas concaténer directement des noms de variables.

Merci beaucoup Victor

J’ai testé en créant une structure et je parviens bien à faire appel à un enfant dont le nom est obtenu par concaténation. Donc mon problème est résolu.

Tu me diras que je suis têtu mais je ne comprends pas pourquoi les variables et les enfants ne sont pas gérés de la même façon. Ma compréhension est que dans les 2 cas les noms (variables et enfants) sont des chaînes de caractères.

Merci de ton aide en tous les cas.

Cela permet plus de rapidité dans l’exécution (pour les variables sans enfants évidemment) car il n’y a pas d’expression texte à traiter.

OK Victor. Merci beaucoup pour tes explications très détaillées.

J’ai donc réussi à modifier la valeur d’un enfant dont le nom résulte d’une formule.

J’essaye maintenant de faire appel à un enfant dont le nom résulte aussi d’une formule mais dans une condition :

Si V1 (obtenu grâce à la concaténation de V et du numéro de rang) = 10 alors Hexa_V1 (concaténation aussi) est = “A”

J’ai essayé, dans une condition, avec la syntaxe utilisée précédemment : Structure[VariableString(MaVariable)]. Cela m’a créé une nouvelle variable alors que l’enfant est déjà déclaré. Pour palier ce problème, j’ai ajouté un “.” : Structure.[VariableString(MaVariable)] et là il ne me crée pas de nouvelle variable.

Par contre, il n’identifie tout même pas la variable (enfant) sur laquelle je me situe car il ne lui affecte pas la valeur A …

Je joins une version simplifiée du projet pour illustrer le problème.
Palette_Couleurs.rar (14.9 KB)

Toujours en grosse galère avec ce sujet : je n’arrive pas à faire appel à une variable enfant dont le nom est obtenu par concaténation.

Je joins un exemple ultra simplifié du problème. Non seulement cela ne marche pas mais le résultat est que le programme crée une nouvelle variable (VariableCible), ce qui m’incite à penser que c’est la syntaxe qui ne va pas. Pourtant elle me semble être la bonne !!!

HELP !!!
Test.gdg (10.9 KB)

Il y a deux syntaxes possible pour les structure :

maStructure.enfant

qui donne le contenu de la sous-variable “enfant”. Cette syntaxe ne permet pas d’utiliser des expressions textes pour “choisir” la sous-variable

maStructure["enfant"]

qui donne la même chose, mais note bien les " " autour de enfant : cette syntaxe accepte les expressions textes.

Tu peux donc utiliser

maStructure["V" + VariableString(monIndex)]

Un énorme merci Victor !

Petite précision : dans mon exemple, l’Index était lui-même une variable enfant.

La syntaxe complète pour pointer sur la variable MaStructure.V1 avec l’Index à 1 était donc : MaStructure[“V”+VariableString(MaStructure.Index)]

Mille merci !