Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Lsitbox Einträge in Stringlist übertragen (https://www.delphipraxis.net/100219-lsitbox-eintraege-stringlist-uebertragen.html)

P4CM4N 24. Sep 2007 19:30


Lsitbox Einträge in Stringlist übertragen
 
Hi, ich hab mal ne Frage.
In meinem Programm lade ich per Button meine Listbox. Das sind Dateipfade. Die möchte ich jetzt in eine Stringlist übergeben. Nur wie macht man das?
danke für eure Hilfe im vorraus

Mfg PACMAN

s-off 24. Sep 2007 19:39

Re: Lsitbox Einträge in Stringlist übertragen
 
Hallo,

z.B. so:
Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender: TObject);
Var
   lstData: TStringlist;
Begin
   lstData := TStringlist.Create;
   Try
      lstData.AddStrings(ListBox1.Items);
      //Mache etwas mit der Stringliste
   Finally
      FreeAndNil(lstData);
   End;
End;
Edit: dummen Fehler korrigiert

P4CM4N 24. Sep 2007 19:43

Re: Lsitbox Einträge in Stringlist übertragen
 
Alles klar, Problem gelöst
danke

Muetze1 25. Sep 2007 09:08

Re: Lsitbox Einträge in Stringlist übertragen
 
Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender: TObject);
Var
   lstData: TStringlist;
Begin
   lstData := TStringlist.Create;
   Try
      lstData.Assign(ListBox1.Items);
      //Mache etwas mit der Stringliste
   Finally
      lstData.free;
   End;
End;

s-off 25. Sep 2007 09:16

Re: Lsitbox Einträge in Stringlist übertragen
 
Wenn die Items keine Objektreferenzen haben, ist es aber doch egal, ob ich 'Assign', oder 'AddStrings' nehme, oder hat das noch andere Auswirkungen?

Und wo ist der Vorteil von 'Free' gegenüber 'FreeAndNil'? Ich frage deshalb, weil Du hier selber auf 'FreeAndNil' verweist.

Tyrael Y. 25. Sep 2007 09:24

Re: Lsitbox Einträge in Stringlist übertragen
 
Zitat:

Zitat von s-off
Und wo ist der Vorteil von 'Free' gegenüber 'FreeAndNil'?

Fast gar nicht.
Eine Regel, die man im Kopf behalten kann.



- Nutze ich die Objektvariable nur einmal reicht ein Free.

Delphi-Quellcode:
procedure DoSomething();
var LObject: TSomeType;
begin
  LObject := TSomeType.Create;
  try
  ...
  ...
  finally
    LObject.Free;
  end;
end;

- Nutze ich die Objectvariable mehrfach ist es sicherer, sie nach der Benutzung auf NIL zu setzen

Delphi-Quellcode:
procedure DoSomething();
var LObject: TSomeType;
    i: Integer;
begin
 
  for i := 0 to 1000 do
  begin
    LObject := TSomeType.Create;
    try
    ...
    ...
    finally
      FreeAndNil(LObject);
    end;
  end;

  LObject := TSomeType.Create;
  try
  ...
  ...
  finally
    LObject.Free;
  end;

end;

s-off 25. Sep 2007 09:28

Re: Lsitbox Einträge in Stringlist übertragen
 
Danke für die Erläuterung,

da ich ein Gewohnheitstier bin, kann ich dann ja bei FreeAndNil bleiben; vorausgesetzt, ich kann Dein
Zitat:

Fast gar nicht.
als 'gar nicht' interpretieren :wink:

Weisst Du auch etwas zu 'Assign' <> 'AddStrings' zu sagen?
Sehe da ausser den von mir genannten keinen weiteren Vorteil.

Tyrael Y. 25. Sep 2007 09:38

Re: Lsitbox Einträge in Stringlist übertragen
 
Zitat:

Zitat von s-off
Danke für die Erläuterung,

da ich ein Gewohnheitstier bin, kann ich dann ja bei FreeAndNil bleiben; vorausgesetzt, ich kann Dein
Zitat:

Fast gar nicht.
als 'gar nicht' interpretieren :wink:

Immer FreeAndNil benutzen ist völlig ok.
Der andere Fall immer Free benutzen kann Probleme bringen.

