![]() |
Funktion mit Rückgabe TStrings bzw TMemIniFile
Ich schreibe gerade eine meiner Funktionen so um, dass der Rückgabewert TStrings entspricht.
Auszug
Delphi-Quellcode:
Wenn ich an STELLE 1 Result.Text prüfe, befindet sich der Inhalt der Ini-Datei da drin.
sl := TStringList.Create;
try IniFile_.GetStrings(sl); // TMemIniFile ... ... Result := sl; // STELLE 1 finally sl. Free; // STELLE 2 end; 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. |
AW: Funktion mit Rückgabe TStrings bzw TMemIniFile
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:
In dem Fall könntest Du einfach den Text weiter verarbeiten und musst Dioch nicht um die Speicherfreigabe kümmern.
function MyFunc: String;
var sl: TStringList; begin sl := TStringList.Create; try IniFile_.GetStrings(sl); // TMemIniFile ... ... Result := sl.Text; finally sl. Free; end; |
AW: Funktion mit Rückgabe TStrings bzw TMemIniFile
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:
Oder:
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;
Delphi-Quellcode:
Sinngemäß schrieb stahli das ja auch schon.
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; |
AW: Funktion mit Rückgabe TStrings bzw TMemIniFile
Zitat:
(Ich hab auch mal gedacht, das sei eine gute Idee) Gruß K-H |
AW: Funktion mit Rückgabe TStrings bzw TMemIniFile
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 |
AW: Funktion mit Rückgabe TStrings bzw TMemIniFile
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:01 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