type
TGroundItems = packed record
ItemsID:DWORD;
Name:string;
X,Y:Word;
time:Cardinal;
end;
var
FFieldItems:array of TGroundItems; //地面物品黑名单数组procedure DeleteFFieldItems; //删除动态数组元素
var
Count: Cardinal; //tarr数组长度
index: Integer; //要删除的数组索引,FfielditemsO数组
iii:Integer;
begin
EnterCriticalSection(MyCs); //进入临界区
try //刷新数据后,把 超时的物品删除掉
for iii := low(FFieldItems) to high(FFieldItems) do
begin
if (gettickcount - FFieldItems[iii].time > 180000 ) and (FFieldItems[iii].ItemsID >0) then
begin
// Form1.Memo15.Lines.Add('删除掉不存在的物品'+ffielditems[iii].name);
Count := Length(FFieldItems);
index := iii;
if (Count = 0) or (Index < 0) or (Index >= Count) then exit;
Move(FFieldItems[Index+1], FFieldItems[Index], (Count-Index)* SizeOf(FFieldItems[0]));
SetLength(FFieldItems, Count - 1);
end;
end;
finally
LeaveCriticalSection(MyCs); //离开临界区
end;
end;
在执行删除数组元素时,总会过一段时间就产生读写地址错误,请问删除操作,那段代码不对,请各位朋友指教一下
TGroundItems = packed record
ItemsID:DWORD;
Name:string;
X,Y:Word;
time:Cardinal;
end;
var
FFieldItems:array of TGroundItems; //地面物品黑名单数组procedure DeleteFFieldItems; //删除动态数组元素
var
Count: Cardinal; //tarr数组长度
index: Integer; //要删除的数组索引,FfielditemsO数组
iii:Integer;
begin
EnterCriticalSection(MyCs); //进入临界区
try //刷新数据后,把 超时的物品删除掉
for iii := low(FFieldItems) to high(FFieldItems) do
begin
if (gettickcount - FFieldItems[iii].time > 180000 ) and (FFieldItems[iii].ItemsID >0) then
begin
// Form1.Memo15.Lines.Add('删除掉不存在的物品'+ffielditems[iii].name);
Count := Length(FFieldItems);
index := iii;
if (Count = 0) or (Index < 0) or (Index >= Count) then exit;
Move(FFieldItems[Index+1], FFieldItems[Index], (Count-Index)* SizeOf(FFieldItems[0]));
SetLength(FFieldItems, Count - 1);
end;
end;
finally
LeaveCriticalSection(MyCs); //离开临界区
end;
end;
在执行删除数组元素时,总会过一段时间就产生读写地址错误,请问删除操作,那段代码不对,请各位朋友指教一下
解决方案 »
- Delphi如何做曲线图
- 目录的简单问题(50分送出)
- folder80 ,谢了
- 我想用sql 语句寸取图片怎么做呀(再线等待 立即揭贴)qq:80561109 email;[email protected]
- 如何将delphi程序最小化到系统托盘中?
- !!数制转换大总结!!
- 一个刚学delphi的女孩问一个简单的问题:
- 为什么用Delphi6保存的dfm文件,用文本编辑器打开,caption全是数字?
- 本人自己开发了一个打字软件,功能齐全,希望大家支持我下载一下
- 如何从1表ID连2表ID显示name(急急)
- 工程检测到错误类EAccessViolation
- 请说说Delphi的intraWeb
for 循环和SetLength 相抵触,使得for 循环读取不存在的成员另外根据这里的判断:
if (gettickcount - FFieldItems[iii].time > 180000 ) and (FFieldItems[iii].ItemsID >0)
这个循环可能要去掉不止一个成员所以用repeat until 循环:
iii:=0;
repeat
....
inc(iii);
until iii=count;