type
TConstArray=
array of const;
...
//you need this function
function CopyVarRec(
const Item: TVarRec): TVarRec;
var
W: WideString;
begin
// Copy entire TVarRec first
Result := Item;
// Now handle special cases
case Item.VType
of
vtExtended:
begin
New(Result.VExtended);
Result.VExtended^ := Item.VExtended^;
end;
vtString:
begin
New(Result.VString);
Result.VString^ := Item.VString^;
end;
vtPChar:
Result.VPChar := StrNew(Item.VPChar);
// there is no StrNew for PWideChar
vtPWideChar:
begin
W := Item.VPWideChar;
GetMem(Result.VPWideChar,
(Length(W) + 1) * SizeOf(WideChar));
Move(PWideChar(W)^, Result.VPWideChar^,
(Length(W) + 1) * SizeOf(WideChar));
end;
// a little trickier: casting to string will ensure
// reference counting is done properly
vtAnsiString:
begin
// nil out first, so no attempt to decrement
// reference count
Result.VAnsiString :=
nil;
string(Result.VAnsiString) :=
string(Item.VAnsiString);
end;
vtCurrency:
begin
New(Result.VCurrency);
Result.VCurrency^ := Item.VCurrency^;
end;
vtVariant:
begin
New(Result.VVariant);
Result.VVariant^ := Item.VVariant^;
end;
// casting ensures proper reference counting
vtInterface:
begin
Result.VInterface :=
nil;
IInterface(Result.VInterface) := IInterface(Item.VInterface);
end;
// casting ensures a proper copy is created
vtWideString:
begin
Result.VWideString :=
nil;
WideString(Result.VWideString) := WideString(Item.VWideString);
end;
vtInt64:
begin
New(Result.VInt64);
Result.VInt64^ := Item.VInt64^;
end;
// VPointer and VObject don't have proper copy semantics so it
// is impossible to write generic code that copies the contents
end;
end;
//and you need this function
//CCA = CreateConstArray
function CCA(
const Elements:
array of const): TConstArray;
var
I: Integer;
begin
SetLength(Result, Length(Elements));
for I := Low(Elements)
to High(Elements)
do
Result[I] := CopyVarRec(Elements[I]);
end;
//yours constructor
constructor TMyObjectList2.Create(Items:
array of const);
//yours call to constructor
:= TMyObjectList2.Create([
CCA([TObject.Create]),
CCA([TObject.Create, TObject.Create]),
...
]);