Stringlist.Duplicates

Verweis: stringlisten
Uses: Classes
Eingabe: Verfahrensart(TDuplicates)
Ausgabe: Nichts
Funktion: gibt an wie bei einer Zusamenführung von Strings in einer Liste zu verfahren ist.

Mit dem Schalter “Stringlist.Duplicates” können Sie beim Einfügen eines oder mehrerer Strings bestimmen wie mit doppelten Einträgen verfahren werden soll. Es gibt insgesamt 3 Möglichkeiten, die in der unten stehenden Tabelle erläutert sind.

Schalter Auswirkungen
dupIgnore Es werden keine doppelten Einträge zugelassen. Diese werden einfach gelöscht.
dupAccept Doppelte Einträge werden akzeptiert.
dupError Sollte versucht werden ein doppelten hinzuzufügen, dann kommt es zu einer Fehlermeldung.

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);
const
  Tiere: array[0..4] of string =
    ('Hund', 'Katze', 'Maus', 'Esel', 'Kuh');
  Nahrung: array[0..4] of string =
    ('Sahne', 'Joghurt', 'Milch', 'Butter', 'Kuh');
var
  Liste: TStringList;
  //Verknüpfe Variable mit liste
  Eintraege: integer; //Wie viele Einträge
begin
  Liste := TStringList.Create; // Erstelle eine Liste
  Liste.Sorted := True;
  liste.Duplicates := dupAccept;
  Liste.AddStrings(Tiere);  // Kuh bei beiden vorhanden
  Liste.AddStrings(Nahrung);
  Eintraege := Liste.Count;
  //Im Memo übertragen
  memo1.Lines := Liste;
  ShowMessage('Es gibt:' + IntToStr(Eintraege) + ' Einträge.');
  // Liste freigeben
  Liste.Free;
end;

Normalerweise wird beim Einschalten in den Sortier Modus, welches wir in dem Beispiel 1 mit dem Befehl,

  liste.Duplicates := dupAccept;

aktiviert haben, automatisch der Schalter für Duplicates auf “dupIgnore” gestellt. Was in dem Normalfall dazu führt, dass der doppelte Eintrag des Wortes “Kuh” kommentarlos gestrichen wird. Hier in dem Beispiel haben wir mit dem Schalter “dupAccept” doppelte Einträge zugelassen. Jedoch halten wird die Voreinstellung für sinnvoll, denn wer eine Liste sortiert der möchte diese Liste auch durchsuchen. Dann ist es eher hinderlich, wenn wir 2 Sortierte Einträge haben dessen Quelle wir nicht mehr zuordnen können da sich beim sortieren die Position (Index) in der Liste verändert. Aber wer unbedingt will der kann, denn die Möglichkeit hierzu, besteht.

Jetzt bleibt als letztes der Schalter “dupError” zu klären. Dieser Schalter macht das wonach er aussieht. Er erzeugt eine Exception. Wenn wir nun in Beispiel 1 folgende Zeile ändern.

  liste.Duplicates := dupError;

Dan bekommen wir prima Fehlermeldungen wie diese.

Lazarus Fehlermeldung doppelte Einträge
Fehlermeldung bei doppelten Einträgen.

Die obere Meldung kommt vom Debugger. Die Untere wird von der Exe-Datei ausgegeben. Da ein unbehandeltes Fehlerereignis, so sinnvoll wie “Aua Zahn” ohne Besuch beim Zahnarzt ist, zeigen wir hier in Beispiel 2 die richtige Behandlung. 🙂

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);
const
  Tiere: array[0..4] of string =
    ('Hund', 'Katze', 'Maus', 'Esel', 'Kuh');
var
  Liste: TStringList; //Verknüpfe Variable mit liste
begin
  Liste := TStringList.Create; // Erstelle eine Liste
  Liste.Sorted := True;
  liste.Duplicates := dupError;
  Liste.AddStrings(Tiere);  // fülle die Liste
  //Im Memo übertragen
  memo1.Lines := Liste;
  //versuche
  try
    // das wort Kuh hinzu zufügen
    Liste.Append('Kuh');
  except
    ShowMessage('Warnung: Das Wort ist schon vorhanden.');
  end;
  // Liste freigeben
  Liste.Free;
end;

Nun haben wir mit Try..Except den Fehler behandelt. Wir geben in unserem Beispiel eine Fehlermeldung im eigenen Fenster aus und Ignorieren den Eintrag. Möglich wäre auch der aufruf einer Funktion die dann bei einem vorhandenen Wert eine 1 zum Namen hinzufügt. Das wäre hier dann “Kuh1”. Hier muss natürlich auch überprüft werden ob “Kuh1” schon vorhanden ist. Dann heißt der Name vielleicht “Kuh2” u.s.w. Entscheidend ist hierbei, dass Sie auf Fehler reagieren können. So wie Sie es wünschen. Schauen Sie hierzu unter Try..Except nach. Das Erkennen eines doppelten Eintrags geht auch mit der Methode Stringlist.Add in Kombination von Stringlist.Count.