Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Inhalt TStringList in andere TStringList kopieren (https://www.delphipraxis.net/136480-inhalt-tstringlist-andere-tstringlist-kopieren.html)

Ferox 1. Jul 2009 12:20


Inhalt TStringList in andere TStringList kopieren
 
Ich habe nochmal kurz eine Verständnis Frage:

Wenn ich einer TStringList den Inhalt einer anderen TStringList zuweise, lieg ich doch hiermit total daneben oder? :|

Delphi-Quellcode:
 StringList1 := StringList2;

DeddyH 1. Jul 2009 12:28

Re: Inhalt TStringList in andere TStringList kopieren
 
Damit zeigen beide Objekte auf dieselbe Instanz, das ist sicher nicht das, was Du erreichen willst. Du könntest entweder Assign oder AddStrings verwenden, wobei ich Assign für die elegantere Variante halte.

Ferox 1. Jul 2009 12:29

Re: Inhalt TStringList in andere TStringList kopieren
 
Werds mal probieren.

Danke
Ferox

mschaefer 1. Jul 2009 12:30

Re: Inhalt TStringList in andere TStringList kopieren
 
Delphi-Quellcode:
   Stnglist_A.Text := StringList_B.Text;

DeddyH 1. Jul 2009 12:32

Re: Inhalt TStringList in andere TStringList kopieren
 
Stimmt, das ginge auch, hab ich gar nicht dran gedacht.

jaenicke 1. Jul 2009 12:46

Re: Inhalt TStringList in andere TStringList kopieren
 
Zitat:

Zitat von mschaefer
Delphi-Quellcode:
   Stnglist_A.Text := StringList_B.Text;

Der Unterschied ist, dass so nur der Inhalt kopiert wird. Dafür wird bei Assign intern wiederum AddStrings aufgerufen. Der Unterschied ist aber, dass bei Assign auch Delimiter-Einstellungen usw. kopiert werden. ;-)

mschaefer 1. Jul 2009 13:37

Re: Inhalt TStringList in andere TStringList kopieren
 
- :idea: - Der Hinweis ist gut ! // Grüße Martin

Antonov 25. Jun 2015 11:35

AW: Inhalt TStringList in andere TStringList kopieren
 
Wie sieht es denn mit dem Übergeben einer Stringlist am ende einer Funktion aus?
Ich knobel schon den ganzen Vormittag damit, einen Zeiger-Fehler zu beheben, der scheinbar durch leere Listen verursacht wird.

mein Code ist etwa so:
Delphi-Quellcode:
function TForm1.ManipulateList(ThatList: TStringlist): TStringlist;
   var
      I: Integer;
      TempString: String;
      TempStringlist: TStringlist;
begin
   TempStringlist:= Thatlist;
   [... manipulate TempStringList ...]
   Result:= Tempstringlist;
   TempstringList.free;
Der Fehler wird verursacht, weil meine MyList, die ich anderer Stelle aus dem Result kriege
Delphi-Quellcode:
ManipulatedList:= ManipulateList(MyList);
einfach verschwindet.
Das Problem liegt wohl an dem
Delphi-Quellcode:
TempStringlist.free;
, wo ich die TempStringlist lösche. Das weiß ich, weil ich durch Probieren genau hier den Grund dafür gefunden habe. Mit .Free kriege ich leere Listen und damit Fehlermeldungen vom Typ "Listenindex überschreitet Maximum", und ohne das .Free läuft alles super.
Jetzt zwei Fragen:
1)Brauche ich das Löschen mit .Free hier?
2) Wie kriege ich meine Liste als Funktionsrückgabe kopiert und nicht als Zeiger?
Methoden wie
Delphi-Quellcode:
Result.Assign(TempStringlist);
haben nicht funktioniert.

mkinzler 25. Jun 2015 11:51

AW: Inhalt TStringList in andere TStringList kopieren
 
Eine Klassenreferenz ist ein Zeiger, nach
Delphi-Quellcode:
   TempStringlist:= Thatlist;
Zeigen sowohl TempStringList wir auch ThatList auf das selbe Objekt.

Delphi-Quellcode:
function TForm1.ManipulateList(ThatList: TStrings): TStrings;
   var
      I: Integer;
      TempString: String;
      TempStringlist: TStrings;
begin
   TempStringlist:= TstringList.Create;
   TempStringList.Append(Thatlist);
   [... manipulate TempStringList ...]
   Result:= Tempstringlist;
   //TempstringList.free;

Popov 25. Jun 2015 11:59

AW: Inhalt TStringList in andere TStringList kopieren
 
Zuerst paar Punkte vorweg: wer
Delphi-Quellcode:
Try Finally
ignoriert, weil er es zu dem Zeitpunkt noch nicht braucht und es mal später reinschreiben will, der verdient all seine Probleme. Denn wer
Delphi-Quellcode:
Try Finally
direkt schreibt, sieht wo es happert. Es fällt schon alleine durch den Block auf wo noch etwas fehlt. Wer es nicht macht, den kann man nicht bedauern wenn es paar Stunden an einem Problem hängt. Das sind selbstfabrizierte Probleme.

