Browse Source

+ add new methods AsUnicodeString and AsAnsiString which are internally used by AsString depending on the type of String

git-svn-id: trunk@37092 -
svenbarth 8 years ago
parent
commit
c6cd64a790
1 changed files with 36 additions and 3 deletions
  1. 36 3
      packages/rtl-objpas/src/inc/rtti.pp

+ 36 - 3
packages/rtl-objpas/src/inc/rtti.pp

@@ -93,7 +93,9 @@ type
     generic class function From<T>(constref aValue: T): TValue; static; inline;
     generic class function From<T>(constref aValue: T): TValue; static; inline;
 {$endif}
 {$endif}
     function IsArray: boolean; inline;
     function IsArray: boolean; inline;
-    function AsString: string;
+    function AsString: string; inline;
+    function AsUnicodeString: UnicodeString;
+    function AsAnsiString: AnsiString;
     function AsExtended: Extended;
     function AsExtended: Extended;
     function IsClass: boolean; inline;
     function IsClass: boolean; inline;
     function AsClass: TClass;
     function AsClass: TClass;
@@ -834,15 +836,46 @@ begin
 end;
 end;
 
 
 function TValue.AsString: string;
 function TValue.AsString: string;
+begin
+  if System.GetTypeKind(String) = tkUString then
+    Result := String(AsUnicodeString)
+  else
+    Result := String(AsAnsiString);
+end;
+
+function TValue.AsUnicodeString: UnicodeString;
+begin
+  if (Kind in [tkSString, tkAString, tkUString, tkWString]) and not Assigned(FData.FValueData) then
+    Result := ''
+  else
+    case Kind of
+      tkSString:
+        Result := UnicodeString(PShortString(FData.FValueData.GetReferenceToRawData)^);
+      tkAString:
+        Result := UnicodeString(PAnsiString(FData.FValueData.GetReferenceToRawData)^);
+      tkWString:
+        Result := UnicodeString(PWideString(FData.FValueData.GetReferenceToRawData)^);
+      tkUString:
+        Result := UnicodeString(PUnicodeString(FData.FValueData.GetReferenceToRawData)^);
+    else
+      raise EInvalidCast.Create(SErrInvalidTypecast);
+    end;
+end;
+
+function TValue.AsAnsiString: AnsiString;
 begin
 begin
   if (Kind in [tkSString, tkAString, tkUString, tkWString]) and not Assigned(FData.FValueData) then
   if (Kind in [tkSString, tkAString, tkUString, tkWString]) and not Assigned(FData.FValueData) then
     Result := ''
     Result := ''
   else
   else
     case Kind of
     case Kind of
       tkSString:
       tkSString:
-        Result := PShortString(FData.FValueData.GetReferenceToRawData)^;
+        Result := AnsiString(PShortString(FData.FValueData.GetReferenceToRawData)^);
       tkAString:
       tkAString:
-        Result := PAnsiString(FData.FValueData.GetReferenceToRawData)^;
+        Result := AnsiString(PAnsiString(FData.FValueData.GetReferenceToRawData)^);
+      tkWString:
+        Result := AnsiString(PWideString(FData.FValueData.GetReferenceToRawData)^);
+      tkUString:
+        Result := AnsiString(PUnicodeString(FData.FValueData.GetReferenceToRawData)^);
     else
     else
       raise EInvalidCast.Create(SErrInvalidTypecast);
       raise EInvalidCast.Create(SErrInvalidTypecast);
     end;
     end;