我之前演示过如何从动态数组中删除项目:
- Delphi 问答:如何从数组中删除元素? http://www.cs.wisc.edu/~rkennedy/array-delete
在那篇文章中,我从以下代码开始:
type
TXArray = array of X;
procedure DeleteX(var A: TXArray; const Index: Cardinal);
var
ALength: Cardinal;
i: Cardinal;
begin
ALength := Length(A);
Assert(ALength > 0);
Assert(Index < ALength);
for i := Index + 1 to ALength - 1 do
A[i - 1] := A[i];
SetLength(A, ALength - 1);
end;
You 不会出错与该代码。使用任何值X
你要;在你的情况下,将其替换为string
。如果你想变得更喜欢并使用Move
,那么也有办法做到这一点。
procedure DeleteX(var A: TXArray; const Index: Cardinal);
var
ALength: Cardinal;
TailElements: Cardinal;
begin
ALength := Length(A);
Assert(ALength > 0);
Assert(Index < ALength);
Finalize(A[Index]);
TailElements := ALength - Index;
if TailElements > 0 then
Move(A[Index + 1], A[Index], SizeOf(X) * TailElements);
Initialize(A[ALength - 1]);
SetLength(A, ALength - 1);
end;
Since X
is string
, the Finalize
调用相当于将空字符串分配给该数组元素。我用Finalize
不过,在这段代码中,因为它适用于all数组元素类型,甚至包括记录、接口、字符串和其他数组的类型。
对于插入,只需将其向相反方向移动即可:
procedure InsertX(var A: TXArray; const Index: Cardinal; const Value: X);
var
ALength: Cardinal;
TailElements: Cardinal;
begin
ALength := Length(A);
Assert(Index <= ALength);
SetLength(A, ALength + 1);
Finalize(A[ALength]);
TailElements := ALength - Index;
if TailElements > 0 then begin
Move(A[Index], A[Index + 1], SizeOf(X) * TailElements);
Initialize(A[Index]);
A[Index] := Value;
end;
Use Finalize
当你要做一些超出语言范围的事情时,例如使用非类型安全Move
覆盖编译器管理类型的变量的过程。使用Initialize
当您重新输入语言的定义部分时。 (该语言定义了当数组增长或收缩时会发生什么SetLength
,但它没有定义如何在不使用字符串赋值语句的情况下复制或删除字符串。)