• rtti


    // Rtti调用类的方法
    procedure TForm1.Button1Click(Sender: TObject);
    var
      obj: TMyClass;
      t: TRttiType;
      m1,m2: TRttiMethod;
      r: TValue;
    begin
      t := TRttiContext.Create.GetType(TMyClass);
      m1 := t.GetMethod('msg');
      m2 := t.GetMethod('Add');
      obj := TMyClass.Create(Self);
      m1.Invoke(obj, ['Delphi 2010']);  
      r := m2.Invoke(obj, [1, 2]);
      ShowMessage(IntToStr(r.AsInteger));
      obj.Free;
    end;
    // Rtti获取方法类型、返回值、参数
    uses Rtti,TypInfo;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ms: TArray<TRttiMethod>;
      m: TRttiMethod;
      mps: TArray<TRttiParameter>;
      mp: TRttiParameter;
    begin
      Memo1.Clear;
      ms := TRttiContext.Create.GetType(TButton).GetMethods;
      for m in ms do
      begin
        {方法名称}
        Memo1.Lines.Add('方法名称: ' + m.Name);
        {方法类型: proceedure、function 等}
        Memo1.Lines.Add('方法类型: ' + GetEnumName(TypeInfo(TMethodKind), Ord(m.MethodKind)));
        {方法的返回值类型}
        if Assigned(m.ReturnType) then
          Memo1.Lines.Add('返回值: ' + GetEnumName(TypeInfo(TTypeKind), Ord(m.ReturnType.TypeKind)));
        {方法的参数列表}
        mps := m.GetParameters;
        if Length(mps) > 0 then
        begin
          Memo1.Lines.Add('参数:');
          for mp in mps do Memo1.Lines.Add(mp.ToString);
          //还可以通过 mp.ParamType 获取参数的数据类型
          //还可以通过 mp.Flags 获取参数的修饰符(譬如 var、const 等)
        end;
        Memo1.Lines.Add(EmptyStr);
      end;
    end;
    // Rtti修改和获取类的属性
    procedure TForm1.Button2Click(Sender: TObject);
    var
      obj: TMyClass;
      t: TRttiType;
      p: TRttiProperty;
      r: TValue;
    begin
      obj := TMyClass.Create(Self);
      t := TRttiContext.Create.GetType(TMyClass);
      p := t.GetProperty('Name');
      p.SetValue(obj, 'NewName');
      r := p.GetValue(obj);
      ShowMessage(r.AsString);
      obj.Free;
    end;
    // Rtti设置枚举值
    procedure TForm1.Button3Click(Sender: TObject);
    var
      t: TRttiType;
      p: TRttiProperty;
      r: TValue;
    begin
      t := TRttiContext.Create.GetType(TButton);
      p := t.GetProperty('Align');
      p.SetValue(Button1, TValue.FromOrdinal(TypeInfo(TAlign), Ord(alLeft)));
      r := p.GetValue(Button1);
      ShowMessage(IntToStr(r.AsOrdinal));
    end;
    // Rtti获取类的字段
    procedure TForm1.Button4Click(Sender: TObject);
    var
      ctx: TRttiContext;
      t: TRttiType;
      f: TRttiField;
    begin
      Memo1.Clear;
      t := ctx.GetType(TButton);
      for f in t.GetFields do Memo1.Lines.Add(f.ToString);
    end;
    // Rtti获取结构体的信息
    procedure TForm1.Button1Click(Sender: TObject);
    var
      t: TRttiRecordType;
      f: TRttiField;
    begin
      Memo1.Clear;
      t := TRttiContext.Create.GetType(TypeInfo(TPoint)).AsRecord;
      Memo1.Lines.Add(t.QualifiedName);
      Memo1.Lines.Add(Format('Size: %d', [t.TypeSize]));
      Memo1.Lines.Add(EmptyStr);
      Memo1.Lines.Add(Format('字段数: %d', [Length(t.GetFields)]));
      Memo1.Lines.Add(Format('方法数: %d', [Length(t.GetMethods)]));
      Memo1.Lines.Add(Format('属性数: %d', [Length(t.GetProperties)]));
      Memo1.Lines.Add(EmptyStr);
      Memo1.Lines.Add('全部字段:');
      for f in t.GetFields do Memo1.Lines.Add(f.ToString);
    end;
    // Rtti获取有序类型的信息
    procedure TForm1.Button1Click(Sender: TObject);
    var
      t: TRttiOrdinalType;
    begin
      Memo1.Clear;
      //先从类型名获取类型信息对象
      t := TRttiContext.Create.GetType(TypeInfo(Byte)) as TRttiOrdinalType;
      Memo1.Lines.Add(Format('%s - %s', [t.Name, t.QualifiedName]));
      Memo1.Lines.Add(Format('Size: %d', [t.TypeSize]));
      Memo1.Lines.Add('QualifiedName: ' + t.QualifiedName);
      Memo1.Lines.Add(Format('Min,Max: %d , %d', [t.MinValue, t.MaxValue]));
      Memo1.Lines.Add(EmptyStr); //空字串
      //可以用 AsOrdinal 方法代替前面的 as TRttiOrdinalType
      t := TRttiContext.Create.GetType(TypeInfo(Word)).AsOrdinal;
      Memo1.Lines.Add(Format('%s: %s', [t.Name, t.QualifiedName]));
      Memo1.Lines.Add(Format('Size: %d', [t.TypeSize]));
      Memo1.Lines.Add(Format('Min,Max: %d , %d', [t.MinValue, t.MaxValue]));
      Memo1.Lines.Add(EmptyStr);
      //也可以直接强制转换
      t := TRttiOrdinalType(TRttiContext.Create.GetType(TypeInfo(Integer)));
      Memo1.Lines.Add(Format('%s: %s', [t.Name, t.QualifiedName]));
      Memo1.Lines.Add(Format('Size: %d', [t.TypeSize]));
      Memo1.Lines.Add(Format('Min,Max: %d , %d', [t.MinValue, t.MaxValue]));
      Memo1.Lines.Add(EmptyStr);
    end;

  • 相关阅读:
    【转】nginx(一) nginx详解
    美好生活需要全方位的保障
    Oracle私网mtu滚动修改实施方案
    小知识:后台执行Oracle创建索引免受会话中断影响
    小知识:Oracle RAC添加服务名实现单节点访问
    Windows平台安装Oracle11.2.0.4客户端报错INS-30131
    小知识:如何赋予用户查看所有存储过程和触发器的权限
    小知识:如何判定crontab任务的执行频度
    小知识:解决EXP-00003的报错
    Oracle删除索引规范
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2347144.html
Copyright © 2020-2023  润新知