您好我正在为字符串列表写一些值。并希望从字符串列表中删除一个值。
目前我写这样的字符串列表。
FGamePlay.Locations.strings[0] := ('NumberOfLocations='+inttostr(NOL+1)); //add one to total
FGameplay.Locations.Add(inttostr(Position.x)+inttostr(Position.Y)+'=pos'); //add the location to list
这将返回一个像这样的列表
INDEX VALUE
[0] NumberOfLocations=4
[1] 23=pos
[2] 34=pos
[3] 24=pos
[4] 52=pos
现在我尝试删除它
FGamePlay.Locations.Delete(FGamePlay.Locations.IndexOf(inttostr(ePosition.x)+inttostr(ePosition.Y)));
是ePosition.x + ePosition.Y将等于23,34,24或52.因此它应该删除该行,但是当我添加此删除行时,我得到索引超出范围-1。我确实在此行之前停止了代码并查看了Locations()并且其中包含了所有这些数字。还看了epostion和X,Y值是34,因此也是正确的。任何的想法? 谢谢 格伦
答案 0 :(得分:6)
当您使用IndexOf
函数时,您必须传递确切的字符串才能查找,在这种情况下,因为您以这种方式添加字符串
FGameplay.Locations.Add(inttostr(Position.x)+inttostr(Position.Y)+'=pos');
您必须将=pos
添加到要搜索的字符串中,例如
LIndex:=FGamePlay.Locations.IndexOf(inttostr(ePosition.x)+inttostr(ePosition.Y)+'=pos');
If LIndex>=0 then
FGamePlay.Locations.Delete(LIndex);
答案 1 :(得分:1)
正如RRUZ所说,您要删除的字符串缺少“= pos”后缀。
为了更有效地调试它,你应该更多地分解代码。如果你有这个等效的代码:
str := inttostr(ePosition.x)+inttostr(ePosition.Y);
pos := FGamePlay.Locations.IndexOf(str);
FGamePlay.Locations.Delete(pos);
您会在pos :=
行上收到错误,这样可以更轻松地查看错误来源。
您还可以考虑制作以下功能:
function MakePosString(Position : Point);
begin
Result := inttostr(ePosition.x)+inttostr(ePosition.Y)+'=pos';
end;
然后你可以调用该函数而不是重新实现该代码,并保证你的字符串是一致的。
答案 2 :(得分:1)
虽然我同意其他人所说的关于考虑使用更好的数据结构来完成手头工作的所有内容,但我认为,为了将来有类似问题的人,值得一提的是其他人尚未确定的内容。
你的表达:
IntToStr(ePosition.x) + IntToStr(ePosition.y)
在被视为名称/值列表时,标识字符串列表中条目的名称。也就是说,一个TStringList,其中每个项目的形式为" name = value"。虽然修复代码的一种方法是附加字符串的其余部分(' = pos'),但这当然仅适用于"值"每个命名值的一部分总是" pos"。
如果有可能" pos"对于给定的命名值,值可能不同或未知,那么您仍然可以通过仅使用名称部分查找项目的索引来找到它:
itemName := IntToStr(ePosition.x) + IntToStr(ePosition.y);
itemIndex := fGamePlay.Locations.IndexOfName(itemName);
if itemIndex > -1 then
fGamePlay.Locations.Delete(IndexOfName(itemName));