Gambas France BETA


Pas de compte ? Incription

Du bon usage de la Fonction Eval()

1
AuteurMessages
O.Coquet#1 Posté le 30/10/2024 à 14:08:29
Ce qui n'est pas devra-t-être inventéCette fonction très puissante est assez mal documentée voici donc une version d'exemple un peu plus simple à comprendre:

Le but de cette fonction est d'évaluer (interpréter) une chaine de caractères (string) comme si c'était une ligne de code.

elle prend deux paramètres:

une variable String qui contient la ligne de code
Une variable collection qui contient des "pseudo variables"

premier exemple, celui de la doc Gambas revisité pour être plus clair.

1
2
3
4
5
6
DIM Context AS NEW Collection

Context["X"] = 2
Context["Y"] = 5

PRINT Eval("X * Y)", Context)


La valeur affichée sera 10

Second exemple, beaucoup plus intéressant, imaginons que nous ayons un contrôle mon_textarea sur notre formulaire FMain

1
2
3
4
5
6
DIM Context AS NEW Collection

Context["X"] = "un joli texte"


Eval("Let Fmain.mon_textarea.text = X", Context)


Le textarea contiendra désormais "un joli texte"

A cela deux conditions:

Let doit être précisé dans le cas d'une assignation (=) dans la chaîne de caractères.
Le chemin du contrôle concerné doit être complet "Fmain.mon_textarea.text".

Dans la pratique, on peut simplifier à l’extrême cette dernière façon d'utiliser éval() en écrivant la ligne comme ceci:

1
Eval("Let Fmain.mon_textarea.text = \"mon joli texte\"", NULL)


Plus de variable, plus de contexte ! :D

Si vous avez plusieurs lignes à évaluer, rajoutez un \n entre chaque ligne:
1
Eval("Let Fmain.mon_textarea.text = \"mon joli texte\"\n Let mavariable = 10", NULL)


Avec ces exemples, la fonction peut paraitre superflue, mais imaginez un formulaire avec 23 boutons s'appelant respectivement btn1,btn2,...btn23.

Changer la couleur de fond de tous ou quelques boutons peut paraitre fastidieux, avec eval() on crée une chaine puis une variable à incrémenter et le tour est joué, voici l'exemple...

1
2
3
4
5
FOR i AS INTEGER = 1 TO 23

Eval("Let Fmain.btn" & i & ".Background = &hFF0000", NULL)

NEXT


et le tour est joué !

A noter, cette fonction est une entrée directe vers l'auto programmation puisqu'un programme peut générer lui même ses lignes de programme et les exécuter, un bon début pour une IA......

Amitié
Olivier (Alias Olinux)

Amitié
Olivier (Alias Olinux)

Raspberry pi 3 et 4, pc Xubuntu, Arduino.....
Quelques autres "vieux" ordinateurs !
Et un bon fer à souder
Patrick#2 Posté le 31/10/2024 à 13:24:19
Bonjour,
Effectivement la fonction Eval() est intéressante, pour voir une autre utilisation :

https://github.com/PatrickMag/Laurux/blob/v3.69pat/.src/Utils/DB_Connection.class
De la ligne 436 à 503 explication sur cette classe :
Elle hérite de connection et sert à transformer certaines requêtes mysql en sqlitle, cette partie gère les requêtes préparées mysql, une requête préparée est une requête stockée sur le serveur avec possibilité d'utilisation de variables mysql, ces dernières sont censées être plus rapides que des requêtes envoyées depuis un poste de travail. Sqlite étant uniquement locale les requêtes préparées n'existent pas, il faut donc les transformer en requêtes normales.
On a aussi beaucoup utilisé les expressions régulières dans cette classe.

https://github.com/PatrickMag/Laurux/blob/v3.69pat/.src/Utils/LVar.class
Cette classe servir uniquement a construire la collection context, avec par exemple les noms de colonne d'un fichier, et les mettre dans un tooltip. On s'en sert pour mettre en paramètre le nom d'un compte ou un n° de facture (au choix de l'utilisateur) dans des commentaires.
Ce n'est pas moi qui est créé cette classe.

Patrick
1