RTTI的delphi2010穿越纪录

type myrec = record id:dWord; name:array[0..31] of WideChar; three:dword; count:dword; ShuXing:Single; ShuXing2:dword; ShuXing3:dWORD; end; var Form1: TForm1; mystr:TMemoryStream; nowmyrec:myrec; implementation USES Rtti; {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var rttiContext: TRttiContext; rttiType: TRttiType; fields: TArray<TRttiField>; item: myrec; i:word; begin mystr:=TMemoryStream.Create; mystr.LoadFromFile(ExtractFilePath(Application.exename)+'1.data'); mystr.Position:=20; mystr.readbuffer(nowmyRec,88); rttiType := rttiContext.GetType(TypeInfo(myRec)); fields := rttiType.GetFields; for i := low(fields) to high(fields) do begin Memo1.Lines.Add(fields[i].GetValue(@nowmyRec).ToString ); end; end; end.

该myrec.name是中国字,myrec.name的长度为64字节,我不能阅读myrec.name至备忘录,请帮助我!

--------------解决方案-------------

我在德尔福2010年,我发现一对夫妇的问题与您的代码。 首先,我不能让RTTI方法与字符数组的inline声明工作。 我把它改为:

type
TCharArray = array[0..31] of WideChar;
TRec = record
id:dWord;
name:TCharArray;
end;

如果声明数组内联,你做的方式,在调用GetValue引发AV。 这可能是固定的XE,或很可能我使用不当而RTTI。

其次,你需要,而不是标量值为数组特殊处理:

procedure Main;
var
i, j: Integer;
rec: TRec;
rttiContext: TRttiContext;
rttiType: TRttiType;
fields: TArray<TRttiField>;
val: TValue;
s: string;
begin
rec.id := 1;
rec.name := 'Hello Stack Overflow';

rttiType := rttiContext.GetType(TypeInfo(TRec));
fields := rttiType.GetFields;
for i := low(fields) to high(fields) do begin
val := fields[i].GetValue(@rec);
if val.IsArray then begin
s := '';
for j := 0 to val.GetArrayLength-1 do begin
s := s+val.GetArrayElement(j).ToString;
end;
Writeln(s);
end else begin
Writeln(val.ToString);
end;
end;
end;

输出:

1
Hello Stack Overflow

这显然​​不是生产代码,但它至少应该让你回来的路上!

PS这是我第一次看新的RTTI功能。 它看起来非常漂亮!

分类:德尔福 时间:2012-01-01 人气:0
本文关键词: 德尔福,RTTI
分享到:

相关文章

  • 德尔福RTTI在可执行项目 2012-01-25

    在C#中,你可以很容易地打开装配(只是一个从一个EXE字),然后从那个装配反射信息. 我一直在寻找类似的东西德尔福在那里我可以写一个Delphi程序,它可以指向一个Delphi的EXE,然后给我反映的信息. 我如何可以存档的? 谢谢 --------------解决方案------------- 有一些工具可以帮助扭转(DELPHI写的)的可执行文件,但它永远不会是一帆风顺的,需要有良好的x86汇编知识. 这种工具的一些实例是: IDA Pro和/或十六进制光芒 德德 互动德尔福重构的 体育总管

  • 2010年德尔福RTTI:探索枚举 2012-02-12

    考虑到这样的一个枚举: type TTypeOfData = ( [XmlName('ABC')] todABC, [XmlName('DEF')] todDEF, [XmlName('GHI')] todGHI ); 凡XmlName是用来定义序列化字符串此枚举的成员自定义属性. 我怎样才能探索附在此枚举的每个成员的属性? --------------解决方案------------- 在枚举元素相关属性目前存储在可执行的Win32 RTTI数据. RTTI已经是负责一个公平的增加可执行文件的

  • 德尔福RTTI麻烦:GetPropInfo返回比零{$ MethodInfo的ON}? 2012-11-06

    是否有GetPropInfo返回即使给定的类与正确{$ MethodInfo的}指令申报无任何可能性. type ... ... {$METHODINFO ON} TMyClass = class private fField: integer; published property Field: integer read fField write fField; end; {$METHODINFO OFF} ... ... procedure TestRTTI; begin assert(as

  • 2010年德尔福RTTI - 我怎样才能获得索引属性的列表? 2014-11-21

    随着 Cont := TRttiContext.Create; for Prop in Cont.GetType(TStrings).GetDeclaredProperties do Memo1.Lines.Add(Prop.ToString); Cont.Free; 我得到的字符串列表,除了索引属性(字符串,价值观,......)的所有属性的列表. 我可以看到在获取[声明]属性不会被索引的属性. 我怎样才能得到索引的属性呢? --------------解决方案------------- 你不

  • 2010年德尔福RTTI - RttiContext.FindType 2015-02-08

    随着RttiContext.FindType('Classes.TStringList')我得到的TStringList的RttiType没有问题. 但随着RttiContext.FindType('MyUnit.TMyClass')我总是得到零(当然MyUnit在uses子句中). 为什么,有什么不好? 例: unit MyUnit; interface uses Classes; type TMyClass = class(TStringList) end; implementation e

  • 德尔福RTTI信息和包 2012-07-16

    我试图通过Delphi代码的RTTI信息进行迭代. 当我打开一个包,我似乎并没有能够通过RTTI来获取信息,即使包手之前加载. 我在看从这篇文章,它使用RTTI模仿MEF代码,但有同样的问题也是如此. 有任何想法吗 ? 更新 当我的RttiContext并通过它循环,这是在该包中的类未示出. 例如,使用从Embarcadero的文章的代码上查询类型信息,如下面不显示在包中的类 - 这并不意味着,虽然包被装载,这些类尚未存在? for LType in FContext.GetTypes do b

  • 德尔福RTTI无法找到接口 2013-06-19

    我试图用D2010 RTTI获取一个接口. program rtti_sb_1; {$APPTYPE CONSOLE} {$M+} uses SysUtils, Rtti, mynamespace in 'mynamespace.pas'; var ctx: TRttiContext; RType: TRttiType; MyClass: TMyIntfClass; begin ctx := TRttiContext.Create; MyClass := TMyIntfClass.Create;

  • 如何测试,如果一个未知的德尔福RTTI TValue反映了一个对象,它是任何类型的通用从TList(或至少TEnumerable)的? 2014-03-28

    在Delphi中,如果我有一个TValue实例反映一个不明物体,我怎么能测试,如果这个对象是任何一种通用的一个实例TEnumerable<>甚至更好,这是一个实例也是其特定的通用枚举类型,例如: TList<> 注:我已经知道如何轻松地检查它的确切类型,即使用.BaseType相应的财产TRttiType的的TValue ,导致例如TList<string> ,但我想测试比较,如果它是一个TList<> 任何分项的类型 . 为了举例说明如何这个假设的代码&q

  • 德尔福RTTI作为创建一个TValue n维矩阵 2014-06-20

    美好的一天, TValue是一个Delphi-2010和高达RTTI功能. 从我刚才的问题上之后,我曾试图让经常函数返回一个TValue为n维. 矩阵(2D,3D,4D ......) 例如,此过程将显示一个n维矩阵(将列出从一个n维矩阵TValue变量的所有元素): Procedure Show(X:TValue); var i:integer; begin if x.IsArray then begin for i:=0 to x.GetArrayLength-1 do show(x.Get

  • 德尔福RTTI的SetValue的枚举 2014-09-13

    如何使用RTTI设置枚举字段的值? 即 type TCPIFileStatus= (fsUnknown, fsProcessed); TTest = class FStatus: TCPIFileStatus; end; ... var Data: TTest; Ctx: TRttiContext; Status : TCPIFileStatus; begin Data := TTest.Create; Status := fsProcessed; Ctx.GetType(Data.ClassT

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.734 (s). 10 q(s)