inttostr,strtoint之类的delphi6已经提供这就不用说了。我想知道诸如:set--string;enum--string;record--string(主要是能否得到record每项成员的名称?);等等其他具备这样转换可能的数据类型。比如TMynum=(my1,my2,my3);
TMySet=set of TMyenum;我想通过"my2"得到tmyenum类型的my2,也就是整数1,以及反向转换,
而不是inttostr(ord(my2))这么简单.TReader和TWriter提供这样的功能,谁能够给我详细的解释一下最好!谢谢!up有分!!!!

解决方案 »

  1.   

    可以,Delphi源代码中有.
    集合,枚举类型的属性编辑代码中就有!
      

  2.   

    Rtti实际上也是依靠一个对照表
      

  3.   

    既然有表可依,那么一定能够完成字符串和任何数据类型的转换阿!用delphi翻编译工具就能够看到所有的类型的详细信息包括record和class还有自定义的一切类型。那么一定能够有某种方法通过字符串转换回来,而且绝对用到typinfo.pas单元,
    谁知道这个单元的函数都怎么用?谢谢!
      

  4.   

    uses typinfo;
    type pp=(u1,u2,u3,u4,u5,u6,u7,u8,u9);function GetEnumNameValue(TypeInfo: PTypeInfo; const Name: string): Integer;
    asm
            { ->    EAX Pointer to type info        }
            {       EDX Pointer to string           }
            { <-    EAX Value                       }        PUSH    EBX
            PUSH    ESI
            PUSH    EDI        TEST    EDX,EDX
            JE      @notFound        {       point ESI to first name of the base type }
            XOR     ECX,ECX
            MOV     CL,[EAX].TTypeInfo.Name.Byte[0]
            MOV     EAX,[EAX].TTypeInfo.Name[ECX+1].TTypeData.BaseType
            MOV     EAX,[EAX]
            MOV     CL,[EAX].TTypeInfo.Name.Byte[0]
            LEA     ESI,[EAX].TTypeInfo.Name[ECX+1].TTypeData.NameList        {       make EDI the high bound of the enum type }
            MOV     EDI,[EAX].TTypeInfo.Name[ECX+1].TTypeData.MaxValue        {       EAX is our running index }
            XOR     EAX,EAX        {       make ECX the length of the current string }@outerLoop:
            MOV     CL,[ESI]
            CMP     ECX,[EDX-4]
            JNE     @lengthMisMatch        {       we know for sure the names won't be zero length }
    @cmpLoop:
            MOV     BL,[EDX+ECX-1]
            XOR     BL,[ESI+ECX]
            TEST    BL,0DFH
            JNE     @misMatch
            DEC     ECX
            JNE     @cmpLoop        {       as we didn't have a mismatch, we must have found the name }
            JMP     @exit@misMatch:
            MOV     CL,[ESI]
    @lengthMisMatch:
            INC     EAX
            LEA     ESI,[ESI+ECX+1]
            CMP     EAX,EDI
            JLE     @outerLoop        {       we haven't found the thing - return -1  }
    @notFound:
            OR      EAX,-1@exit:
            POP     EDI
            POP     ESI
            POP     EBX
    end;
    procedure TForm1.Button1Click(Sender: TObject);
     var g:pp;
    begin
        g:=pp(GetEnumNameValue(TypeInfo(pp),'u1'));
        if g=u1 then
          ShowMessage('ok');
    end;
      

  5.   

    那么set和字符串之间的互相转换呢?谢谢!
      

  6.   

    如何把字符串"[fsItalic,fsBold]"转化成真正的[fsItalic,fsBold]?
      

  7.   

    自己解析"[fsItalic,fsBold]",得到'fsItalic','fsBold',再GetEnumNameValue ,加入集合
      

  8.   

    支持pascal Script最好的是IFPS3