有办法枚举到结构体的成员么? ( 积分: 100 )

  • 主题发起人 主题发起人 crazycock
  • 开始时间 开始时间
C

crazycock

Unregistered / Unconfirmed
GUEST, unregistred user!
我以前知道了如何以字符形式获得枚举集中的元素。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3165106

现在有个情况,就是我建了一个ini文件,里面有很多的值,我在loadini的时候会读取进来,放到一个结构体中,比如ini文件是
[string]
menu_play=播放
menu_stop=停止
menu_next=下一曲
menu_prior=上一曲
menu_pause=暂停

我在程序中,有一个结构体
TMediaCtrl=record
menu_play:string;
menu_stop:string;
menu_next:string;
menu_prior:string;
menu_pause:string;
end;

var
mediactrl:TMediaCtrl;
我需要挨个通过
mediactrl.menu_play := ini.ReadString('string','menu_play','');
mediactrl.menu_stop := ini.ReadString('string','menu_stop','');
mediactrl.menu_next := ini.ReadString('string','menu_next','');
mediactrl.menu_prior := ini.ReadString('string','menu_prior','');
mediactrl.menu_pause := ini.ReadString('string','menu_pause','');

在增加新的内容后,需要ini增加一条,结构体增加一条,loadini代码增加一条,很麻烦。
不知道有没有办法获得结构体的某个成员,然后再获得它的字符串名,这样就可以一劳永逸了。

最理想的代码是:
for i:=0 to GetRecordMemberCount(TMediaCtrl)-1 do
GetRecordMember(TMediaCtrl).Item := ini.ReadString('string',GetRecordMember(TMediaCtrl).Item.Name,'');

其中,
GetRecordMemberCount函数获得结构体TMediaCtrl的成员数,
GetRecordMember().Item是获得某个成员
GetRecordMember().Item.Name得到这个成员的名字(string类型的返回值)。

能否实现?TypInfo单元里是否提供这样的函数?或者把TMediaCtrl定义为TObject,这样反而有点可能哦~对类的成员好像更多运行时函数可用。
 
這個問題有點難度。。。。
 
不用结构体 或者用一个复合结构体 可以拉
TMediaCtrl=TCollection;//这个类 可以使用名字拉
 
这个问题很简单,
你只要把这个结构修改下,结合数组使用就可以,
TMediaCtrl=record
act, actname :string;
end;
mediactrl : array [1..h] of TMediaCtrl;

存放的就是'menu_play'之类,
通过下标遍历,
for i:= 1 to h
mediactrl.actname := ini.ReadString('string',mediactrl.act,'');

这其实是 pascal 语言的 基本运用,
不用想的 那么复杂
 
不用结构体.用类.
published成员不久行了吗.
 
可以考虑用TStrings来读取和写入,TStrings的Names,Values和ValueFromIndex三个属性可以满足你的需求
 
record的运行时信息中不包含成员的名称,只包含类型和位移。可以枚举成员的值,但是不能得到名称。
 
谢谢大家的指点。特别是“地质灾害”,我试着用类看看能否实现这个功能。
 
后退
顶部