定义一个结构,如何遍历其包含的所有项? ( 积分: 100 )

  • 主题发起人 主题发起人 driayu
  • 开始时间 开始时间
D

driayu

Unregistered / Unconfirmed
GUEST, unregistred user!
比如定义下面一个结构<br>type<br>&nbsp;&nbsp;TMyTable=packed&nbsp;record<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Autoid:integer;&nbsp;//自动编号<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Indexid:Integer;&nbsp;&nbsp;//记录号<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Deleted:Boolean;&nbsp;//标记当前记录是否已被删除<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TableFlag:String[30];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReadOnly:Boolean;&nbsp;//是否只读<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Maxid:Integer;&nbsp;//用于保存自动编号时的最大编号值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Orderid:integer;&nbsp;&nbsp;//用于自定义排序<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Parentid:integer;&nbsp;//用于树形显示<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ValidRecord:Integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeletedRecord:Integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StartPos:Integer;&nbsp;//开始位置<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EndPos:Integer;&nbsp;//结束位置<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EnableDel:Boolean;&nbsp;//该表是否允许删除<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Default:Boolean;<br>&nbsp;&nbsp;end;&nbsp;<br>有没有办法遍历&nbsp;TMyTable所包含的所有项?
 
RTTI应该能做到~~
 
Delphi中的Record并没有相应的RTTI信息可供使用,建议针对Record写一个类,在类中实<br>现对成员的遍历。<br>&nbsp;&nbsp;Record型数据是面向过程编程的产物,非常节省资源,但是功能实在太弱。
 
to&nbsp;nakata_wang<br>能否说详细点,该如何做?
 
想怎么遍历?<br>var<br>&nbsp;aa:&nbsp;TMyTable;<br>&nbsp;buf:&nbsp;pchar;<br>&nbsp;i:&nbsp;integer;<br>begin<br>&nbsp;&nbsp;buf:=&nbsp;@aa;<br><br>&nbsp;&nbsp;for&nbsp;i:=&nbsp;0&nbsp;to&nbsp;sizeof(tmytable)&nbsp;-&nbsp;1&nbsp;do&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;buf<br>end;<br><br>这样应该就可以了。
 
应该不行的,记录的访问编译后都是采用偏移方式访问的。每个域的偏移没有规律(假如你的域大小是不等的,这中间还涉及关键字packed,是否启用字节对齐等因素),你怎么遍历?如果真的要遍历域,你需要为这个记录保存其他的辅助信息,至于怎么保存,如何读取是另外一个问题了。如果你知道每个域的偏移(大小),那么你可以很好的遍历这个记录结构。
 
多人接受答案了。
 

Similar threads

后退
顶部