Zitat von
RavenIV:
Zitat von
alleinherrscher:
Die sind eben immer mit aComputer.NextComputer.NextComputer.... usw. verknüpft.
Wenn ich jetzt einen Pointer lösche, setzte ich jetzt den Vorgänger des zu löschenden Pointers auf den Nachfolger des zu löschenden Pointers.
Danach versuche ich mit freeandnil(zulöschenderPointer) noch ein bisschen aufzuräumen,
aber bekomme immer Speicherverletzungen!!!
ist doch klar.
Du hast das zu löschende Element schon aus der Liste rausgenommen.
Also kommst Du nicht mehr an dieses Element dran. Wie willst Du es löschen?
Lösung:
Du gehst die Liste solange durch, bis du das Element vor dem zu löschenden Element gefunden hast.
Jetzt merkst Du Dir den Nachfolger des zu löschenden Elements in einer temporären Variablen.
Nun kannst du mit Free (Element.NextComputer) oder Delete (Element.NextComputer) das zu löschende Element löschen und dann die Liste neu verknüpfen (mit Hilde der temp.Variablen).
Ob Du Free oder Delete oder was anderes benötigst, hängt davon ab, wie Du die Elemente erzeugst.
Ne, ich hab das Element sozusagen noch in der Hand, pass auf:
folgende Procedure:
Delphi-Quellcode:
procedure TForm1.DeleteComputerFromList(Computer:aComputer);
var laufComputer:acomputer;
begin
laufComputer:=FirstComputer; //die Wurzel, FirstComputer selbst enthält keine Informationen
while (LaufComputer.nextcomputer<>Computer) and (LaufComputer.NextComputer<>NIL) do
begin
laufcomputer:=laufcomputer.NextComputer;
end;
LaufComputer.NextComputer:=Computer.NextComputer;
freeandnil(Computer)
end;
Ich hab zwar den Pointer schon aus der Liste rausgenommen, aber die Variable Computer zeigt ja noch auf das Element, oder?