M
1) Du verzichtest auf SL.Free und gibst somit eine existierende Stringlist heraus.
Dann solltest Du aber das Ergebnis an anderer Stelle wieder freigeben, damit Du nicht ein Memoryleak erzeugst und den Speicher vollmüllst.
2) Du erzeugst Deine SL vor der Funktion und übergibst diese als Parameter.
Dann hat die Funktion (oder Prozedur) nur die Aufgabe, SL zu füllen, aber nicht zu erzeugen.
Der Vorteil zu 1) ist, dass klarer ist, wo SL wieder freigegeben werden muss.
3) Du könntest aus der Funktion auch nur den reinen Text als String heraus geben.
4) Du könntest eine Stringliste nehmen, die auf TInterfacedObject basiert, also referenzzählend ist.