代码如下
type
Ttemp=record
a:integer;
b:string;
c:integer;
end;
var
temps:array of Ttemp
begin
setlength(temps,10);
//然后赋值
.....
....
end;现在比如我想删除temps[5],该如何操作?
网上找到个DynArrayDelete过程,一用就报错,还请高手指点,指针实在不懂..procedure 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;
type
Ttemp=record
a:integer;
b:string;
c:integer;
end;
var
temps:array of Ttemp
begin
setlength(temps,10);
//然后赋值
.....
....
end;现在比如我想删除temps[5],该如何操作?
网上找到个DynArrayDelete过程,一用就报错,还请高手指点,指针实在不懂..procedure 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;
解决方案 »
- 如何根据ListView 写ini文件
- OCX控件的问题
- 没有人会做这个题目吗
- 如何在Delphi调用Mideva生成的动态链接库?
- 请问:怎样在窗体加载时创建9百9十9万9千9百9十9个(9999999)个CheckBox控件或者是TcheckBoxList并显示出来。
- 小弟我用Delphi 是常出现 77FA144C 的CPU 错,ntdll 有知道相关情况的吗?讨论一下?!!
- 字符串解密问题,已知加密公式,能解密并提供源程序者送50分
- 数据库的超难问题:动态加字段
- 急,现场给分,在Delphi2007竟然找不到mxarrays单元,有谁知道TIntArray在D2007应该怎么用吗?
- 用ASM 控件,如何把 PCM 格式音频数据流转成 GSM 格式
- RMB求一简单OpenGL代码,UP有分
- 誰說DELPHI沒有前途了?-----為DELPHI的將來而貢獻力量
DynArrayDelete(temps, sizeof(Ttemp), 5, 1);procedure DynArrayDelete(var A; elSize : Longint; index, Count: Integer);
A表示动态数组,elSize表示每个元素的大小,index表示要删除的索引,count表示删除的数量这个过程中用了Math中的Min函数记得uses Math: