bei dem Code selber seh icht grad nicht so durch, als daß ich jetzt och Fehler finde (ist aber auch schon spät)
für alle deine RadioButons (1-6) kannst du auch eine einzige OnClick-Prozedur nutzen (einfach allein zuweisen)
das lauf2=ende2 würde ich zuerst abfragen, bevor ich auf lauf2 für dür den/die Vergleich(e) zugreife
dann nutzt du in der Sortieren-Funktion durcheinander diese Booleans und die CheckBoxen.
wenn du schon diese Booleans hast, warum nutzt du dann nicht nur diese?
und das mit dem True wurde schon gesagt.
ich hoff mal ich hab's auf das Wichtigste reduziert (an der Funktionsweise sollte sich nicht viel geändert haben, abgesehn vom lauf2=ende2)
Delphi-Quellcode:
procedure TForm1.RadioButtonClick(Sender: TObject);
begin
nachname := RadioButton1.Checked;
vorname := RadioButton2.Checked;
kategorie := RadioButton5.Checked;
geburtstag := RadioButton6.Checked;
richtung := RadioButton3.Checked;
// RadioButton4 ist in der 3 enthalten, da ja wohl das Negative
sortieren;
end;
procedure sortieren;
begin
lauf:=TKnoten.Init;
if (anfang.nachfolger<>ende)
then begin
anfang2:=TKnoten.Init;
ende2:=TKnoten.Init;
anfang2.nachfolger:=ende2;
ende2.vorgaenger:=anfang2;
lauf:=anfang;
repeat
lauf:=lauf.nachfolger;
neu2:=TKnoten.Init;
neu2.Daten:=lauf.Daten;
lauf2:=anfang2;
repeat
lauf2:=lauf2.nachfolger;
until (lauf2=ende2)
or ( richtung and nachname and (lauf2.Daten.nachname > neu2.Daten.nachname))
or (not richtung and nachname and (lauf2.Daten.nachname < neu2.Daten.nachname))
or ( richtung and vorname and (lauf2.Daten.vorname > neu2.Daten.vorname))
or (not richtung and vorname and (lauf2.Daten.vorname < neu2.Daten.vorname))
or ( richtung and kategorie and (lauf2.Daten.kategorie > neu2.Daten.kategorie))
or (not richtung and kategorie and (lauf2.Daten.kategorie < neu2.Daten.kategorie))
or ( richtung and geburtstag and (lauf2.Daten.geburtstag > neu2.Daten.geburtstag))
or (not richtung and geburtstag and (lauf2.Daten.geburtstag < neu2.Daten.geburtstag));
lauf2.vorgaenger.nachfolger:=neu2;
neu2.vorgaenger:=lauf2.vorgaenger;
lauf2.vorgaenger:=neu2;
neu2.nachfolger:=lauf2;
until (lauf=ende.vorgaenger);
anfang:=anfang2;
ende:=ende2;
knoteneinlesen;
end;
end;
ich glaub so müßte man es noch kürzen können
Delphi-Quellcode:
repeat
lauf2:=lauf2.nachfolger;
until (lauf2=ende2)
or (nachname and ((lauf2.Daten.nachname < neu2.Daten.nachname) xor richtung))
or (vorname and ((lauf2.Daten.vorname < neu2.Daten.vorname) xor richtung))
or (kategorie and ((lauf2.Daten.kategorie < neu2.Daten.kategorie) xor richtung))
or (geburtstag and ((lauf2.Daten.geburtstag < neu2.Daten.geburtstag) xor richtung));
nja, zumindestens isses jetzt etwas übersichtlicher und man findet womöglich den Fehler schneller,
außerdem nur ein Sortier-Code, statt 4 = 75% weniger Fehlerquellen
um wieviele Listenelemente handelt es sich denn?
ich hab es mir letztens einfach gemacht
- Elemente gezählt
- dynamisches Array für die Elemente angelegt
- Array gefüllt
- in dem Array sortiert
- und dann über das Array neu neu verkettet
so geht das sortieren sogar etwas schneller, da man direkt über den Arrayindex sortieren und agieren kann
und sich wärend des Sortierens sich nicht um die Verknüfungen kümmern muß
[add]
sind RadioButton 3 und 4 unabhängig von den Anderen?
Gruppe 1 = 1, 2, 5 & 6
Gruppe 2 = 3 & 4
denn wenn in auch nur einer der Gruppen kein Button gecheckt ist, dann macht deine Version nix