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?

プロシージャをグローバルオブジェクトにバインドするのは賢明ではありませんでしたvar Dyna: array of TSomethingが、関数の引数にaが含まれているとコンパイラがうめき声を上げたため、dynarray1にアドレス指定する代わりにDynaが使用されました。したがって、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 に答える