Usuwanie z TstringList

Usuwanie z TstringList
LK
  • Rejestracja:prawie 22 lata
  • Ostatnio:ponad 19 lat
  • Postów:185
0
    Jak moge z TstringList usunąć linijki o numerach itemów zaznaczonych w komponencie ListBox?
    Próbowałem tak:
Kopiuj
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

Kopiuj
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:
Kopiuj
   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.

7
Deti
  • Rejestracja:ponad 22 lata
  • Ostatnio:ponad 9 lat
0

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

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


Pawel200x.5
  • Rejestracja:ponad 22 lata
  • Ostatnio:prawie 14 lat
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:

Kopiuj
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

DR
  • Rejestracja:ponad 22 lata
  • Ostatnio:ponad 6 lat
  • Postów:683
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;

:)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.