Usuwanie z listy dwukierunkowej elementu wybranego w ListView

0

Witam,
mam następujący problem. Chciałbym żeby przycisk usuwał z listy dwukierunkowej element wybrany w ListView. Mam następujący kod:

 Plista = ^lista;
  lista = record
    nr: integer;
    nazwa: String[30];
    cena: real;
    dzial: String[30];
    nastepny: Plista;
    poprzedni: Plista;
  end;

  listaVar = record
    head : Plista;
    tail : Plista;
    count : integer;
  end;

...

procedure TForm6.FormCreate(Sender: TObject);
begin
  L.head  := nil;
  L.tail  := nil;
  L.count := 0;
end;

procedure TForm6.btn_usunClick(Sender: TObject);
var
e: Plista;
begin
  if ListView.ItemIndex=-1 then
  begin
  raise Exception.Create('Nic nie zaznaczono');
  Exit;
  end;
  e:=L.tail;
  while e.nazwa<>ListView.Selected.Caption do e:=e^.nastepny;
    if e^.poprzedni<>nil then e^.poprzedni^.nastepny:=e^.nastepny
    else L.head := e^.nastepny;
    if e^.nastepny<>nil then e^.nastepny^.poprzedni := e^.poprzedni
    else L.tail := e^.poprzedni;
    dispose(e);

  dec(L.count);
  ListView.DeleteSelected;
end;
 

niestety, program się kompiluje, a po naciśnięciu wywala błąd "access violation". Myślę, że problem tkwi w tej linijce:

 
 while e.nazwa<>ListView.Selected.Caption do e:=e^.nastepny;

Jak to zrobić, żeby pętla przechodziła do elementu listy dwukierunkowej zaznaczonego w ListView ?

1

e := L.tail;
while e.nazwa <> ListView.Selected.Caption do e := e^.nastepny;

Nie widzisz sprzeczności?

0

o faktycznie....
tylko, że jak zmienię to na e := L.head; to dalej nie działa.

0

Więc z jakieś przyczyny nie ma tej nazwy na liście.

0

hmm czy to może być przez złą procedurę dodawania? jest zrobiona tak:

procedure TForm6.Btn_dodajClick(Sender: TObject);
var
item: TListItem;
e: Plista;
begin

//dodanie nowego elementu na koniec listy dwukierunkowej
new(e);
e^.nastepny:=nil;
e^.poprzedni:= L.tail;
e^.nazwa := E_nazwa.Text;
e^.nr := StrToInt(E_nr.Text);
e^.cena := StrToFloat(E_cena.Text);
e^.dzial := E_dzial.Text;
L.tail := e;
if e^.poprzedni<>nil then e^.poprzedni^.nastepny := e
else
L.head := e;

 // dodaj rekord do komponentu
 item := ListView.Items.Add;
 item.Caption := e.nazwa;
 item.SubItems.Add(IntToStr(e.nr));
 item.SubItems.Add(FloatToStr(e.cena));
 item.SubItems.Add(e.dzial);
 //czyszczenie okien TEdit
 E_nazwa.Clear;
 E_nr.Clear;
 E_cena.Clear;
 E_dzial.Clear;
end;
 
0

A ja mam takie pytanie @szamot: musisz mieć to koniecznie z wykorzystaniem zakodowanej listy po swojemu? Bo jeżeli nie, to spokojnie uprościł byś sobie zadanie korzystając z gotowej TList i na niej przechowywał obiekty. To je też dodajesz dodakowo do ListView przypisując je do własności Data. Bo skoro już robimy coś pod VCL to nie ma się co ograniczać i robić coś od 0.

0

Niestety, w poleceniu jest wykorzystanie listy jedno-, albo dwukierunkowej...

0

A co pokazuje debugier?

0

Dobra, sorry za bicie piany, ale okazało się, że problem nie siedzi w tej funkcji tylko w funkcji odczytu z pliku...
Temat można zamknąć, niech moje wypociny służą potomnym.

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