Accès à la valeur d'une variable par son nom dans une string

cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 - 5 juin 2008 à 17:01
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 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.

A+

8 réponses

cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
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!
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
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).

salutations
JLEN
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
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...
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
5 juin 2008 à 21:12
<small>
</small>ca peut aider ?

<small>procedure TForm1.Button1Click(Sender: TObject);

var

i: Integer;

begin

for i:=0 to ControlCount - 1 do

if IsPublishedProp(Controls[i], 'Color') and PropIsType(Controls[i], 'Color', tkInteger) then

SetOrdProp(Controls[i], 'Color', clRed);

end;</small><small></small>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
5 juin 2008 à 23:26
type
  TVariable = record
    Var : pointer;
    Name: string;
    // VarType : byte;
  end;

  TVariableList = class(TList)
  ... derivation pour TVariable ...
  end;

   

<hr size="2" width="100%" />
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
5 juin 2008 à 23:31
Merci pour vos réponses,
je vais chercher du coté des RTTI qui semble ce que je cherche ...
A+
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
9 juin 2008 à 15:04
Salut,

Comme expliqué sur ce site en long et en large, accèder aux variables par leur noms à l'exécution, ça n'est pas bien.

Nan parce que sinon, ça ferait pas sérieux de dire que Lazarus fait du code lent, et les dev C vont encore se foutre de nous.
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
9 juin 2008 à 16:47
Ce qui est mal, c'est d'abuser de techniques dont on sait qu'elles consomment pas mal de temps alors qu'il y a plus simple et plus rapide.

Mais les connaître ne fait pas de mal... bien le contraire, ça peut sauver !
0
Rejoignez-nous