Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi TStringList (https://www.delphipraxis.net/161806-tstringlist.html)

Peter-Pascal 21. Jul 2011 17:46

TStringList
 
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

himitsu 21. Jul 2011 19:51

AW: TStringList
 
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 :zwinker:

Peter-Pascal 22. Jul 2011 11:03

AW: TStringList
 
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

himitsu 22. Jul 2011 11:42

AW: TStringList
 
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.

Peter-Pascal 22. Jul 2011 13:48

AW: TStringList
 
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

mkinzler 22. Jul 2011 16:06

AW: TStringList
 
Da Zeiger eine lokale Variable ist, ist das Setzen auf Nil überflüssig.

Peter-Pascal 22. Jul 2011 19:13

AW: TStringList
 
danke

Christian Seehase 22. Jul 2011 21:57

AW: TStringList
 
Zitat:

Zitat von himitsu (Beitrag 1112922)
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).

mkinzler 23. Jul 2011 10:07

AW: TStringList
 
Was daran liegt, dass bei den beiden Komponenten die Werte direkt vom Windowscontrol verwaltet werden.

jaenicke 23. Jul 2011 10:17

AW: TStringList
 
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.?


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:26 Uhr.
Seite 1 von 2  1 2      

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