![]() |
Delphi-Version: XE4
TStringList als Result einer Funktion
Hi,
ist ne blöde Frage, ich weiß, aber ich stell sie mal trotzdem. Ich brauch eine Funktion, die mir eine StringList zurückliefert.
Delphi-Quellcode:
Der Aufruf z.B. soll so aussehen:
function GetTiere: TStringList;
begin Result:=TStringList.create; Result.Add('Hund'); Result.Add('Katze'); Result.Add('Maus'); end;
Delphi-Quellcode:
Also ich will per Assign aus einer Funktion eine Listbox füllen.
Listbox1.Items.Assign(GetTiere);
Wo würde man aber Result wieder freigeben? Theoretisch kann die Funktion GetTiere ja mehrmals aufgerufen werden, und jedes Mal würde eine neue StringList erstellt, die dann im Speicher rumliegt. In der Funktion selber freigeben würde ja logischerweise nicht gehen. |
AW: TStringList als Result einer Funktion
Meine naive Meinung: Wers erzeugt gibt auch wieder frei. In diesem Fall ist der Aufrufer der Funktion der Erzeuger.
Sherlock |
AW: TStringList als Result einer Funktion
Wir haben in unserem Projekt ein Interface IMyStringList deklariert. Die implementierende Klasse ist von TInterfacedObject abgeleitet und dient als Wrapper für eine TStringList.
Damit könnte dein Aufruf ungefähr so aussehen:
Delphi-Quellcode:
ListBox1.Items.Assign(GetTiere.Strings);
Damit wird durch das ReferenceCounting die Instanz wieder freigegeben, wenn diese nicht mehr gebraucht wird. Vielleicht hilft Dir das ja weiter. |
AW: TStringList als Result einer Funktion
Wenn man interfaces benutzt, sollte man nur interfaces nehmen und keinen Mischmasch. Denn wie erkennt man, wo man etwas manuell freigeben muss und wo nicht? Also nichts gegen die Lösung, aber als isolierte Lösung hier würde ich das nicht machen.
Die eigentliche Frage ist ja (wenn man Sherlock's law beachtet) Wie erkennt man (wie im Beispiel des TE), das die Funktion eine Liste liefert, die man freigeben muss? Wer ist hier wirklich der Ersteller? Ich würde das so lösen, das die Funktion eine Methode ist, die in eine ihr übergebene Liste die Tiernamen anhängt, und eben keine neue Instanz liefert.
Delphi-Quellcode:
Dann kann man sie so aufrufen:
Procedure FillTiere (aDestination : TStringList);
begin aDestination.Add('Hund'); aDestination.Add('Katze'); aDestination.Add('Maus'); end;
Delphi-Quellcode:
oder so:
FillTiere(ListBox.Items)
Delphi-Quellcode:
Somit ist klar, wer Ersteller ist.
tmp := TStringList.Create;
Try FillTiere (tmp); ListBox.Items.Assign(tmp); finally tmp.Free end |
AW: TStringList als Result einer Funktion
Was spricht dagegen das als:
Delphi-Quellcode:
zu realiseren
GetTiere(Listbox1.Items)
Zitat:
|
AW: TStringList als Result einer Funktion
Zitat:
|
AW: TStringList als Result einer Funktion
Ich dachte er hat als Delphi - Version die 5 angegeben.
Ist damit XE5 gemeint, dann hast Du natürlich recht! |
AW: TStringList als Result einer Funktion
Zitat:
Bei einer Programmiersprache mit Garbage-Collector würde ich das so machen. Da wird ja alles korrekt aufgeräumt wenn es nicht mehr verwendet würde. |
AW: TStringList als Result einer Funktion
Man sollte aber im Namen/Dokumentation erwähnen, daß ob die Funktion jedesmal eine TStringList erzeugt, zurückgibt und nicht wieder freigibt
oder ob sich die Funktion die Instanzen merkt und "irgendwann" freigibt oder ob es eine interne Instanz ist, welche mit der Komponente freigegeben wird. (mehrfacher aufruf und gleichzeitige Auswertungen der Liste nicht möglich) oder ob der Aufrufer für die Freigabe verantwortlich ist. Zitat:
Außer man sagt, daß die Funktion eine Liste erstellt und der Aufrufer das dann freigeben soll. Ich gebe ja auch nicht jedesmal die Liste frei, wenn ich auf Memo.Lines (intern Memo.GetLines) zugreife. PS: Auch wenn du intern eine TStringList erzeugst ... Es macht sich dennoch oft besser, wenn das Result-Typ ein TStrings ist. |
AW: TStringList als Result einer Funktion
Zitat:
(Warum nimmt der auch nicht das, was ich meinem Profil eingestellt habe) Habs korrigiert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz