30.03.2014, 08:11
|
|
Sir Richard Abramson
|
|
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
|
|
Не вариант?
Код:
type
IMyIntf = interface
['{D5901C23-79CD-45A7-904B-5966ACE5ACCF}']
end;
TMyIntfClass = class(TInterfacedObject, IMyIntf)
private
public
destructor Destroy; override;
end;
procedure TForm1.btn1Click(Sender: TObject);
var
foo: array of IMyIntf;
i: Integer;
begin
SetLength(foo, 4);
for i := 0 to 3 do
foo[i] := TMyIntfClass.Create;
end;
{ TMyIntfClass }
destructor TMyIntfClass.Destroy;
begin
ShowMessage('destructed');
inherited;
end;
"К массивам интерфейсов у меня претензий нет" expected;
Код:
procedure _FinalizeArray(p: Pointer; typeInfo: Pointer; elemCount: Cardinal);
{$IFDEF PUREPASCAL}
var
FT: PFieldTable;
begin
if elemCount = 0 then Exit;
case PTypeInfo(typeInfo).Kind of
tkLString: _LStrArrayClr(P^, elemCount);
tkWString: _WStrArrayClr(P^, elemCount);
tkVariant:
while elemCount > 0 do
begin
_VarClr(PVarData(P)^);
Inc(Integer(P), sizeof(Variant));
Dec(elemCount);
end;
tkArray:
begin
FT := PFieldTable(Integer(typeInfo) + Byte(PTypeInfo(typeInfo).Name[0]));
while elemCount > 0 do
begin
_FinalizeArray(P, FT.Fields[0].TypeInfo^, FT.Count);
Inc(Integer(P), FT.Size);
Dec(elemCount);
end;
end;
tkRecord:
begin
FT := PFieldTable(Integer(typeInfo) + Byte(PTypeInfo(typeInfo).Name[0]));
while elemCount > 0 do
begin
_FinalizeRecord(P, typeInfo);
Inc(Integer(P), FT.Size);
Dec(elemCount);
end;
end;
tkInterface:
while elemCount > 0 do
begin
_IntfClear(IInterface(P^));
Inc(Integer(P), 4);
Dec(elemCount);
end;
tkDynArray:
while elemCount > 0 do
begin
_DynArrayClr(P);
Inc(Integer(P), 4);
Dec(elemCount);
end;
else
Error(reInvalidPtr);
end;
end;
Можно финалайзаррэй на свой подменить.
|