AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Funktion mit Rückgabe TStrings bzw TMemIniFile
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion mit Rückgabe TStrings bzw TMemIniFile

Ein Thema von SneakyBagels · begonnen am 4. Jun 2017 · letzter Beitrag vom 6. Jun 2017
Antwort Antwort
SneakyBagels
(Gast)

n/a Beiträge
 
#1

Funktion mit Rückgabe TStrings bzw TMemIniFile

  Alt 4. Jun 2017, 11:52
Ich schreibe gerade eine meiner Funktionen so um, dass der Rückgabewert TStrings entspricht.

Auszug
Delphi-Quellcode:
sl := TStringList.Create;
try
 IniFile_.GetStrings(sl); // TMemIniFile
 ...
 ...
 Result := sl;
 // STELLE 1
finally
 sl. Free;
 // STELLE 2
end;
Wenn ich an STELLE 1 Result.Text prüfe, befindet sich der Inhalt der Ini-Datei da drin.
An STELLE 2 jedoch ist Result leer.

Wie bekomme ich dieses Problem in den Griff?
Ich würde ja gerne das Ini-File als Rückgabewert nehmen aber ich wüsste nicht wie.

Geändert von SneakyBagels ( 4. Jun 2017 um 11:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Funktion mit Rückgabe TStrings bzw TMemIniFile

  Alt 4. Jun 2017, 12:16
Meine Hilfe (XE3) kennt TIniFile.GetStrings nicht.
Ich setze mal voraus, dass damit alle Textzeilen nach SL kopiert werden.

Mit SL.Free wird diese StringList wieder freigegeben.
Da Result und SL den gleichen Speicherbereich referenzieren, wird damit auch Result freigebenen.
Somit gibst Du einen gelöschten/ungültigen Verweis aus Deiner Funktion heraus.

Du könntest 3 Lösungsansätze wählen:

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.
Delphi-Quellcode:
function MyFunc: String;
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    IniFile_.GetStrings(sl); // TMemIniFile
    ...
    ...
    Result := sl.Text;
  finally
    sl. Free;
end;
In dem Fall könntest Du einfach den Text weiter verarbeiten und musst Dioch nicht um die Speicherfreigabe kümmern.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli ( 4. Jun 2017 um 12:19 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

AW: Funktion mit Rückgabe TStrings bzw TMemIniFile

  Alt 4. Jun 2017, 12:21
Du erstellst in der Funktion eine Stringliste und gibst sie in der Funktion wieder frei.

Result ist aber nur ein Zeiger auf die Stringliste.

Eventuell sowas in der Art?
Delphi-Quellcode:
function HoleIniInhalt : TStringList;
begin
  Result := TStringList.Create;
  try
    IniFile_.GetStrings(Result); // TMemIniFile
    ...
    ...
    // STELLE 1
  finally
    // STELLE 2
  end;
end;

var
  sl : TStringList;
begin
  sl := HoleIniInhalt;
  ...
  // Machwas mit sl
  ...
  sl.Free;
end;
Oder:
Delphi-Quellcode:
procedure HoleIniInhalt(sl : TStringList);
begin
  try
    IniFile_.GetStrings(sl); // TMemIniFile
    ...
    ...
    // STELLE 1
  finally
    // STELLE 2
  end;
end;

var
  sl : TStringList;
begin
  sl := TStringList.Create;
  HoleIniInhalt(sl);
  ...
  // Machwas mit sl
  ...
  sl.Free;
end;
Sinngemäß schrieb stahli das ja auch schon.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Funktion mit Rückgabe TStrings bzw TMemIniFile

  Alt 4. Jun 2017, 12:33
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.
Kann ich nur unterstützen. Sonst kann es passieren, daß "frei vagabundierende" Stringlisten durch den Speicher geistern.
(Ich hab auch mal gedacht, das sei eine gute Idee)

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
760 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Funktion mit Rückgabe TStrings bzw TMemIniFile

  Alt 4. Jun 2017, 14:03
Hallo SneakyBagels

wenn ich deinen Codeteil richtig interpretiere, dann willst du nach dem Laden eines TMemIniFiles gewisse Einträge überprüfen und eventuell ändern und dann mit diesen geänderten Daten weiter arbeiten.

Wenn dem so wäre, dann könntest du auch via GetStrings das File in eine TStringlist laden, diese Stringliste abändern und danach via SetStrings wieder zurückschreiben. [Einfach TMeinMemIniFile von TMemIniFile ableiten und TMeinMemIniFile.Create entsprechend erweitern.]

Der Vorteil wäre, dass du in deinem Programm sämtliche Schreib-/Lesezugriffe, welche dein TMemIniFile betreffen, so belassen könntest wie sie sind.

[ Wenn du jedoch aus dem TMemIniFile nur jeweils einen Teil in eine TStringList extrahieren und damit arbeiten willst, die Original Ini Datei jedoch inkl. der in der TStringList nicht enthaltenen Daten behalten willst, dann müsste man von Fall zu Fall entscheiden. ]

Gruss
Michael
Michael Gasser
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.443 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Funktion mit Rückgabe TStrings bzw TMemIniFile

  Alt 6. Jun 2017, 16:17
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.
  Mit Zitat antworten Zitat
Antwort Antwort


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 11:02 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