Usuwanie z TstringList

0
    Jak moge z TstringList usunąć linijki o numerach itemów zaznaczonych w komponencie ListBox?
    Próbowałem tak:
ListBox1.Deleteselected;
Files.Delete(ListBox1.ItemIndex); //Files to jest TstringList

i wszystko działało ale potem nadzeszła potrzeba jeszcze wywołania procedurey pod tym i przestało działać.

Miałęm więc tak

ListBox1.Deleteselected;
Files.Delete(ListBox1.ItemIndex); //Files to jest TstringList
Numeruj; //Nazwa procedury

Procedure Numeruj czyści komponnet llistbox a nastepnie dodaje do niego itemy z TstringList Files numerując je przy tym.

     No i tak nie działa. Bo jeśli mam zaznaczone dwa itemy (pod sobą) to usówa tytlko ten wyżej, jeśli zaznaczone są dwa itemy miedzy którymi jest przerwa jednego itemu to kasuje ten item miedzy tamtyi dwoma. Jeśli jest zaznaczone wiecej to już sam nie wiem jak to działa. 
    Gdy wstawiłem to do pętli też nie działa:
   for i := 0 to ListBox1.Items.Count - 1 do
    begin
      if ListBox1.Selected[i] then
      begin
        Files.Delete(i);
        Numeruj; 
      end;
    end;
    Wywoływana procedura numeruj nie wiem czy powinna byc w tym miejscu, jednak gdziekolwiek by nie była to i tak nie działa wywalając AccessViolation List index ouf of bounds i jakas tam liczba'. W zasadzie to sie nie dziwe czemu to nie działa, bo przecież po usunięciu pierwszego zaznaczonego itemu numery indexów w Files ulegają zmianie.
    No ale więc jak to powinienem zrobić? Mam nadzieję ze zrozumieliście o co mi chodzi, mimo że sporo namieszałęm.
0

Nie wiem - może spróbuj sproboj usuwać od tyłu - bezpieczniej

for i := ListBox1.Items.Count - 1 downto 0 do
...

0

Nie przeczytalem calego, ale też kiedyś sie na to nacialem:
Jak usuwasz item, to wszystkie kolejne przesuwaja się o 1 w dół, więc takie usuwanie jak w twoim kodzie nie działa. Moim zdaniem, najlepsze rozwiązenie, to najpierw oznaczenie jakoś itemów do usunięcia (np. nadanie im wartości '?', albo cos w tym stylu), i potem usuwanie ich w pętli:

while i<files.Count do
 begin
  if files[i]='?' then
   files.Delete(i) else inc(i);
 end;

Pisze z glowy, ale powinno dzialac ;)

//w sumie nie pomyslalem... sposob DeToXa też jest dobry, a ja tu mieszam :] (ale nie widzialem jeszcze jego postu)

0

wydaje mi się że problem jest w zawłaszczaniu obiektów.
Komponent listBox zawłaszczył Files , przy destrukcji listbox kasowany jest też
Files. Zrób kopie Files.
np: Listbox.items.assign(files);
lgie

0

nie czytalem wszystkiego ale ...

var i:integer;
begin

i:=listbox1.itemindex;
listbox1.deleteselected;
files.delete(i);
end;

albo po prostu:
files.delete(listbox1.itemindex);
listbox1.deleteselected;

:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1