Accès à la valeur d'une variable par son nom dans une string
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 2014
-
5 juin 2008 à 17:01
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 2008
-
9 juin 2008 à 16:47
Bonjour à tous !!!
voilà je me présente ... quoi? ce n' est pas un site de rencontre? C' est une site sur la programmation Delphi voire ... Lazarus? Bem ça tombe bien j' ai une question! ^^
Voilà, dans certains cas, j' aimerai accéder à une variable comme on le fait avec un compo gràce à la commande FindComponent().
Exemple:
unit ABC;
var
Variable1, Variable2, Variable3, Variable4, Variable5: Integer;
procedure AAA.OnClick(Sender: TObject);
var
i, Valeur: Integer;
begin
i := GetIndiceOfvariableToUse; // fonction qui me renvoie un integer entre 1 et 5 ...
Valeur := FindIntegerVariable('Variable' + intToStr(i));
ShowMessage(intToStr(Valeur));
FindIntegerVariable('Variable' + intToStr(i)) := Valeur + 10; // J' ajoute 10 à la variable ...
end;
Je sais que je peux utiliser un array mais je voudrai savoir s' il est possible d' accéder à une variable de cette manière.
Merci de votre aide.
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 5 juin 2008 à 17:06
En fait,
il voudrais mieux que FindIntegerVariable('Variable' + intToStr(i)) me renvoie un pointeur de type Integer:
procedure AAA.OnClick(Sender: TObject);
var
i: Integer;
p: ^Integer;
begin
i := GetIndiceOfvariableToUse; // fonction qui me renvoie un integer entre 1 et 5 ...
p := FindIntegerVariable('Variable' + intToStr(i));
ShowMessage(intToStr(p^));
inc(p^, 10); // J' ajoute 10 à la variable ...
end;
La question reviens donc à comment avoir un pointeur sur une variable.
Merci d' avance!
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 5 juin 2008 à 19:01
Salut Mauricio,
dans Delphi comme dans tout langage compilé les noms de variable sont remplacés par leur adresse. Tu peux récupérer l'adresse d'une variable avec l'opérateur @ mais cela se fait en "dur"
la solution la plus simple est effectivement de déclarer un array , de récupérer l'adresse de base et de calculer l'adresse de la cellule.
il est peut être aussi possible dans l'exemple que tu donnes de récupérer l'adresse de la premiere variable et de calculer l'adresse des suivantes si elle sont déclarer à la suite (il est vraissemblable que le compilateur fasse de même.(a vérifier).
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 5 juin 2008 à 20:12
Salut !
C'est possible, mais uniquement sous deux conditions :
- les champs dont tu veux avoir accès doivent être des propriétés publiées d'une classe.
- La classe doit descendre de TPersistent ou être compilée avec la directive {$M+}.
Dans ce cas, tu peux utiliser les RTTI (cf Google) pour lire et modifier les propriétés.
Y'a même moyen d'invoquer des méthodes de la même manière mais c'est plus chaud d'un coup...