AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TStringList als Result einer Funktion

Ein Thema von Captnemo · begonnen am 20. Aug 2014 · letzter Beitrag vom 21. Aug 2014
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

TStringList als Result einer Funktion

  Alt 20. Aug 2014, 10:23
Delphi-Version: XE4
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:

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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo

Geändert von Captnemo (20. Aug 2014 um 10:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#2

AW: TStringList als Result einer Funktion

  Alt 20. Aug 2014, 10:29
Meine naive Meinung: Wers erzeugt gibt auch wieder frei. In diesem Fall ist der Aufrufer der Funktion der Erzeuger.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
TheFrog

Registriert seit: 24. Mär 2009
145 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TStringList als Result einer Funktion

  Alt 20. Aug 2014, 10:34
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:

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.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#4

AW: TStringList als Result einer Funktion

  Alt 20. Aug 2014, 10:36
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: 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.

Geändert von Dejan Vu (20. Aug 2014 um 10:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer
Online

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: TStringList als Result einer Funktion

  Alt 20. Aug 2014, 10:36
Was spricht dagegen das als:

GetTiere(Listbox1.Items) zu realiseren

Wir haben in unserem Projekt ein Interface IMyStringList deklariert.
Wieso nicht die Standardklasse verwendet: docwiki.embarcadero.com/Libraries/XE5/de/System.Classes.IStringsAdapter
Windows Vista - Eine neue Erfahrung in Fehlern.

Geändert von Bernhard Geyer (20. Aug 2014 um 10:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#6

AW: TStringList als Result einer Funktion

  Alt 20. Aug 2014, 10:39
Was spricht dagegen das als:

GetTiere(Listbox1.Items) zu realiseren

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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
TheFrog

Registriert seit: 24. Mär 2009
145 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: TStringList als Result einer Funktion

  Alt 20. Aug 2014, 10:41
Ich dachte er hat als Delphi - Version die 5 angegeben.

Ist damit XE5 gemeint, dann hast Du natürlich recht!
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer
Online

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: TStringList als Result einer Funktion

  Alt 20. Aug 2014, 10:41
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#9

AW: TStringList als Result einer Funktion

  Alt 20. Aug 2014, 10:41
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.

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#10

AW: TStringList als Result einer Funktion

  Alt 20. Aug 2014, 10:45
Ich dachte er hat als Delphi - Version die 5 angegeben.
Weil ich das blöderweise IMMER vergesse
(Warum nimmt der auch nicht das, was ich meinem Profil eingestellt habe)

Habs korrigiert.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo

Geändert von Captnemo (20. Aug 2014 um 10:47 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:47 Uhr.
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