Bladeren bron

* Fixed bug #7159 and implemented clear/copy/redim for interface/widestring/variant arrays

git-svn-id: trunk@5930 -
michael 18 jaren geleden
bovenliggende
commit
63af3b33a1
1 gewijzigde bestanden met toevoegingen van 56 en 16 verwijderingen
  1. 56 16
      rtl/objpas/varutils.inc

+ 56 - 16
rtl/objpas/varutils.inc

@@ -278,7 +278,7 @@ begin
 end;
 end;
 
 
 type
 type
-  TVariantArrayType = (vatNormal, vatInterface, vatWideString);
+  TVariantArrayType = (vatNormal, vatInterface, vatWideString, vatVariant);
 
 
 Function VariantArrayType(psa: PVarArray): TVariantArrayType;
 Function VariantArrayType(psa: PVarArray): TVariantArrayType;
 
 
@@ -288,7 +288,9 @@ begin
     Result:=vatInterface
     Result:=vatInterface
   else if (psa^.Flags AND ARR_OLESTR) <> 0 then
   else if (psa^.Flags AND ARR_OLESTR) <> 0 then
     Result:=vatWideString
     Result:=vatWideString
-  else
+  else if (psa^.Flags and ARR_VARIANT) <> 0 then
+    Result := vatVariant
+  else    
     Result:=vatNormal;
     Result:=vatNormal;
 end;
 end;
 
 
@@ -296,16 +298,32 @@ Function SafeArrayClearDataSpace(psa: PVarArray; WipeBytes: Boolean {= True}): H
 
 
 var
 var
   vat: TVariantArrayType;
   vat: TVariantArrayType;
-
+  P : Pointer;
+  J,Count : Integer;
 begin
 begin
   try
   try
+    count:=SafeArrayElementTotal(psa);
     vat:=VariantArrayType(psa);
     vat:=VariantArrayType(psa);
     case vat of
     case vat of
-      vatNormal     : FillChar(psa^.Data^,
-                         SafeArrayElementTotal(psa)*psa^.ElementSize,
-                         0);
-      vatInterface  : NoInterfaces;
-      vatWideString : NoWidestrings;
+      vatNormal : FillChar(psa^.Data^,Count*psa^.ElementSize,0);
+      vatInterface : 
+         for j := 0 to Count - 1 do
+           begin
+           P := SafeArrayCalculateElementAddress(psa,j);
+           IUnknown(PUnknown(P)^):=Nil
+           end;
+      vatWideString :
+         for j := 0 to Count - 1 do
+           begin
+           P := SafeArrayCalculateElementAddress(psa,j);
+           WideString(PPointer(P)^):='';
+           end;
+      vatVariant :       
+         for j := 0 to Count - 1 do
+           begin
+           P := SafeArrayCalculateElementAddress(psa,j);
+           VariantClear(PVarData(P)^);
+           end;
     end;
     end;
     Result:=VAR_OK;
     Result:=VAR_OK;
   except
   except
@@ -317,15 +335,35 @@ end;
 Function SafeArrayCopyDataSpace(psa, psaOut: PVarArray): HRESULT;
 Function SafeArrayCopyDataSpace(psa, psaOut: PVarArray): HRESULT;
 var
 var
   vat: TVariantArrayType;
   vat: TVariantArrayType;
+  P1,P2 : Pointer;
+  J,Count : Integer;
 begin
 begin
   try
   try
+    Count:=SafeArrayElementTotal(psa);
     vat:=VariantArrayType(psa);
     vat:=VariantArrayType(psa);
     case vat of
     case vat of
-      vatNormal: Move(psa^.Data^,
-                      psaOut^.Data^,
-                      SafeArrayElementTotal(psa)*psa^.ElementSize);
-      vatInterface : NoInterfaces; // Copy element per element...
-      vatWideString: NoWideStrings; // here also...
+      vatNormal: Move(psa^.Data^,psaOut^.Data^,Count*psa^.ElementSize);
+      vatInterface : 
+         for j := 0 to Count - 1 do
+           begin
+           P1 := SafeArrayCalculateElementAddress(psa,j);
+           P2 := SafeArrayCalculateElementAddress(psaout,j);
+           IUnknown(PUnknown(P2)^):=IUnknown(PUnknown(P1)^);
+           end;
+      vatWideString :
+         for j := 0 to Count - 1 do
+           begin
+           P1 := SafeArrayCalculateElementAddress(psa,j);
+           P2 := SafeArrayCalculateElementAddress(psaOut,j);
+           WideString(PPointer(P2)^):=WideString(PPointer(P1)^);
+           end;
+      vatVariant :       
+         for j := 0 to Count - 1 do
+           begin
+           P1 := SafeArrayCalculateElementAddress(psa,j);
+           P2 := SafeArrayCalculateElementAddress(psaOut,j);
+           VariantCopy(PVarData(P2)^,PVarData(P2)^);
+           end;
     end;
     end;
     Result:=VAR_OK;
     Result:=VAR_OK;
   except
   except
@@ -485,9 +523,11 @@ begin
           begin
           begin
           P:=SafeArrayCalculateElementAddress(psa,j);
           P:=SafeArrayCalculateElementAddress(psa,j);
           if vat = vatInterface then
           if vat = vatInterface then
-            NoInterfaces // Set to nil
-          else
-            NoWideStrings; // Set to empty...
+            IUnknown(PPointer(P)^):=Nil
+          else if vat=vatWideString then
+            WideString(PPointer(P)^):=''
+          else if vat=vatVariant then
+            VariantClear(PVarData(P)^);
           end;
           end;
         end;
         end;
       ReAllocMem(psa^.Data,Count+D);
       ReAllocMem(psa^.Data,Count+D);