Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TStringList als Result einer Funktion (https://www.delphipraxis.net/181498-tstringlist-als-result-einer-funktion.html)

Captnemo 20. Aug 2014 09:23

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:
function GetTiere: TStringList;
begin
  Result:=TStringList.create;
  Result.Add('Hund');
  Result.Add('Katze');
  Result.Add('Maus');
end;
Der Aufruf z.B. soll so aussehen:

Delphi-Quellcode:
Listbox1.Items.Assign(GetTiere);
Also ich will per Assign aus einer Funktion eine Listbox füllen.

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.

Sherlock 20. Aug 2014 09:29

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

TheFrog 20. Aug 2014 09:34

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.

Dejan Vu 20. Aug 2014 09:36

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:
Procedure FillTiere (aDestination : TStringList);
begin
  aDestination.Add('Hund');
  aDestination.Add('Katze');
  aDestination.Add('Maus');
end;
Dann kann man sie so aufrufen:
Delphi-Quellcode:
FillTiere(ListBox.Items)
oder so:
Delphi-Quellcode:
  tmp := TStringList.Create;
  Try
    FillTiere (tmp);
    ListBox.Items.Assign(tmp);
  finally
    tmp.Free
  end
Somit ist klar, wer Ersteller ist.

Bernhard Geyer 20. Aug 2014 09:36

AW: TStringList als Result einer Funktion
 
Was spricht dagegen das als:

Delphi-Quellcode:
GetTiere(Listbox1.Items)
zu realiseren

Zitat:

Zitat von TheFrog (Beitrag 1269201)
Wir haben in unserem Projekt ein Interface IMyStringList deklariert.

Wieso nicht die Standardklasse verwendet: docwiki.embarcadero.com/Libraries/XE5/de/System.Classes.IStringsAdapter

Captnemo 20. Aug 2014 09:39

AW: TStringList als Result einer Funktion
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1269203)
Was spricht dagegen das als:

Delphi-Quellcode:
GetTiere(Listbox1.Items)
zu realiseren

Zitat:

Zitat von TheFrog (Beitrag 1269201)
Wir haben in unserem Projekt ein Interface IMyStringList deklariert.

Wieso nicht die Standardklasse verwendet: docwiki.embarcadero.com/Libraries/XE5/de/System.Classes.IStringsAdapter

Hmmm....absolut nichts spricht dagegen. Aus irgendeinem nicht nachvollziehbaren Grund wollte ich das umgekehrt machen :-) Frag mich nicht warum.

TheFrog 20. Aug 2014 09:41

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!

Bernhard Geyer 20. Aug 2014 09:41

AW: TStringList als Result einer Funktion
 
Zitat:

Zitat von Captnemo (Beitrag 1269204)
Hmmm....absolut nichts spricht dagegen. Aus irgendeinem nicht nachvollziehbaren Grund wollte ich das umgekehrt machen :-) Frag mich nicht warum.

Zu viel C#/Java programmiert.
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.

himitsu 20. Aug 2014 09:41

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:

Zitat von Sherlock (Beitrag 1269200)
Meine naive Meinung: Wers erzeugt gibt auch wieder frei. In diesem Fall ist der Aufrufer der Funktion der Erzeuger.

Erstellt hat die Liste aber die Funktion und nicht der Aufrufer.
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.

Captnemo 20. Aug 2014 09:45

AW: TStringList als Result einer Funktion
 
Zitat:

Zitat von TheFrog (Beitrag 1269205)
Ich dachte er hat als Delphi - Version die 5 angegeben.

Weil ich das blöderweise IMMER vergesse :oops::oops:
(Warum nimmt der auch nicht das, was ich meinem Profil eingestellt habe)

Habs korrigiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:20 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz