Stringlist.Sorted

Verweis: stringlisten
Uses: Classes
Eingabe: Text(String)
Ausgabe: nichts
Funktion: sortiert die Einträge in einer StringList. Neue Einträge werden automatisch beim Einfügen sortiert.

Vorbereitung: Erstellen sie eine IDE Anwendung und ziehen Sie einen TButton und TMemo auf die Form. Doppelklicken sie auf den Button und ersetzen Sie das Ereignis durch folgenden Quelltext:

Beispiel 1

procedure TForm1.Button1Click(Sender: TObject);
var
  Liste: TStringList; //Verknüpfe Variable mit liste
begin
  Liste := TStringList.Create; // Erstelle eine Liste
  //Jetzt schalten wir auf sortieren
  liste.Sorted := True;
  Liste.Append('der');
  Liste.Append('der');
  Liste.Append('die');
  Memo1.Lines := liste;
  //Schlußmeldung
  ShowMessage('Schauen Sie sich das Memo an.' + #13#10 +
    'Der ist doppelt, also kein Eintrag!');
  // Gib wie immer den Speicher Frei
  Liste.Free;
end;

In dem Beispiel wird die Eigenschaft sorted angewendet. Beim ersten Durchgang schalten wir die Eigenschaft auf “false”. Diesen Schritt müssen wir nicht unbedingt machen. Denn diese Eigenschaft steht nach dem Erzeugen einer Stringlist immer auf False. Wenn jedoch das Erzeugen der Liste und der Aufruf der “sorted” Procedure in getrennten Unterprogrammen stehen, kann es sein das der Schalter nicht in der gewünschten Position steht. Was die Programmausführung beeinträchtigt.

Stringliste sorted true Lazarus
Unser Augenmerk richtet sich auf die Anzahl der Einträge.

Bei der Auführung des Programms fällt uns hier auf, dass sich die Einträge bei “Sorted” um ein “der” verringert haben. Im wesentlichen sind die Macher von Lazarus davon ausgegangen, dass wir entweder ein Buch oder Artikel schreiben der folglich nicht sortiert ist. Es kann aber auch sein, dass wir eine Liste mit Aufzählungen schreiben und wenn da aus Irgend einem Grund 2 mal das gleiche drin steht, dann wird dieser Eintrag gelöscht. Leider ist dieses Beispiel nicht gut, denn Wir wissen nicht wann der doppelte Eintrag hinzugefügt werden sollte. Das können wir ändern. Aber nicht mit dem Befehl “Append” sondern mit “Add”.

Vorbereitung: Erstellen sie eine IDE Anwendung und ziehen Sie einen TButton und TMemo auf die Form. Doppelklicken sie auf den Button und ersetzen Sie das Ereignis durch folgenden Quelltext:

Beispiel 2

procedure TForm1.Button1Click(Sender: TObject);
var
  Liste: TStringList; //Verknüpfe Variable mit liste
  check: integer;
begin
  Liste := TStringList.Create; // Erstelle eine Liste
  //Jetzt schalten wir auf sortieren
  liste.Sorted := True;
  check := 0;
  if Check <> Liste.Add('der') then
    ShowMessage('0 Doppelt');
  Inc(check);  //eintrag 1
  if Check <> Liste.Add('die') then
    ShowMessage('1 Doppelt');
  Inc(check);  //eintrag 2
  if Check <> Liste.Add('die') then
    ShowMessage('2 Doppelt');
  Memo1.Lines := liste;
  // Gib wie immer den Speicher Frei
  Liste.Free;
end;

Das 2. Beispiel ist Aufgrund der Übersichtlichkeit nicht in einer Schleife gepackt worden. Es geht hier ja um das Verstehen des Prinzips. Hier wird also die Liste einzeln Bestückt. Check ist dabei unsere Integer – Variable zur Überprüfung der Einträge. Wir fügen mit “Add” einen Wert ein und vergleichen diesen mit dem erwarteten Wert 0-1-2 bei 2 bekommen wir allerdings nicht 2 sondern 1. 1 ist die Zeile in dem “die” bereits vor kam. Also gibt es nun eine Meldung da “check” und das Ergebnis von “Add” ungleich ist.

Beispiel 2 ist fehlerhaft

Dennoch ist das Programm 2 Suboptimal. Das will heißen, dass es nur scheinbar gut funktioniert. Ändern Sie hierzu einmal die Werte der Einträge. 1=”die” 2=”der” und 3=”der”.Man könnte nun annehmen, dass hier ebenfalls nur eine Meldung erfolgt. Dem ist aber nicht so. Warum ? Nun die liste wird ja ständig sortiert. Wenn wir nun das Programm aufrufen. Sagt das Programm aha, 1 ist doppelt. Dan sortiert das Programm und merkt 2 ist doppelt. Sie können nicht wärend des Sortierens die Werte überprüfen. Das führt immer zu falschen Ergebnissen.Es funktioniert wunderbar wenn wir nur einen Wert in eine bereits sortierte Liste einfügen wollen. Dies kommt in der Praxis ja auch häufiger vor. Wie das geht, zeigen wir Ihnen im 3. Beispiel:

Vorbereitung: Erstellen sie eine IDE Anwendung und ziehen Sie einen TButton und TMemo auf die Form. Doppelklicken sie auf den Button und ersetzen Sie das Ereignis durch folgenden Quelltext:

Beispiel 3

procedure TForm1.Button1Click(Sender: TObject);
const
  Tiere: array[0..5] of string =
    ('Hund', 'Katze', 'Maus', 'Esel', 'Kuh', 'Frosch');
var
  Liste: TStringList; //Verknüpfe Variable mit liste
  Check: integer; //Wohin
  Alt: integer;  //eintrag neu ?
begin
  Liste := TStringList.Create; // Erstelle eine Liste
  //Jetzt schalten wir auf sortieren
  liste.Sorted := True;
  // Mit AddString ist es Möglich
  // ein definiertes Array hinzu zufügen.
  liste.AddStrings(Tiere);
  // Liste count ist jetzt 6
  Alt := Liste.Count;
  Check := Liste.Add('Hund');
  // Teste ob neu
  if Alt <> Liste.Count then
  begin
    ShowMessage('Der Eintrag wurde neu an der ' +
      IntToStr(Check) + '. Stelle hinzugefügt.');
  end;
  // Werte bleiben Gleich wenn kein neuer Eintrag
  if Alt = Liste.Count then
    ShowMessage('Den Eintrag gab es schon.');
  //kopiere die Liste in das Memo
  Memo1.Lines := liste;
  // Gib wie immer den Speicher Frei
  Liste.Free;
end;

Hier sehen wir wie wir relativ einfach mehrere Strings einfügen. Wenn wir nun Hund addieren wollen, dann passiert nichts. und die Liste bleibt gleich groß, dies können wir mit Liste.Count abfragen. Ändern sie den Hund im quelltext durch ein neues Tier. Zum Beispiel “Aal”. Nun wird das neue Wort an nullter – Stelle eingefügt. Das Verhalten der Procedure “Sorted” wird durch die Einstellung des Schalters Duplicates bestimmt.