Browse Source

* a few more simple handlers get custom variant intercepts. Also part of #39815

(cherry picked from commit 83b455551151c7c808bc5c6bd9eafddb56e264ad)
marcoonthegit 3 years ago
parent
commit
4477ac3e3a
1 changed files with 25 additions and 1 deletions
  1. 25 1
      packages/rtl-objpas/src/inc/variants.pp

+ 25 - 1
packages/rtl-objpas/src/inc/variants.pp

@@ -696,12 +696,20 @@ end;
 
 
 function sysvartocurr (const v : Variant) : Currency;
+var Handler: TCustomVariantType;
+    dest: TVarData;
 begin
   if VarType(v) = varNull then
     if NullStrictConvert then
       VarCastError(varNull, varCurrency)
     else
       Result := 0
+  else if FindCustomVariantType(TVarData(v).vType, Handler) then
+    begin
+      VariantInit(dest);
+      Handler.CastTo(dest, TVarData(v), varCurrency);
+      Result := dest.vcurrency;
+    end
   else
     Result := VariantToCurrency(TVarData(V));
 end;
@@ -745,12 +753,20 @@ end;
 
 
 procedure sysvartowstr (var s : WideString; const v : Variant);
+var Handler: TCustomVariantType;
+    dest: TVarData;
 begin
   if VarType(v) = varNull then
     if NullStrictConvert then
       VarCastError(varNull, varOleStr)
     else
       s := NullAsStringValue
+   else if FindCustomVariantType(TVarData(v).vType, Handler) then
+    begin
+      VariantInit(dest);
+      Handler.CastTo(dest, TVarData(v), varOleStr);
+      s:= dest.volestr;
+    end
   else
     S := VariantToWideString(TVarData(V));
 end;
@@ -817,13 +833,21 @@ end;
 
 {$ifndef FPUNONE}
 function sysvartotdatetime (const v : Variant) : TDateTime;
+var Handler: TCustomVariantType;
+    dest: TVarData;
 begin
   if VarType(v) = varNull then
     if NullStrictConvert then
       VarCastError(varNull, varDate)
     else
       Result := 0
-  else
+  else if FindCustomVariantType(TVarData(v).vType, Handler) then
+     begin
+       VariantInit(dest);
+       Handler.CastTo(dest, TVarData(v), vardate);
+       Result := dest.vdate;
+     end
+   else
     Result:=VariantToDate(TVarData(v));
 end;
 {$endif}