2023年11月9日 星期四

delphi rtti reflection LiveBindings

 delphi rtti reflection 

 https://docwiki.embarcadero.com/RADStudio/Sydney/en/Delphi_RTTI_and_C%2B%2BBuilder

https://csvelocity.wordpress.com/2020/01/08/delphi-rtti-and-the-linker/

http://theclub.com.br/restrito/revistas/201005/rtti1005.aspx

https://docwiki.embarcadero.com/RADStudio/Alexandria/en/LiveBindings_in_RAD_Studio

 https://stackoverflow.com/questions/24559016/delphi-use-reflection-in-a-class-procedure-for-the-getting-dynamic-class-type

TRttiContext(Record) TRttiType TRttiMethod
TRttiField  TRttiProperty
uses
   Sysutils,Classes,Variants,Math;
procedure TForm1.Reflection(obj: TObject);
var
   Context:TRttiContext;
   objType:TRttiType;
   objField:TRttiField;
   objProperty:TRttiProperty;
   objMethod:TRttiMethod;
begin
   Memo1.Lines.Clear;
   objType:=Context.GetType(obj.ClassType);
   //Listando os Campos do objeto
   Memo1.Lines.Add('Campos:');
   for objField in objType.GetFields do
   begin
      Memo1.Lines.Add(objField.Name+' Tipo: '+objField.FieldType.ToString+' Valor: '+objField.GetValue(obj).ToString);
   end;
   // Listando as propriedades do objeto
   Memo1.Lines.Add('');
   Memo1.Lines.Add('Propriedades:');
   for objProperty in objType.GetProperties do
   begin
      Memo1.Lines.Add(objProperty.Name+'Tipo:'+objProperty.PropertyType.ToString+  ‘Valor: '+objProperty.GetValue(obj).ToString);
   end;
   // Listando os métodos do objeto
   Memo1.Lines.Add('');
   Memo1.Lines.Add('Métodos:');
   for objMethod in objType.GetMethods do
   begin
      if not(objMethod.Name<>'GetImc')then // Buscamos apenas por esse método
         Memo1.Lines.Add(objMethod.Name);
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   objPessoa:Tpessoa;
begin
   objPessoa:=Tpessoa.Create;
   objPessoa.Nome:=EDTNOME.Text;
   objPessoa.Peso:=StrToInt(EDTPESO.Text);
   objPessoa.Altura:=StrToInt(EDTALTURA.Text);
   objPessoa.Idade:=StrToInt(EDTIDADE.Text);
   objPessoa.GetImc;
   Reflection(objPessoa);
end;

沒有留言: