0
type TSomething = record
 name: string;
 value: integer;
end;    
type TOtherSomething = record
 data: extended;
 data2: extended;
 data3: array of TSomethingAlien;
end;
...
dynarray1: array of TSomething;
dynarray2: array of TOtherSomething;

此外,还有为每种类型删除元素的令人讨厌的过程:

procedure TForm1.DeleteSomething(N: integer);
begin
   if N > High(dynarray1) then Exit;
   if N < Low(dynarray1) then Exit;
   if N = High(dynarray1) then begin
     SetLength(dynarray1, Length(dynarray1) - 1);
     Exit;
   end;
   Finalize(dynarray1[N]) ;
   System.Move(dynarray1[N +1], dynarray1[N],(Length(dynarray1) - N  -1) * SizeOf(TSomething) + 1) ;
   setLength(dynarray1, Length(dynarray1) - 1) ;
end;                          

procedure TForm1.DeleteOtherSomething(N: integer);
... got the idea?

将过程绑定到全局对象并不聪明,但编译器抱怨,当 avar Dyna: array of TSomething在函数参数中时,所以使用 Dyna 而不是寻址到 dynarray1。所以我什至不能用 var 参数重载多种数据类型的函数! SetLength(Dyna, length(dynarray1) 类型不匹配! SetLength(Dyna, length(Dyna) 类型不匹配!

想要什么:

  1. 重载 DeleteElement(var Arr: TMultipleTypes, N: element):见上,为什么达不到这个目标。

  2. 适用于数组中任何类型数据的单一DeleteElement实现?类似 <template> 类型的支持?

4

1 回答 1

1

好吧,普通的 tlist 类完成了大部分工作,但基于指针数组

通用的“tfplist”(需要 2.4.0+,参见 fgl 单元)可能更接近您想要的。但仿制药仍处于测试阶段。

于 2011-01-02T15:53:50.990 回答