标签: rtti

如何检查Delphi类是否被声明为abstract?

在Delphi中是否可以使用RTTI(或其他东西)来检查类是否被声明为抽象?就像是:

TMyAbstractClass = class abstract(TObject)
  // ...
end;

...

if IsAbstract(TMyAbstractClass.ClassInfo) then
  ShowMessage('Yeah')
else
  ShowMessage('Computer says no...');
Run Code Online (Sandbox Code Playgroud)

delphi rtti

6
推荐指数
2
解决办法
2598
查看次数

Variant的内容类型的字符串表示?

首先,为我的英语道歉,我希望我在这里写的是有道理的.现在我的问题.

如何使用TypInfo.GetEnumName()获取Variant 的内容类型的字符串表示形式.我试过以下,没有运气,我得到一个数字表示.

myString := GetEnumName( TypeInfo(TVarType), TVarData(myVar).VType );
Run Code Online (Sandbox Code Playgroud)

谢谢.

delphi rtti delphi-2009 typeinfo

6
推荐指数
1
解决办法
5740
查看次数

使用Delphi RTTI获取接口的字符串名称

我已经证明我可以使用Delphi 2010从其GUID获取接口的名称(例如,IMyInterface转换为字符串'IMyInterface'.我想在Delphi 7中实现这一点(兼容性).这可能吗?或者是有基本的编译限制.

delphi interface rtti

6
推荐指数
1
解决办法
3240
查看次数

没有RTTI的C++双重调度"可扩展"

没有人知道的方式在C正确处理双调度++ 而不使用RTTI和dynamic_cast的<>,并且也是溶液,其中,所述类层次是可扩展的,即基类可以从进一步得到,它的定义/实施不需要知道的吗?
我怀疑没有办法,但我很高兴被证明是错的:)

c++ polymorphism overloading double-dispatch rtti

6
推荐指数
2
解决办法
2828
查看次数

RTTI TRttiMethod.Invoke,stdcall和const参数的错误

我有RTTI TRttiMethod.Invoke,stdcall和const参数的问题:

    obj := TClassRecordTest.Create;
    try
      b.a := 10; b.b := 100;

      a.a := 1;  a.b := 2;
      writeln('b.a='+IntToStr(b.a)+' b.b='+IntToStr(b.b));
      writeln;
      writeln('call test1');
      writeln('a.a='+IntToStr(a.a)+' a.b='+IntToStr(a.b));
      r := VToRec(RTTICall(obj, 'Test1', @a, @b));
      writeln('test1 r.a='+IntToStr(r.a)+' r.b='+IntToStr(r.b));

      a.a := 2;  a.b := 3;
      writeln('call test2');
      writeln('a.a='+IntToStr(a.a)+' a.b='+IntToStr(a.b));
      r := VToRec(RTTICall(obj, 'Test2', @a, @b));
      writeln('test3 r.a='+IntToStr(r.a)+' r.b='+IntToStr(r.b));

      a.a := 3;  a.b := 4;
      writeln('call test3');
      writeln('a.a='+IntToStr(a.a)+' a.b='+IntToStr(a.b));
      r := VToRec(RTTICall(obj, 'Test3', @a, @b));
      writeln('test3 r.a='+IntToStr(r.a)+' r.b='+IntToStr(r.b));

      a.a := 4;  a.b := 5;
      writeln('call test4'); …
Run Code Online (Sandbox Code Playgroud)

delphi rtti delphi-xe

6
推荐指数
1
解决办法
1216
查看次数

Delphi Class Helper RTTI GetMethod

让我们说我有一个示例类助手

TSampleClassHelper = class helper for TSampleClass
public
  procedure SomeHelper;
end;
Run Code Online (Sandbox Code Playgroud)

我做以下事情:

var
  obj :TSampleClass;
begin
  obj:=TSampleClass.Create;
  obj.SomeHelper;
end;
Run Code Online (Sandbox Code Playgroud)

这按预期工作.

但是,如何使用RTTI来调用辅助方法呢?以下似乎不起作用,GetMethod返回nil.

var
  obj :TSampleClass;
  ctx :TRTTIContext;
  rtype :TRTTIType;
  rmethod :TRTTIMethod;
