Lista jednokierunkowa - usuwanie rekordu

0

Co jest źle w tym kodzie? Prawidłowo odczytuje pierwszy rekord ale przy drugim wywala access violation
Jest to usuwanie zaznaczonego w StringGrid rekordu z listy jednokierunkowej .

procedure TForm1.Button5Click(Sender: TObject);
var
  i: Integer;
  AIndex:integer;
begin

Aindex:=stringgrid1.Row;
if AIndex = 0 then
  begin
  newnamenode:= FFirst;
    FFirst := FFirst^.Next;

    if FFirst = nil then
      FLast := nil;
  end
  else
  begin
   newnamenode := FFirst;
   showmessage(newnamenode^.Imie);
  APrev := nil;

  while AIndex > 0 do
  begin
    APrev := newnamenode;

    newnamenode := newnamenode^.Next;
    Dec(AIndex);
  end;

   if newnamenode^.Next = nil then
    begin
      FLast := APrev;
      APrev^.Next := nil;
    end
    else
    begin

      APrev^.Next := newnamenode^.Next;
  end;
  end;
 //skip over element to be deleted (currentpointer)

 dispose(newnamenode);
  Dec(FCount);

  for i := StringGrid1.Row to stringGrid1.RowCount - 2 do
    StringGrid1.Rows[i].Assign(stringGrid1.Rows[i + 1]);
  StringGrid1.RowCount := StringGrid1.RowCount - 1;
end;
1

Co jest źle w tym kodzie?

Przede wszystkim to, że implementacja operacji na liście (posługiwanie się wskaźnikami węzłów) znajduje się w zdarzeniach klasy formularza, a nie w osobnej klasie maskującej zabawy z pointerami; Idź no poczytaj ten artykuł - Implementacja listy jednokierunkowej - i napisz sobie taką klasę, tyle że dla swoich danych;

Prawidłowo odczytuje pierwszy rekord ale przy drugim wywala access violation

Fajnie... a jaka jest treść błędu i w której linijce występuje?

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