Home » Tutorials » VCL » Listen in Delphi

Listen in Delphi

Häufige Fehlerquellen

In diesem Kapitel werden die häufigsten Fehlerquellen besprochen und gezeigt, wie man sie vermeiden kann. Auch in den letzten Kapiteln wurden an gegebenen Stellen schon auf mögliche Fehlerquellen hingewiesen.

Kopieren einer Liste

Möchten Sie eine Liste duplizieren, kommt es häufig zu unerwarteten, schwer auffindbaren Fehlern. Sehen wir uns dazu folgendes Beispiel an:

procedure TForm1.Button1Click(Sender: TObject);
var
  StrL1: TStringList;
  StrL2: TStringList;
begin
  StrL1:=TStringList.Create;
  StrL2:=TStringList.Create;
  try
    StrL1.Add('Erster String');
    StrL1.Add('Zweiter String');
    StrL1.Add('Dritter String');

    StrL2:=StrL1;  //Hier ist die entscheidende Zeile
  finally
    StrL1.Free;
    StrL2.Free;
  end;
end;

Hier werden zwei Listen erzeugt. Die erste Liste wird mit Inhalt gefüllt. Danach wird die, so angenommen, eine Kopie der Liste der zweiten Liste übergeben. Wenn man aber genauer hinsieht, erkennt man, dass es sich bei den Listen um Objekte handelt. Die zweite wird auf den Speicherbereich der ersten Liste gesetzt. Sämtliche Änderungen der ersten Liste haben somit auch Auswirkungen auf die zweite Liste – durch die Zuweisung hat man quasi nur noch eine Liste zur Verfügung. Zudem ensteht an dieser Stelle ein Speicherleck, da die zweite liste nicht mehr freigegeben werden kann.
Um eine Liste wirklich zu kopieren, nutzen Sie die Methode Assign. Die Methode Assign kopiert den Inhalt richtig:

StrL2.Assign(StrL1);

Parameterübergabe

Verwenden Sie in einer Procedure/Funktion Listen als Parameter, denken Sie daran, dass bei Objekten als Parameter immer nur die Referenz übergeben wird. Änderungen haben also immer Auswirkungen auf das Ursprungsobjekt. Haben Sie eine Procedure geschrieben, die mit TString-Abkömmlingen hantiert, empfiehlt es sich, den Parameter als TStrings zu deklarieren, da die Procedure so mit sämtliche Nachkommen von TStrings zurecht kommt:

procedure(const AListe: TStrings);
begin
  AListe.Add(IntToStr(Random(100)));
end;