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

解决方案 »

  1.   

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

  2.   

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

  3.   

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

  4.   

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

  5.   

    引用 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;
      

  6.   

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

  7.   

    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
    没时间了。老板来了。还没达到要求,自己看者办吧。
      

  8.   

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

  9.   

    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无效,咋办?
      

  10.   

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

  11.   

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

  12.   

    可能是叫子界类型吧,我忘了,呵呵
    我不知道
    但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;
    很累阿
      

  13.   

    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 }
      

  14.   

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

  15.   

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

  16.   

    unit Unit1;interfaceuses
      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.
      

  17.   

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

  18.   

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

  19.   

    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;
      

  20.   

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