Thema: Delphi Name aus Liste löschen

Einzelnen Beitrag anzeigen

der olli

Registriert seit: 18. Mai 2004
14 Beiträge
 
#1

Name aus Liste löschen

  Alt 14. Nov 2005, 18:36
Hi!

Wir realisieren im Informatikunterricht z.Z. eine Liste mit Namen, die eingegeben und gelöscht werden können (alles mit Hilfe von Zeigern), folgendermaßen aufgebaut: Zwei Listboxes (eine für die Platzierung, da es sich bei der Liste um Skispringer handelt und für den Namen und eine für die zum Namen zugehörige Wertung) und zwei Buttons, nächster Springer und Springer löschen. Bei Klick auf nächster Springer erscheinen zwei InputBoxes, zuerst eine für den Namen und danach eine für die zugehörige Wertung. Nach diesen Einträgen werden der Name und die Wertung gespeichert und sortiert nach Wertung in die jeweiligen Listboxes eingetragen. Die Procedure hierzu ist folgende (zu oberst die Deklaration der globalen Variablen):
Delphi-Quellcode:
type
  TZeiger = ^TSpringer;

  TSpringer = record
    name : String;
    wertung : Real;
    vorher,
    nachher : TZeiger
  end;

var
  Skispringen : TSkispringen;
  oben : TZeiger;
  platz : Integer;
Delphi-Quellcode:
procedure TSkispringen.bt_naechster_springerClick(Sender: TObject);
var aktuell, hilf, lauf : TZeiger;
begin
 new(aktuell);
 aktuell^.name := InputBox('Eingabe','Name','');
 aktuell^.wertung := StrToFloat(InputBox('Eingabe','Wertung',''));
 aktuell^.vorher := nil;
 aktuell^.nachher := nil;
 IF oben = nil THEN
  oben := aktuell
 ELSE
 begin
  IF aktuell^.wertung > oben^.wertung THEN
  begin
   oben^.vorher := aktuell;
   aktuell^.nachher := oben;
   oben := aktuell
  end
  ELSE
  begin
   lauf := oben;
   WHILE (lauf^.wertung > aktuell^.wertung) AND (lauf^.nachher <> nil) DO
    lauf := lauf^.nachher;
   IF (aktuell^.wertung > lauf^.wertung) THEN
   begin
    aktuell^.vorher := lauf^.vorher;
    aktuell^.nachher := lauf;
    hilf := lauf^.vorher;
    hilf^.nachher := aktuell;
    lauf^.vorher := aktuell
   end
   ELSE
   begin
    lauf^.nachher := aktuell;
    aktuell^.vorher := lauf
   end
  end
 end;
 ausgabe
end;
Und hier die Procedure zum ausgeben:
Delphi-Quellcode:
procedure TSkispringen.ausgabe;
var hilf : TZeiger;
begin
 li_skispringer.Clear;
 li_wertung.Clear;
 hilf := oben;
 platz := 0;
 WHILE (hilf <> nil) DO
 begin
  inc(platz);
  li_skispringer.Items.Add(IntToStr(platz) + '. ' + hilf^.name);
  li_wertung.Items.Add(FloatToStr(hilf^.wertung));
  hilf := hilf^.nachher;
 end
end;
Soweit, so gut. Klappt auch alles ohne Probleme. Nun habe ich mich eben hingesetzt und den Algorithmus programmiert, um einen Springer anhand seines Namens zu löschen:
Delphi-Quellcode:
procedure TSkispringen.bt_springer_loeschenClick(Sender: TObject);
var lauf : TZeiger;
    such : String;
begin
 such := InputBox('Eingabe','Name','');
 lauf := oben;
 WHILE NOT (lauf^.nachher = nil) AND (such = lauf^.name) DO
  lauf := lauf^.nachher;
 IF (lauf^.name = such) AND (lauf^.nachher = nil) THEN
  lauf^.vorher^.nachher := nil
 ELSE IF such = lauf^.name THEN
 begin
  lauf^.vorher^.nachher := lauf^.nachher;
  lauf^.nachher^.vorher := lauf^.vorher
 end
 ELSE IF such = oben^.name THEN
  oben^.nachher^.vorher := nil;
 // ELSE exit;
 ausgabe
end;
Hier hört das Programm leider auf zu funktionieren. Ich kann zwar den zu löschenden Namen eingeben, aber leider wird dieser nicht aus der Listbox gelöscht und ich komme einfach nicht drauf, wieso nicht. Ich hoffe, ich hab das verständlich erklärt und es kann mir jemand helfen.

Gruß,
Olli

P.S.: Ich weiß, dass sowas auch einfacher zu realisieren ist, aber wir müssen halt mit Zeigern arbeiten ...
  Mit Zitat antworten Zitat