![]() |
AW: Inhalt TStringList in andere TStringList kopieren
Das mit der Groß-Kleinschreibung muss mir nicht gefallen, aber Recht hast du schon. Ist wie in Physik mit den Einheiten oder Beschriftungen. Ohne sie versinkt man im Chaos.
Das mit Result:= TStringlist.Create ist mir ziemlich neu, ich habe noch nicht gesehen, dass man sie erst deklarieren muss. Andere Funktionen von mir kommen ohne diese Deklaration aus. Und ich möchte den Inhalt einer Stringliste kopieren, und nicht nur einen Zeiger oder auf sie referenzieren. Lustigerweise macht man nicht
Delphi-Quellcode:
am Ende, obwohl man die Liste kreeiert hat. Hm.
Result.Free;
p.s. Das mit
Delphi-Quellcode:
habe ich erst seit kurzem gelernt und habe es in diesem Relikt von Programm noch nicht :P ... Betonung auf "noch"
Try Finally
|
AW: Inhalt TStringList in andere TStringList kopieren
Zitat:
|
AW: Inhalt TStringList in andere TStringList kopieren
Zitat:
Wenn du nur eine 08/15 Variable zurück geben willst, wie String oder Integer, das sind keine Objekte, da musst du ja auch nicht machen. Wenn es eine String-Funktion ist, dann ist Result eben ein String. Anders sieht es aber aus wenn die Funktion ein Objekt ist. In dem Fall muss man das Objekt erst erzeugen (und den Speicher reservieren). Ohne das hast du nur eine Adresse, im Grunde ein Integer, aber keinen reservierten Speicher. Das Ergebnis ist ein Error. Das Result.Free habe ich nicht vergessen. Das findet sich in der anderen Prozedur (siehe
Delphi-Quellcode:
). Man kann Objekte auch über mehrere Prozeduren verteilen. Nur darf man nicht vergessen es frei zu geben.
slResult.Free;
Ansonsten macht AddStrings das wofür es gedacht ist: es fügt die Liste von einer TStringList an eine andere an. Man kann es aber auch zum Kopieren "missbrauchen". |
AW: Inhalt TStringList in andere TStringList kopieren
Hallöle...8-)
mal ein wenig Lesestoff zum Thema: Objektinstanzen als Rückgabewert von Functionen und warum man das nicht tun sollte. ![]() ![]() Grundsatz: Wer erzeugt, gibt frei. Ausnahme: Wenn aus dem Funktionsnamen hervorgeht das ein Objekt erzeugt wird.
Delphi-Quellcode:
Diese Funktion macht dann auch nix anderes als das Objekt zur Verfügung zu stellen. Damit wird deutlich das ich mich selbst um die Freigabe des Objektes kümmern muß. Man darf nicht nur an sich denken sondern auch an den der die Funktion ggf. mal verwendet. 8-)
function CreateBlubbList: TSTringlist;
|
AW: Inhalt TStringList in andere TStringList kopieren
Bitte lass das!
Zitat:
Also nicht
Delphi-Quellcode:
Sondern
Persliste:=HolePersliste;
Delphi-Quellcode:
Grußpersliste:=TStringlist.Create; FuellePersliste(persliste); .. persliste.Free; K-H |
AW: Inhalt TStringList in andere TStringList kopieren
Ich würde in Verbindung mit TStringlisten immer FreeAndNil verwenden.
FreeAndNil(stringlist_xyz); oder stringlist_xyz.Free; stringlist_xyz := Nil; Dann kann man auch ohne Probleme Assign benutzen wenn man's braucht... Und wann immer möglich mit Nil initialisieren... Gruß Martin |
AW: Inhalt TStringList in andere TStringList kopieren
Zitat:
|
AW: Inhalt TStringList in andere TStringList kopieren
Zitat:
Delphi-Quellcode:
persliste := FuellePersliste(TStringlist.Create);
.. persliste.Free; |
AW: Inhalt TStringList in andere TStringList kopieren
Ich sehe es so wie haenschman. Wer erzeugt gibt frei.
Allerdings gibt es auch Fälle, bei denen ich in einer Funktion ein Objekt erzeuge und dann bestimmte Parameter setzte. Anstatt eine sortierte Stringliste herkömmlich zu erzeugen:
Delphi-Quellcode:
mache ich mir eine Funktion
lStringlist:=TStringlist.create;
lStringlist.sorted:=true; lStringlist.duplicates = dupIgnore;
Delphi-Quellcode:
Verwendet wird es so:
function TStringlistSortedCreate:TStringlist;
begin result:=TStringlist.create; result.sorted:=true; result.duplicates = dupIgnore; end;
Delphi-Quellcode:
lStringlist:=TStringlistSortedCreate;
Wie gesagt. Nur ein Kurzes Beispiel um aus drei Zeilen eine Zeile zu machen. Finde ich ganz angenehm. |
AW: Inhalt TStringList in andere TStringList kopieren
Eine Funktion die als Result ein Objekt zurück gibt ist ja schön und manchmal gibt es keine andere Möglichkeit, aber das muss man immer zu gut aufpassen, nichts zu vergessen.
Ich persönlich favorisiere diese Methode. Da wird nichts verteilt:
Delphi-Quellcode:
procedure MachWas(Bmp: TBitmap);
begin Bmp.Canvas.Brush.Color := clRed; Bmp.Width := 400; Bmp.Height := 200; end; procedure TForm1.Button1Click(Sender: TObject); var Bmp: TBitmap; begin Bmp := TBitmap.Create; try MachWas(Bmp); Canvas.Draw(10, 10, Bmp); finally Bmp.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00: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