Zitat:

Zitat von s-off
Weisst Du auch etwas zu 'Assign' <> 'AddStrings' zu sagen?
Sehe da ausser den von mir genannten keinen weiteren Vorteil.

[/quote]

Aus der Hilfe:

Assign:

procedure Assign(Source: TPersistent); override;

Beschreibung

Mit der Methode Assign wird einem TStrings-Objekt der Wert eines anderen Objekts zugewiesen. Ist das Quell-Objekt ebenfalls vom Typ TStrings, enthalten beide Objekte anschließend die gleiche Liste. Falls den String-Werten der Quelle Objekte zugeordnet sind, werden auch diese übernommen, wenn das Zielobjekt diese Eigenschaft unterstützt.

Wenn das mit dem Parameter Source bezeichnete Quellobjekt nicht vom Typ TStrings ist, übernimmt die geerbte Assign-Methode den Listenwert von einem beliebigen anderen Objekt, das in seiner AssignTo-Methode die Klasse TStrings unterstützt.


AddStrings:

procedure AddStrings(Strings: TStrings); virtual;

Beschreibung

Mit der Methode AddStrings lassen sich die String-Einträge eines anderen TStrings-Objekts zu einer String-Liste hinzufügen. Wenn beide TStrings-Objekte Strings mit zugeordneten Objekten unterstützen, werden mit den Strings auch die zugehörigen Objekt-Referenzen übertragen.


Wie du siehst ist es schon ein Unterschied, aber in deinem Fall jetzt ist es unerheblich und liefert dasselbe Resultat.

s-off 25. Sep 2007 10:00

Re: Lsitbox Einträge in Stringlist übertragen
 
Zitat:

Zitat von Tyrael Y.
Wie du siehst ist es schon ein Unterschied, aber in deinem Fall jetzt ist es unerheblich und liefert dasselbe Resultat.

Ähm, ja, diesen Unterschied hatte ich ja bereits genannt :wink:
Mich interessierte nur, ob es ausser diesem, noch einen weiteren Unterschied gibt, der in der Hilfe nicht erläutert ist.

Muetze1 25. Sep 2007 22:50

Re: Lsitbox Einträge in Stringlist übertragen
 
Zitat:

Zitat von s-off
Mich interessierte nur, ob es ausser diesem, noch einen weiteren Unterschied gibt, der in der Hilfe nicht erläutert ist.

Die Frage ist nach der Übertragung der kompletten Einträge formuliert worden. AddStrings() würde nur hinzufügen. Du hast in deiner Lösung eine frisch erstellte, lokale TStringList-Instanz benutzt. Nun weiss ich aber nicht, wo und wie der Threadersteller deinen Code einsetzt. Wenn er anhand seiner Frage eine direkte Zuordnung erhalten wollte und statt dessen hinten angehängte Einträge bekommt, dann ist seine Frage falsch beantwortet worden. Von daher habe ich nur die entsprechende Antwort zu dem Thread-Thema gegeben.

Und um deine Frage nochmal direkt zu beantworten: AddStrings() wird auch von Assign() benutzt:
Delphi-Quellcode:
procedure TStrings.Assign(Source: TPersistent);
begin
  if Source is TStrings then
  begin
    BeginUpdate;
    try
      Clear;
      AddStrings(TStrings(Source));
    finally
      EndUpdate;
    end;
    Exit;
  end;
  inherited Assign(Source);
end;
Nur sorgt Assign() dafür, dass die Einträge wirklich 1:1 übertragen werden und somit auch die alten Einträge entsprechend entfernt werden vor der Zuordnung.

Und zu deiner Free/FreeAndNil() Frage: Die grundlegenden Dinge wurden genannt. In deinem Beispielcode ist die StringList Instanz eine lokale Variable die nicht weiter verwendet wird. Von daher braucht es keinen zusätzlichen Overhead der NIL Setzung und zum anderen nicht eines weiteren Aufrufs. FreeAndNil() ist hier die zusätzliche Rolle Klebeband um das Leck, welches schon nach der ersten Dichtungsmasse nicht mehr vorhanden war - und dem Schildchen am Rohr: "Hier war einmal ein Leck"


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:04 Uhr.
Seite 1 von 2  1 2      

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