Da ich zu der Überzeugung gekommen bin, dass das mit Worten schwieriger zu beschreiben ist als mit Code, ausnahmsweise (aus der hohlen Hand getippt, daher ohne Gewähr):
Delphi-Quellcode:
procedure TForm1.ButtonEntfernenClick(Sender: TObject); //Button entfernt markierte Einträge aus der Liste
var zaehler: integer;
PCurrent, //Zeiger auf das aktuelle Listenelement
PPrior, //Zeiger auf den Vorgänger von PCurrent
PNext: Zeiger; //Zeiger auf den Nachfolger von PCurrent
begin
PCurrent := Wurzel; //an der Wurzel anfangen
zaehler := 0;
PPrior := nil; //die wurzel hat keinen Vorgänger
while (PCurrent <> nil) and (zaehler < ListBoxAnzeige.Count) do
begin //Schleife, die Änderung in die Zeigerstruktur übernimmt
//zuerst Zeiger auf den Nachfolger sichern
PNext := PCurrent^.naechster;
//Element ist zum Löschen markiert
if ListBoxAnzeige.Selected[zaehler] then
begin
//Sonderfall: Wurzelelement soll gelöscht werden
if PCurrent = wurzel then
begin
//Speicher freigeben
Dispose(PCurrent);
//wurzel entsprechend neu setzen
wurzel := PNext;
//und weiter positionieren
PCurrent := wurzel;
end
else
begin
//wenn meine Logik stimmt, ist die Abfrage unnötig, aber man weiß ja nie
if PPrior <> nil then
begin
//Nachfolger des Vorgängers auf eigenen Nachfolger umbiegen
PPrior^.naechster := PNext;
//und Speicher freigeben
Dispose(PCurrent);
//weiter positionieren
PCurrent := PNext;
end;
end;
end
else
//gab nix zu löschen
begin
//aktuelles Element als Vorgänger merken
PPrior := PCurrent;
//nächstes Element zum aktuellen machen
PCurrent := PNext;
end;
//Zähler inkrementieren
inc(zaehler);
end;
ListBoxAnzeige.DeleteSelected;
end;
Es kann sehr gut sein, dass da noch Fehler enthalten sind, aber das wirst Du ja dann merken.