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有分!!!!
TMySet=set of TMyenum;我想通过"my2"得到tmyenum类型的my2,也就是整数1,以及反向转换,
而不是inttostr(ord(my2))这么简单.TReader和TWriter提供这样的功能,谁能够给我详细的解释一下最好!谢谢!up有分!!!!
集合,枚举类型的属性编辑代码中就有!
谁知道这个单元的函数都怎么用?谢谢!
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;