CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

怎样由一对象和其属性名,获得此属性的所有枚举值

楼主3fly(三飞)2001-11-19 20:50:21 在 Delphi / VCL组件开发及应用 提问

例如TButton的ModalResult属性的枚举值有mrNone,   mrOk,   mrCancel... 问题点数:33、回复次数:33Top

1 楼3fly(三飞)回复于 2001-11-28 18:15:01 得分 0

我吃饭先,晚上再来,各位大虾帮忙Top

2 楼ChipHead(满脑袋芯片和程序的人)回复于 2001-11-28 18:27:19 得分 0

type  
      TModalResult   =   (mrNone,   mrOK,   mrCancel,   ……);  
      TMyButton   =   class(TButton)  
      private  
          FMyModalResult:   TModalResult;  
      published  
          MyModalResult:   TModalResult   read   FMyModalResult   write   FMyModalResult;  
      end;  
   
  这样写了之后,属性窗口中就会自动列出这些枚举值供你选择。Top

3 楼cczdp(星河)回复于 2001-11-28 18:55:49 得分 0

楼上的,好象回答的不对吧。人家问的不是这个意思吧。(虽然我不会这个问题。)  
  Top

4 楼3fly(三飞)回复于 2001-11-28 21:15:16 得分 0

是关于   DsgnIntf   和   TypInfo   两单元中的类(TPropertyEditor   &   TComponentEditor)和其方法的问题,请大家解决Top

5 楼mengbo(心有独钟)回复于 2001-11-28 21:55:33 得分 0

写上你要知道的对象,然后选中后F1   就OK了,Top

6 楼3fly(三飞)回复于 2001-11-28 22:19:31 得分 0

我是要在运行时获得啦Top

7 楼3fly(三飞)回复于 2001-11-28 22:24:59 得分 0

