AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TStringList

Ein Thema von Peter-Pascal · begonnen am 21. Jul 2011 · letzter Beitrag vom 24. Jul 2011
Antwort Antwort
Seite 1 von 2  1 2      
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
197 Beiträge
 
Delphi 11 Alexandria
 
#1

TStringList

  Alt 21. Jul 2011, 17:46
Hallo,

bislang war ich der Ansicht, wenn ich einen Zeiger einem andern Zeiger zuweise, dass beide aufs gleiche zeigen und egal durch welchen Zeiger ich was ich verändere, sollte auch der andere Zeiger drauf zeigen. Gilt das auch, wenn ich TListBox.items (ist TString) eine TStringList zuweise?

Ist es überhaupt grundsätzlich denkbar, dass ich statt TObjectList, TStringList nehme und dort Objecte dranhänge, die über die Strings in einer Listbox angezeigt werden und je nach dem welche angeklickt wird, das zugehörige Object bearbeite. Ich füge die Objecte mit addObject() ein.

Die Listbox ist in einem Dialog und beim öffnen wird jedesmal TStringList der Listbox.Items zugewiesen.

Vielleicht muss ich es ja zurückschreiben beim Schließen des Dialogs, aber da meckert Delphi rum, TStrings kann nicht TStringList zugewiesen werden. (Typumwandlung klappt auch nicht) Nur dachte ich immer das sollte unnötig sein.

Statt Typumwandlung muss ich assign nehmen: TStringList.assign(TListBox.Items)

Kann das sein, das TListBox die komplette TStringList neu anlegt?

Gruß Peter
Peter Niemeier

Geändert von Peter-Pascal (21. Jul 2011 um 18:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#2

AW: TStringList

  Alt 21. Jul 2011, 19:51
Nein, das ist nicht das Selbe.

Die StringListe in TListBox, TMemo und Co. sind jeweils virtuelle Listen, die keinen Inhalt haben, sondern nur die Zugriffe auf die entsprechenden Komponenten umleiten.

Assigned kopiert hierbei auch nur den Inhalt der TSringList in die Komponente.

Du kannst dir aber einen Zeiger auf die interne StringListe mehrken.


Delphi-Quellcode:
var Kopie: TStrings;

Kopie := ListBox.Items;
Und nun hast du zwei Objektzeiger auf die selbe Liste,
also jeweils den selben Inhalt
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
197 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TStringList

  Alt 22. Jul 2011, 11:03
Danke Himitsu,

also ich kann der TListBox keinen Zeiger zuweisen, sondern nur den von TListBox.Items einem anderen TString, wenn ich zwei Zeiger haben möchte, die aufs gleiche zeigen. Allerdings ist das dann TStrings und im Manual heißt es, nur die Nachfolger wie TSTringList funktionieren richtig.

Dann noch eine Frage, (eigentlich sind es noch hundert, aber ...)

Delphi-Quellcode:
var
  List : TStrings;
begin
List := TListBox.Items;
So wie Du es auch geschrieben hast. Wenn TListBox.free aufgerufen wird, ist dann der Zeiger von List auch weg? Oder zeigt der dann ins Nirwana, muss ich den auf nil setzen, denn nochmal List.Free kann ja nicht funktionieren, oder?

Danke

Gruß Peter
Peter Niemeier
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#4

AW: TStringList

  Alt 22. Jul 2011, 11:42
TStrings ist der Basistyp und den nimmt man bei solchen Property, damit sie mit möglichst vielen Variablen/Parametern Kompatibel sind.

In ListBox.Items ist ein TListBoxStrings, was natürlich auch ein Nachfahre von TStrings ist.

Beim Erstellen muß/kann man nur einen Nachfahren von TStrings verwenden, aber worin dann diese Instanz gespeichert wird, ist vollkommen egal, solange diese Variable diesem Typen oder einem Vorfahren entspricht.
Einer Variable/Property von TStrings ist es also egal, ob darin eine TStringList oder etwas anderes steckt, solange es mindestens die Schnittstellen von TStrings bietet.


Und ja, wenn die ListBox freigegeben wird, dann gibt sie auch ihre interne Stringliste frei.
Andere Variblen, welche auf diese Liste zeigen, werden nicht verändert und zeigen ins Nirvana.


PS: Ändere doch bitte noch den Titel dieses Threads (Beitrag #1 editieren), so daß er etwas aussagekräftiger ist.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
197 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: TStringList

  Alt 22. Jul 2011, 13:48
Nochmals Danke,

so muss ich der Variabel List dann NIL zuweisen, oder?

In dem Zusammenhang eine andere Frage: ich gebe oft Zeiger als result wert einer Funktion weiter. Ja, das wurde schon mehrmals besprochen, habe ich aber nicht richig verstanden. Bleiben wir in diesem Beispiel eine function gibt einen TStingList Zeiger weiter.

Delphi-Quellcode:
var
  Zeiger : TListString;
begin
Zeiger := TStringList.create;
//Ich fülle die Liste
result:= Zeiger;
Zeiger := nil //???
end;
Ist das so praktikabel? Ich mache das halt oft in einer Funktion, weil ich die Liste auch gleich bearbeiten kann, da wo ich den besten und geschützen Zugriff auf die Felder habe eines Objectes.

Gruß Peter
ps.: Kannst Du mir einen Titel nennen? Ich weiß nicht was Dir wichtig ist, dann ändere ich es
Peter Niemeier
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: TStringList

  Alt 22. Jul 2011, 16:06
Da Zeiger eine lokale Variable ist, ist das Setzen auf Nil überflüssig.
Markus Kinzler
  Mit Zitat antworten Zitat
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
197 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: TStringList

  Alt 22. Jul 2011, 19:13
danke
Peter Niemeier
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: TStringList

  Alt 22. Jul 2011, 21:57
Die StringListe in TListBox, TMemo und Co. sind jeweils virtuelle Listen,
Dazu noch eine kleine Anmerkung:
TListBox.Lines können auch Objekte enthalten, TMemo.Lines und auch TRichEdit.Lines nicht (zumindest bis D2006).
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: TStringList

  Alt 23. Jul 2011, 10:07
Was daran liegt, dass bei den beiden Komponenten die Werte direkt vom Windowscontrol verwaltet werden.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.356 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: TStringList

  Alt 23. Jul 2011, 10:17
Richtig und das gilt auch bei XE noch. Denn TMemoStrings implementiert PutObject nicht, daher verweist das auf das leere TStrings.PutObject.

Es würde aber auch wenig Sinn machen, sowas zu versuchen. Was sollte passieren, wenn man in eine Zeile einen Zeilenumbruch einfügt usw.?
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 01:27 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