Acces à la valeur d'un objet avec le nom de propriété dans un string (dynamique)

Signaler
Messages postés
2
Date d'inscription
lundi 5 mai 2003
Statut
Membre
Dernière intervention
10 octobre 2011
-
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
-
Bonjour,

Avec RTTI j'arrive à lister les différentes propriétés de mon objet.
J'aimerais au final accèder par pointeur à ces propriétés.

L'objet:
type
  {$M+}
   TdataInputs = class(Tobject)
     private
     Fangle:integer;
     Fbal_bas:integer;
     Fcalcbal:boolean;
     Fcalcpoto:boolean;
     published
     Property angle:integer read Fangle Write Fangle;
     Property bal_bas:integer read Fbal_bas Write Fbal_bas;
     Property calcbal:boolean read Fcalcbal Write Fcalcbal;
     Property calcpoto:boolean read Fcalcpoto Write Fcalcpoto;
   {$M-}
   end;


Le code pour récup les infos RTTI de mon objet:
procedure TForm4.Button1Click(Sender: TObject);
var
  obj:TdataInputs;
  Nombre,i: Integer;
  ListeProprietes: TPropList;
begin
  Nombre := GetPropList(obj.ClassInfo, tkAny, @ListeProprietes);
  for I := 0 to Nombre-1 do
  begin
    
    //ici je récup @obj.chaque propriété
    //ListeProprietes[I]^.Name;
    //dans un tableau j'aurais écrit @obj[ListeProprietes[I]^.Name];
    
  end;
end;


Donc comment je récup @obj.?? quand ?? est une variable string?

Merci d'avance.

Tokazio

3 réponses

Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
Bonjour,

voici deux exemples de récupération trouvés sur le net :


procedure TForm1.FormCreate(Sender: TObject);
var
  Count, Loop: Integer;
  List: TPropList;
begin
  Count := GetPropList(TypeInfo(TForm1), tkAny, @List);
  Listbox1.Items.BeginUpdate;
  for Loop := 0 to Pred(Count) do
    Listbox1.Items.Add(List[Loop]^.Name);
  Listbox1.Items.EndUpdate;
end;


procedure TForm1.FormCreate(Sender: TObject);
var
  Count, Loop: Integer;
  List: PPropList;
begin
  Count := GetPropList(TypeInfo(TForm1), tkAny, nil);
  GetMem(List, Count * SizeOf(PPropInfo));
  try
    GetPropList(TypeInfo(TForm1), tkAny, List);
    Listbox1.Items.BeginUpdate;
    for Loop := 0 to Pred(Count) do
      Listbox1.Items.Add(List^[Loop]^.Name);
    Listbox1.Items.EndUpdate;
  finally
    FreeMem(List, Count * SizeOf(PPropInfo))
  end;
end;



J'espère que cela t'aidera..

cantador
Messages postés
2
Date d'inscription
lundi 5 mai 2003
Statut
Membre
Dernière intervention
10 octobre 2011

Merci mais cette partie là ne me pose pas de problème.

J'ai par exemple:
varprop:='propriete';
Monobjet.propriete:='à récup';

et je veux afficher en résultat "à récup" mais en passant par varprop qui contient le nom de la propriété à récupérer dans mon objet.
Si je fait
showmessage(Monobjet.propriete);

Pas de problème, j'affiche ce que je veux. Mais j'aimerais faire:
showmessage(Monobjet.varprop);

Et qu'il m'affiche ce qui correspond à 'varprop' (donc propriete) de l'objet.

Est ce que je me fait bien comprendre?

Tokazio
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Bonsoir,

Tu devrais trouver ton bonheur ici : Manipuler la valeur d'une propriété.

May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.