我要的功能是:大概写一函数,传入一类(如TButton)及其一属性字符串(如'ModalResult'),就返回一TStringList('mrNone'#$D#$A'mrOk'#$D#$A'mrCancel'...)Top

8 楼3fly(三飞)回复于 2001-11-28 22:32:12 得分 0

高手在哪?Top

9 楼agui(阿贵: 高级图形用户界面)回复于 2001-11-29 00:29:14 得分 2

《Delphi高级开发指南》讲得最清楚了,关于RTTI部分。  
   
  不过现在,看着TypInfo.pas头疼!Top

10 楼passos(古月春秋)回复于 2001-11-29 04:30:55 得分 8

引用   TypInfo   单元  
   
  var  
      I:   Integer;  
      P:   PTypeInfo;  
  begin  
      P   :=   TypeInfo(TPosition);   //测试   TPosition   类型  
      with   GetTypeData(P)^   do  
      for   I   :=   MinValue   to   MaxValue   do  
          Memo1.Lines.Add(Format('%d:   %s',   [I,   GetEnumName(P   ,   I)]));  
  end;Top

11 楼3fly(三飞)回复于 2001-11-29 08:31:42 得分 0

to   passos(古月春秋)为何TModalResult就不行(MinValue:   MaxValue   |   -2147483648:   2147483647)Top

12 楼w8u(晌马)回复于 2001-11-29 08:35:59 得分 8

procedure   GetClassProp(aClass:TObject;aProp:String;List:TStrings);  
  var  
      ClassTypeInfo:pTypeInfo;  
      ClassTypeData:PTypeData;  
      PropInfo:PPropInfo;  
  //     i:integer;  
  //     Numprops:integer;  
  begin  
      ClassTypeInfo:=aClass.ClassInfo;  
      ClassTypeData:=GetTypeData(ClassTypeInfo);  
      if   ClassTypeData.PropCount<>0   then   begin  
          PropInfo:=GetPropInfo(ClassTypeInfo,aProp);  
          if   propInfo<>nil   then   begin  
              List.Add(Format('%s   ,%s',[propInfo^.Name,propinfo^.proptype^.name]));  
              if   propinfo^.proptype^.Kind=tkEnumeration   then   begin  
                  List.Add('it   is   a   enum');  
              end;  
          end  
          else  
              List.Add('no   this   prop..');  
      end;  
  end;  
   
   
  要uses   typinfo  
  没时间了。老板来了。还没达到要求,自己看者办吧。Top

13 楼Snakeguo(Guoguo)回复于 2001-11-29 08:43:11 得分 0

^Top

14 楼szchengyu(happy.net)回复于 2001-11-29 09:14:03 得分 0

9494,  
  TModalResult怎么不一样呢?  
   
  TModalResult   =   Low(Integer)..High(Integer);  
   
  只能关注Top

15 楼V_Lucky(最优解)回复于 2001-11-29 09:29:22 得分 0

~关注   Top

16 楼blackfiles(一个和尚挑水喝)回复于 2001-11-29 09:39:53 得分 0

关~注Top

17 楼3fly(三飞)回复于 2001-11-29 09:44:18 得分 0

to w8u(晌马) 剩余步骤同 passos(古月春秋) 的程序段如下  
              if   propinfo^.proptype^.Kind=tkEnumeration   then   begin  
  //                 List.Add('it   is   a   enum');  
                  with   GetTypeData(Propinfo^.proptype^)^   do  
                  for   i   :=   MinValue   to   MaxValue   do  
                      List.Add(Format('%d:   %s',   [i,   GetEnumName(Propinfo^.Proptype^   ,   i)]));  
              end;  
  对TModalResult无效,咋办?Top

18 楼3fly(三飞)回复于 2001-11-29 09:46:10 得分 0

解答出   TModalResult   的问题后立刻给分Top

19 楼xzgyb(老达摩)回复于 2001-11-29 12:24:29 得分 0

正因为TModalResult是子界类型,所以他没有相应的名称信息  
  TModalResult   =   Low(Integer)..High(Integer);  
   
  看一看TCursor,跟这差不多  
  TCursor   =   -32768..32767;  
   
  Delphi也提供了相应的CursorToString来转换为相应的string;  
  也就是从一个Cursors的名称映射表,转换  
   
   
  Top

20 楼3fly(三飞)回复于 2001-11-29 16:54:07 得分 0

子界类型?如果我要获得这种“子界类型”的所有值,应该怎么办?Top

21 楼xzgyb(老达摩)回复于 2001-11-29 17:37:50 得分 5

可能是叫子界类型吧,我忘了,呵呵  
  我不知道  
  但delphi都做了个Cursors的映射表,我想也只能这么做  
  仿照ColorToString弄个函数  
  function   ModalResultToStr(AValue:   TModalResult):   string;  
  const  
      ModalResults   :   array[0..10]   of   TIdentMapEntry     =   (  
              (Value:   mrNone;             Name:   'mrNone'),  
              (Value:   mrOk;                 Name:   'mrOk'),  
              (Value:   mrCancel;         Name:   'mrCancel'),  
              (Value:   mrAbort;           Name:   'mrAbort'),  
              (Value:   mrRetry;           Name:   'mrRetry'),  
              (Value:   mrIgnore;         Name:   'mrIgnore'),  
              (Value:   mrYes;               Name:   'mrYes'),  
              (Value:   mrNo;                 Name:   'mrNo'),  
              (Value:   mrAll;               Name:   'mrAll'),  
              (Value:   mrNoToAll;       Name:   'mrNoToAll'),  
              (Value:   mrYesToAll;     Name:   'mrYesToAll'));  
  begin  
      if   Not   IntToIdent(AValue,   Result,   ModalResults)   then  
          FmtStr(Result,   '%s%.8x',   [HexDisplayPrefix,   AValue]);  
  end;  
  很累阿  
  Top

22 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-11-29 17:41:49 得分 10

uses  
      TypeInfo;  
   
  function   IntegerSet(const   mValue;   mSize:   Word):   TIntegerSet;  
  var  
      I:   Integer;  
  begin  
      Result   :=   [];  
      for   I   :=   0   to   mSize   -   1   do  
          Integer(Result)   :=   Integer(Result)   +   TByteArray(mValue)[I]  
  end;   {   IntegerSet   }  
   
  function   GetSetStr(mTypeInfo:   PTypeInfo;   const   mValue;   mSize:   Word;  
      mBrackets:   Boolean   =   True):   string;  
  var  
      vCompType:   PTypeInfo;  
      I:   Integer;  
      S:   TIntegerSet;  
  begin  
      Result   :=   '';  
      S   :=   IntegerSet(mValue,   mSize);  
      vCompType   :=   GetTypeData(mTypeInfo)^.CompType^;  
      for   I   :=   GetTypeData(vCompType).MinValue   to   GetTypeData(vCompType).MaxValue   do  
          if   I   in   S   then  
              Result   :=   Result   +   ','   +   GetEnumName(vCompType,   I);  
      Delete(Result,   1,   1);  
      if   mBrackets   then   Result   :=   '['   +   Result   +   ']';  
  end;   {   GetSetStr   }  
   
  function   GetSetAll(mTypeInfo:   PTypeInfo;  
      mBrackets:   Boolean   =   True):   string;  
  var  
      vCompType:   PTypeInfo;  
      I:   Integer;  
      S:   TIntegerSet;  
  begin  
      Result   :=   '';  
      S   :=   IntegerSet(mValue,   mSize);  
      vCompType   :=   GetTypeData(mTypeInfo)^.CompType^;  
      for   I   :=   GetTypeData(vCompType).MinValue   to   GetTypeData(vCompType).MaxValue   do  
          Result   :=   Result   +   ','   +   GetEnumName(vCompType,   I);  
      Delete(Result,   1,   1);  
      if   mBrackets   then   Result   :=   '['   +   Result   +   ']';  
  end;   {   GetSetStr   }  
  Top

23 楼xzgyb(老达摩)回复于 2001-11-29 18:04:08 得分 0

zswang老大,我的头发晕Top

24 楼agui(阿贵: 高级图形用户界面)回复于 2001-11-30 18:04:25 得分 0

ModalResult不是枚举类型,所以得不了名称。  
  你只有判断其属性名是'ModalResult'后,再进行翻译。这就是只能比较土了,用case或子域判断(in)(在定义的范围之内)Top

25 楼3fly(三飞)回复于 2001-11-30 21:25:37 得分 0

to zswang(伴水)(伤心中) 上面三个function我不会调用啊!不知传什么值过去,老在function   GetSetStr(...)的vCompType   :=   GetTypeData(mTypeInfo)^.CompType^;语句处报错,请给一例子Top

26 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-11-30 21:34:12 得分 0

unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   FuncUnit,   StdCtrls;  
   
  type  
      TForm1   =   class(TForm)  
          Memo1:   TMemo;  
          Button1:   TButton;  
          procedure   Button1Click(Sender:   TObject);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
  {$R   *.dfm}  
   
  uses  
      TypInfo;  
   
  function   IntegerSet(const   mValue;   mSize:   Word):   TIntegerSet;  
  var  
      I:   Integer;  
  begin  
      Result   :=   [];  
      for   I   :=   0   to   mSize   -   1   do  
          Integer(Result)   :=   Integer(Result)   +   TByteArray(mValue)[I]  
  end;   {   IntegerSet   }  
   
  function   GetSetStr(mTypeInfo:   PTypeInfo;   const   mValue;   mSize:   Word;  
      mBrackets:   Boolean   =   True):   string;  
  var  
      vCompType:   PTypeInfo;  
      I:   Integer;  
      S:   TIntegerSet;  
  begin  
      Result   :=   '';  
      S   :=   IntegerSet(mValue,   mSize);  
      vCompType   :=   GetTypeData(mTypeInfo)^.CompType^;  
      for   I   :=   GetTypeData(vCompType).MinValue   to   GetTypeData(vCompType).MaxValue   do  
          if   I   in   S   then  
              Result   :=   Result   +   ','   +   GetEnumName(vCompType,   I);  
      Delete(Result,   1,   1);  
      if   mBrackets   then   Result   :=   '['   +   Result   +   ']';  
  end;   {   GetSetStr   }  
   
  function   GetSetAll(mTypeInfo:   PTypeInfo;  
      mBrackets:   Boolean   =   True):   string;  
  var  
      vCompType:   PTypeInfo;  
      I:   Integer;  
  begin  
      Result   :=   '';  
      vCompType   :=   GetTypeData(mTypeInfo)^.CompType^;  
      for   I   :=   GetTypeData(vCompType).MinValue   to   GetTypeData(vCompType).MaxValue   do  
          Result   :=   Result   +   ','   +   GetEnumName(vCompType,   I);  
      Delete(Result,   1,   1);  
      if   mBrackets   then   Result   :=   '['   +   Result   +   ']';  
  end;   {   GetSetAll   }  
   
  type  
      TMyType   =   set   of   (MyType1,   MyType2,   MyType3,   MyType4,   MyType5,   MyType6);  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
      Memo1.Clear;  
      Memo1.Lines.Add(GetSetStr(TypeInfo(TMyType),   [MyType2,   MyType5],   SizeOf([MyType2,   MyType5])));  
      Memo1.Lines.Add(GetSetAll(TypeInfo(TMyType)));  
  end;  
   
  end.  
  Top

27 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-11-30 21:42:25 得分 0

//DsgnIntf.pas:2924  
  const  
      ModalResults:   array[mrNone..mrYesToAll]   of   string   =   (  
          'mrNone',  
          'mrOk',  
          'mrCancel',  
          'mrAbort',  
          'mrRetry',  
          'mrIgnore',  
          'mrYes',  
          'mrNo',  
          'mrAll',  
          'mrNoToAll',  
          'mrYesToAll');  
  Top

28 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-11-30 21:43:17 得分 0

for   Delphi6Top

29 楼3fly(三飞)回复于 2001-11-30 21:52:42 得分 0

原来如此,不过这几个function可获得TModalResult中的所有值吗?我用  
      Memo1.Lines.Add(GetSetStr(TypeInfo(TModalResult),   [mrok,   mrcancel],   SizeOf([mrok,   mrcancel])));都不行嘞(TModalResult   不是集合类型吧?)Top

30 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-11-30 22:02:25 得分 0

const  
      ModalResults:   array[mrNone..mrYesToAll]   of   string   =   (  
          'mrNone',  
          'mrOk',  
          'mrCancel',  
          'mrAbort',  
          'mrRetry',  
          'mrIgnore',  
          'mrYes',  
          'mrNo',  
          'mrAll',  
          'mrNoToAll',  
          'mrYesToAll');  
   
  function   f:   string  
  var  
      I:   Integer;  
  begin  
      for   I   :=   mrNone   to   mrYesToAll   do  
          Result   :=   Result   +   ','   +   ModalResults[I];  
      Delete(Result,   1,   1);  
  end;  
  Top

31 楼3fly(三飞)回复于 2001-11-30 22:10:15 得分 0

看来只有这样了Top

32 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-11-30 22:53:58 得分 0

'mrNone,......,mrYesToAll'  
  直接写不是更好?Top

33 楼lizhenjia(暴雪)回复于 2002-05-06 12:15:20 得分 0

收藏Top

相关问题

  • 怎样获得FileDialog对象的FilterExtensions属性
  • 请问如何使CBrush对象属性为空?即 获得一个空刷子?
  • 提问,如何获得一个对象的方法吓属性信息?
  • 怎用程序枚举COM对象的全部,属性,方法!
  • 【在线等,100分求助!】子对象如何获得父对象的属性值?
  • 对象属性遍历
  • Recordset对象的filter属性
  • 对象的属性问题
  • 如何用反射设置一个对象的枚举属性值
  • 如何取出对象的属性?

关键词

  • 属性
  • tmodalresult
  • mrnone
  • mrcancel
  • mryestoall
  • mrok
  • propinfo
  • modalresults
  • msize
  • classtypeinfo

得分解答快速导航

  • 帖主:3fly
  • agui
  • passos
  • w8u
  • xzgyb
  • zswang

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo