type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } procedure DynArrayDelete(var A; elSize: Longint; index, Count: Integer); public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm} { TForm1 }
procedure TForm1.Button1Click(Sender: TObject); type Ttemp = record A: Integer; b: string; c: Integer; end; var temps: array of Ttemp; i: Integer; begin setlength(temps, 10); for i := 0 to 9 do begin temps[i].A := i; temps[i].b := IntToStr(i); temps[i].c := i * 2; end; DynArrayDelete(temps, SizeOf(temps), 5, 1); // 实际上却并没有删除temps[5] for i := 0 to High(temps) do begin ShowMessageFmt('%d,%s,%d', [temps[i].A, temps[i].b, temps[i].c]); end; // ShowMessage(IntToStr(Length(temps))); // ShowMessageFmt('%d,%s,%d',[temps[2].a,temps[2].b,temps[2].c]);
end;
procedure TForm1.DynArrayDelete(var A; elSize: Longint; index, Count: Integer); var len, MaxDelete: Integer; P: PLongint; // 4 个字节的长整形指针 begin P := PLongint(A); // 取的 A 的地址 if P = nil then Exit; len := PLongint(PChar(P) - 4)^; // 变量的长度 ,偏移量 -4 if index >= len then // 要删除的位置超出范围,退出 Exit; MaxDelete := len - index; // 最多删除的数量 Count := Min(Count, MaxDelete); // 取得一个较小值 if Count = 0 then // 不要求删除 Exit; Dec(len, Count); // 移动到要删除的位置 MoveMemory(PChar(P) + index * elSize, PChar(P) + (index + Count) * elSize, (len - index) * elSize); // 移动内存 Dec(P); // 移出 “数组长度”位置 Dec(P); // 移出“引用计数” 位置 // 重新再分配调整内存,len 新的长度. Sizeof(Longint) * 2 = 2*Dec(P) ReallocMem(P, len * elSize + SizeOf(Longint) * 2); Inc(P); // 指向数组长度 P^ := len; // new length Inc(P); // 指向数组元素,开始的位置 PLongint(A) := P; end;
procedure DynArraySetZero(var A;Count: Integer);{inline;} var P: PINT_PTR; i: integer; begin P := PINT_PTR(A); // i := PINT_PTR(NativeInt(p)-sizeof(NativeInt))^; Dec(P); //长度 P^ := Count; // Dec(P);//引用计数 // P^ := 0; end;
procedure TForm1.Button1Click(Sender: TObject); type Ttemp = record A: Integer; b: string; c: Integer; end; var temps: array of Ttemp; i: Integer; P: PINT_PTR; begin setlength(temps, 10); for i := 0 to 9 do begin temps[i].A := i; temps[i].b := IntToStr(i); temps[i].c := i * 2; end; CopyMemory(@temps[5],@temps[6],4*sizeof(Ttemp)); DynArraySetZero(temps,10-1); for i := 0 to High(temps) do begin ShowMessageFmt('%d,%s,%d', [temps[i].A, temps[i].b, temps[i].c]); end; end; 好吧这么帖子懒得看了。
----------------------------------------------
[alias] co = clone --recurse-submodules up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
function DelArrayItem(var Values:TArray<String>;Index:Integer):Boolean; var iIndex:Integer; begin Result:=False; if (Index<Low(Values)) then Exit; for iIndex := Index to High(Values)-1 do Values[iIndex]:=Values[iIndex+1]; SetLength(Values, Length(Values)-1); Result:=True; end;
测试代码: var aa:TArray<String>; i: Integer; str:String; begin Setlength(aa,3); aa[0]:='1'; aa[1]:='22'; aa[2]:='333'; DelArrayItem(aa,1); str:=''; for i := Low(aa) to High(aa) do str:=str+aa[i]; ShowMessage(str);
----------------------------------------------
-