Wenn man einmal
Delphi-Quellcode:
TempStringlist
als Variablennamen definiert hat, dann bleibt man dabei. Man schreibt es nicht mal TempStringlist, mal Tempstringlist, mal TempstringList. In der Windowswelt ist es egal, es erhöht aber die Lesbarkeit. In anderen BS ist das ein Fehler.

Ich weiß zwar nicht was du machen willst, aber ja, ein Free ist immer nötig.

Wenn du an Result (TStringList) etwas übergeben willst, wie wäre es wenn du es erst erzeugen würdest?

Was meinst du mit kopieren? Willst du tatsächlich nur die Adresse kopieren oder den Inhalt?

Ein Vorschlag:
Delphi-Quellcode:
function ManipulateList(ThatList: TStringlist): TStringlist;
var
  TempStringList: TStringlist;
begin
  TempStringList := TStringList.Create;
  try
    TempStringList.AddStrings(ThatList);

    //hier irgendwas machen

    Result := TStringList.Create;
    Result.AddStrings(TempStringlist);
  finally
    TempStringList.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  sl, slResult: TStringList;
begin
  sl := TStringList.Create;
  try
    for i := 1 to 20 do
      sl.Add(IntToStr(i));

    slResult := ManipulateList(sl);

    ShowMessage(slResult.Text);

    slResult.Free;
  finally
    sl.Free;
  end;
end;

Antonov 25. Jun 2015 12:07

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:
Result.Free;
am Ende, obwohl man die Liste kreeiert hat. Hm.

p.s. Das mit
Delphi-Quellcode:
Try Finally
habe ich erst seit kurzem gelernt und habe es in diesem Relikt von Programm noch nicht :P ... Betonung auf "noch"

mkinzler 25. Jun 2015 12:08

AW: Inhalt TStringList in andere TStringList kopieren
 
Zitat:

Lustigerweise macht man nicht Result.Free; am Ende, obwohl man die Liste kreeiert hat. Hm.
Du willst diese ja auch zurückgeben und nicht nur ein Nil

Popov 25. Jun 2015 12:27

AW: Inhalt TStringList in andere TStringList kopieren
 
Zitat:

Zitat von Antonov (Beitrag 1306576)
Das mit Result:= TStringlist.Create ist mir ziemlich neu...

Wieder was gelernt ;)

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:
slResult.Free;
). Man kann Objekte auch über mehrere Prozeduren verteilen. Nur darf man nicht vergessen es frei zu geben.

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".

haentschman 25. Jun 2015 13:24

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.
http://www.detlef-heibing.de/program...rueckgabe.html
http://forum.delphi-treff.de/index.p...-von-Funktion/

Grundsatz:
Wer erzeugt, gibt frei.
Ausnahme:
Wenn aus dem Funktionsnamen hervorgeht das ein Objekt erzeugt wird.
Delphi-Quellcode:
function CreateBlubbList: TSTringlist;
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-)

p80286 25. Jun 2015 13:32

AW: Inhalt TStringList in andere TStringList kopieren
 
Bitte lass das!
Zitat:

Zitat von haentschman (Beitrag 1306592)
Grundsatz:
Wer erzeugt, gibt frei.

Die Konsequenz hiervon ist es, die benötigte Liste als Parameter an eine Procedure zu übergeben. Aus eigener Erfahrung weiß ich, das Funktionsergebnisse manchmal anfangen ein Eigenleben zu führen.
Also nicht
Delphi-Quellcode:
Persliste:=HolePersliste;
Sondern
Delphi-Quellcode:

persliste:=TStringlist.Create;
FuellePersliste(persliste);
..
persliste.Free;
Gruß
K-H

FarAndBeyond 25. Jun 2015 13:34

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

vagtler 25. Jun 2015 13:41

AW: Inhalt TStringList in andere TStringList kopieren
 
Zitat:

Zitat von haentschman (Beitrag 1306592)
[...] Man darf nicht nur an sich denken sondern auch an den der die Funktion ggf. mal verwendet. 8-)

"Code as if the next guy to maintain your code is a homicidal maniac who knows where you live."

BUG 25. Jun 2015 13:47

AW: Inhalt TStringList in andere TStringList kopieren
 
Zitat:

Zitat von p80286 (Beitrag 1306596)
Die Konsequenz hiervon ist es, die benötigte Liste als Parameter an eine Procedure zu übergeben. Aus eigener Erfahrung weiß ich, das Funktionsergebnisse manchmal anfangen ein Eigenleben zu führen.

Ein in C++ übliches Muster ist es, die Referenz auch wieder zurückzugeben. Das macht den Datenfluss schön sichtbar.

Delphi-Quellcode:
persliste := FuellePersliste(TStringlist.Create);
..
persliste.Free;

bernau 25. Jun 2015 13:58

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:
lStringlist:=TStringlist.create;
lStringlist.sorted:=true;
lStringlist.duplicates = dupIgnore;
mache ich mir eine Funktion

Delphi-Quellcode:
function TStringlistSortedCreate:TStringlist;
begin
  result:=TStringlist.create;
  result.sorted:=true;
  result.duplicates = dupIgnore;
end;
Verwendet wird es so:

Delphi-Quellcode:
  lStringlist:=TStringlistSortedCreate;

Wie gesagt. Nur ein Kurzes Beispiel um aus drei Zeilen eine Zeile zu machen.

Finde ich ganz angenehm.

Popov 25. Jun 2015 14:23

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