2011-07-25 53 views
5

Tôi có Hộp danh sách hoặc Chế độ xem danh sách với các mục. Và tôi có một danh sách chuỗi có cùng các mục (chuỗi) dưới dạng Khung danh sách/Chế độ xem danh sách. Tôi muốn xóa tất cả các mục đã chọn trong Chế độ xem danh sách hộp/danh sách từ danh sách chuỗi.Xóa chuỗi khỏi TStringList

Cách thực hiện?

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 

Trả lời

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

+1 cho 'Đếm - 1' :) –

15

Bí quyết là để chạy vòng theo thứ tự ngược:

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

Bằng cách này, các hành động xóa một mục chỉ thay đổi các chỉ số của các yếu tố sau trong danh sách, và những người các yếu tố đã được xử lý.

+5

Đang chậm ngày hôm nay? –

+0

ai là người đầu tiên? :) – maxfax

+0

@maxfax Điều gì quan trọng ai là người đầu tiên? –

4

Làm cách nào để thực hiện theo cách khác (thay vì xóa)?

StringList1.Clear; 
for i:=0 to ListBox.Count-1 do 
    if not ListBox.Selected[i] then StringList1.Add(ListBox.Items(i)); 
+0

Vâng, điều này có ý nghĩa hơn với tôi, nhưng sau đó, bản thân câu hỏi dường như bị nhầm lẫn về cơ bản. –

+0

@warren làm cách nào để bạn thường lặp qua danh sách và xóa một số chứ không phải tất cả các mục? –

9

Giải pháp do Andreas và David cung cấp giả định rằng các chuỗi chính xác theo thứ tự trong cả ListBox và StringList. Đây là giả định tốt vì bạn không chỉ ra cách khác, nhưng trong trường hợp không đúng, bạn có thể sử dụng phương thức IndexOf của StringList để tìm chỉ mục của chuỗi (nếu StringList được sắp xếp, hãy sử dụng Find thay thế). Một cái gì đó như

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; 
+0

Tôi nghĩ rằng bạn có thể khá chắc chắn rằng maxfax đang duy trì hai danh sách đồng bộ và do đó không cần phải giả định bất cứ điều gì –