7

リストボックスまたはアイテムを含むリストビューがあります。そして、リストボックス/リストビューと同じアイテム(文字列)を持つ文字列リストがあります。リストボックス/リストビューで選択したすべてのアイテムを文字列リストから削除したい。

実行する方法?

for i:=0 to ListBox.Count-1 do
  if ListBox.Selected[i] then
    StringList1.Delete(i); // I cannot know exactly an index, other strings move up
4

4 に答える 4

22
for i := ListBox.Count - 1 downto 0 do
  if ListBox.Selected[i] then
    StringList1.Delete(i);
于 2011-07-25T20:28:09.773 に答える
18

秘訣は、ループを逆の順序で実行することです。

for i := ListBox.Count-1 downto 0 do
  if ListBox.Selected[i] then 
    StringList1.Delete(i);

このように、アイテムを削除するという行為は、リストの後半にある要素のインデックスのみを変更し、それらの要素はすでに処理されています。

于 2011-07-25T20:28:18.007 に答える
10

AndreasとDavidが提供するソリューションは、ListBoxとStringListの両方で文字列がまったく同じ順序であることを前提としています。特に明記しないので、これは良い仮定ですが、そうでない場合は、StringListのIndexOfメソッドを使用して文字列のインデックスを見つけることができます(StringListがソートされている場合は、Find代わりに使用します)。何かのようなもの

var x, Idx: Integer;
for x := ListBox.Count - 1 downto 0 do begin
   if ListBox.Selected[x] then begin
      idx := StringList.IndexOf(ListBox.Items[x]);
      if(idx <> -1)then StringList.Delete(idx);
   end;
end;
于 2011-07-25T20:40:09.690 に答える
5

逆に(削除する代わりに追加する)やってみませんか?

StringList1.Clear;
for i:=0 to ListBox.Count-1 do
  if not ListBox.Selected[i] then StringList1.Add(ListBox.Items(i));
于 2011-07-25T20:33:42.257 に答える