zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    在vue项目中stylus的安装及使用
    如何在vue中全局引入stylus文件的公共变量
    d3.js在vue项目中的安装及案例
    cytoscape.js在vue项目中的安装及案例
    vue路由router的三种传参方式
    vue项目警告There are multiple modules with names that only differ in casing
    vue+iview实现一行平均五列布局
    JVM 内存对象管理
    JVM 垃圾回收机制
    面试随笔-01
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2347144.html
Copyright © 2011-2022 走看看