Stringlist.Count

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
  zeile3 = 'Dies ist die Dritte Zeile die bereits hier erstellt wird.';
var
  Liste: TStringList; //Verknüpfe variable mit liste
begin
  Liste := TStringList.Create; // Erstelle eine Liste
  Liste.Append('Dies ist die erste Zeile.');
  Liste.Append('Hier ist bereits die 2. Zeile');
  Liste.Append(zeile3);
  //Auch eine leere Zeile ist eine Zeile
  Liste.Append('');
  //Zeige die Liste im Memo an
  Memo1.Lines := liste;
  ShowMessage(IntToStr(liste.Count));
  Liste.Free;
end;

In dem Beispiel sehen wir die Funktion von “Count”. Hier werden die Zeilen gezählt in unserem Beispiel sind es 4. Auch eine Zeile ohne Text, ist eine Zeile. Oft wird die Methode “Count” im Zusammenhang mit dem durchsuchen der Liste benutzt. Wenn sie das machen wollen, müssen sie folgendes Beachten. Aber erstmal ein Beispiel.

Beispiel 2

Vorbereitung: Erstellen sie eine IDE Anwendung und ziehen Sie einen TButton und TMemo auf die Form. Binden Sie die Unit StrUtils mit der Uses-Klausel in die Anwendung ein. Doppelklicken sie auf den Button und ersetzen Sie das Ereignis durch folgenden Quelltext:

procedure TForm1.Button1Click(Sender: TObject);
const
  zeile3 = 'Dies ist die Dritte Zeile die bereits hier erstellt wird.';
  Suchtext = 'Zeile';
var
  Liste: TStringList; //Verknüpfe variable mit liste
  f: integer;
begin
  //lösche zur Sicherheit die Liste von Memo1
  Memo1.Lines.Clear;
  Liste := TStringList.Create; // Erstelle eine Liste
  Liste.Append('Dies ist die erste Zeile.');
  Liste.Append('Hier ist bereits die 2. Zeile');
  Liste.Append(zeile3);
  //Auch eine leere Zeile ist eine Zeile
  Liste.Append('');
  //Zeige die Liste im Memo an
  for f := 0 to liste.Count-1 do
    // Wir hätten hier auch 'Zeile' angeben können.
    // Gewöhnen Sie sich die deklaration als Konstante an
    // Es ist bei größeren Programmen wichtig
    // Wenn gefunden dann...
    if AnsiContainsText(liste[f], Suchtext) then
      Memo1.Lines.Append('Ich habe das gesuchte Wort in Zeile ' + IntToStr(f) +
        ' gefunden.');
  Liste.Free;
end;

Bei einer Fehlermeldung haben Sie “StrUtils” vergessen einzubinden. Hier in dem Beispiel wird wird unsere List mit einer for-Schleife durchlaufen um nach dem Wort “Zeile” zu suchen. Wenn es gefunden wurde wir der Fundort in der Memo-Zeile angezeigt.Dabei ist darauf zu achten, das die liste bei 0 mit dem Zählen beginnt. Das bedeutet, das “Count” mit der Zahl 4 einen Fehler erzeugen würde. Es sind zwar 4 Zeilen diese werden jedoch von 0 bis 3 gezählt. Dies sehen Sie auch in der Anzeige im Memo. Wenn sie die Anzeige der Nummerierung ändern wollen,dann erstzen sie die If Zeile hiermit ab. Der Befehl “AnsiContainsText” sucht in einer Zeile nach dem angegeben Wort. Wollen sie nach mehreren wörten suchen benötigen Sie den Befehl “AnsiMatchText” beiden befinden sich in der Unit “StrUtils“, weswegen wir diese einbinden müssen.

    if AnsiContainsText(liste[f], Suchtext) then
      Memo1.Lines.Append('Ich habe das gesuchte Wort in Zeile ' + IntToStr(f+1) +
        ' gefunden.');

Wie Sie sehen haben wir bei der Anzeige von IntToStr einfach 1 hinzu addiert. Intern ist die Liste noch nach wie vor mit 0..3 nummeriert. Wenn Sie bei “liste.count -1” die “-1” entfernen. Dann pasiert folgendes.

Lazarus - Strinlist Error: Out Of Bounds
Strinlist Error: Out Of Bounds

Der Fehler entsteht weil, beim letzten Durchlauf wird auf Eintrag ‘4’ zuzugreifen, dies misslingt bei einer Nummerierung von 0..3 natürlich.