begin
  obj:=TSampleClass.Create;
  rtype:=ctx.GetType(obj.ClassType);
  rmethod:=rtype.GetMethod('SomeHelper'); // rmethod is nil !
end;
Run Code Online (Sandbox Code Playgroud)

那么RTTI不适用于类助手中定义的方法吗?有没有办法解决?

谢谢.

delphi rtti class-helpers

6
推荐指数
1
解决办法
1787
查看次数

是否在运行时或编译时评估了typeid(T)?

我无法在任何地方找到这个看似简单的问题的答案.

以下C++函数是否使用RTTI?它当然不必,但我想知道是否有保证在编译时确定typeid.

template <typename T>
const char *getName()
{
   return typeid(T).name();   // Resolved at compile time?
}
Run Code Online (Sandbox Code Playgroud)

c++ templates rtti

6
推荐指数
2
解决办法
2029
查看次数

如何正确使用TRttiMethod.Invoke中的字符串作为参数?

我正在尝试使用RTTI使用Text-property来概括可视组件的内容验证,但是当我尝试将字符串值传递给TRttiMethod.Invoke时,我收到消息"Invalid Typecast".(实际上是"UngültigeTypumwandlung",但我猜,这是一个合适的翻译.)

假设所有传递的对象都是完美的,下面的代码将被删除所有安全措施,断言等.

procedure ValidateTextFieldAndSetFocus(const Field: TObject; const Validator: TObject; const errorStates: array of TStringValidationResult; const sErrorMessage: string);
var
  context  : TRttiContext;
  objField : TRttiType;
  objValid : TRttiType;
  prop     : TRttiProperty;
  execute  : TRttiMethod;
  I        : Integer;
  validResult : TStringValidationResult;
  value    : TValue;
begin
  context  := TRttiContext.Create;
  objField := context.GetType(Field.ClassInfo);
  objValid := context.GetType(Validator.ClassInfo);
  prop     := objField.GetProperty('Text');
  value    := prop.GetValue(Field);
  execute  := objValid.GetMethod('Execute');
  for I := 0 to High(errorStates) do
    if execute.Invoke(Validator,[value]).TryAsType<TStringValidationResult>(validResult) then
      if validResult = errorStates[I] then
      begin
        SetFocusIfCan(Field);
        raise …
Run Code Online (Sandbox Code Playgroud)

delphi rtti delphi-xe3

6
推荐指数
1
解决办法
1011
查看次数

对于静态数组,使用RTTI获取记录字段类型失败

我正在尝试获取记录字段的类型以创建正确的比较器(作为任何/几乎任何记录类型的通用解决方案).我找不到静态数组的类型信息:

  TArrFieldTest = record
    a: string;
    b: array[0..3] of byte;
  end;

procedure Test;
var
  rttiContext: TRttiContext;
  rttiType: TRttiType;
  rttiFields: TArray<TRttiField>;
begin
  rttiType := rttiContext.GetType(TypeInfo(TArrFieldTest));
  rttiFields := rttiType.GetFields;
  Assert(rttiFields[0].FieldType<>nil); // it's ok
  Assert(rttiFields[1].FieldType<>nil); // fail here!
end;
Run Code Online (Sandbox Code Playgroud)

对于任何类型的静态数组,FieldType都是nil.任何想法在这里有什么不对?或者也许有更简单的方法来创建与TArray/TDictionary等一起使用的记录的比较器?

delphi rtti delphi-10-seattle

6
推荐指数
1
解决办法
930
查看次数

使用RTTI获取变量名称

我试图像这样使用RTTI获取变量名.

这是我的测试.

type
  TStringHelper = record helper for string
    function Name: string;
  end;

  TMyRecord = record
    Field1:string;
  end;

implementation

{ TStringHelper }
function TStringHelper.Name: string;
var
 context : TRttiContext;
begin
 context := TRttiContext.Create;
 result := context.GetType(@Self).Name; // return empty
 context.Free;
end;

procedure TForm2.FormCreate(Sender: TObject);
var
 r : TMyRecord;
begin
  ShowMessage(r.Field1.Name);
end;
Run Code Online (Sandbox Code Playgroud)

TRttiType返回的名称为空.

有没有办法得到变量名?

delphi rtti

6
推荐指数
1
解决办法
819
查看次数