-1

こんにちは私は文字列リストにいくつかの値を書いています。そして、文字列リストから値を削除したいと思います。

現在、このように文字列リストに書き込んでいます。

   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だったので、これも正しいです。何か案が?グレンありがとう

4

3 に答える 3

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);
于 2012-07-04T20:56:24.803 に答える
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;

次に、そのコードを再実装する代わりにその関数を呼び出すことができ、文字列の一貫性が保証されます。

于 2012-07-04T20:56:40.213 に答える
1

手元の仕事にもっと良いデータ構造を使用することを検討することについて他の人が言ったことすべてに同意しますが、将来同様の問題を抱えている人のために、他の誰もまだ特定していないことについて言及する価値があると思います。

あなたの表現:

IntToStr(ePosition.x) + IntToStr(ePosition.y)

名前/値リストと見なされる場合、文字列リスト内のエントリの名前を識別します。つまり、各アイテムの形式が「name=value」であるTStringListです。コードを修正する1つの方法は、文字列の残りの部分('= pos')を追加することですが、これはもちろん、すべての名前付き値の「value」部分が常に「pos」である場合にのみ機能します。

特定の名前付き値に対して「pos」値が異なるか不明である可能性がある場合でも、名前の部分だけを使用してアイテムのインデックスを検索することで、それを見つけることができます。

  itemName  := IntToStr(ePosition.x) + IntToStr(ePosition.y);
  itemIndex := fGamePlay.Locations.IndexOfName(itemName);
  if itemIndex > -1 then
    fGamePlay.Locations.Delete(IndexOfName(itemName));
于 2012-07-05T03:34:31.663 に答える