Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Warum TStrings erstellen mit TStringList.Create? (https://www.delphipraxis.net/145480-warum-tstrings-erstellen-mit-tstringlist-create.html)

Guido Eisenbeis 2. Jan 2010 14:02


Warum TStrings erstellen mit TStringList.Create?
 
Auszug aus der Turbo-Delphi-Hilfe, Thema "Eine neue Stringliste erstellen":

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var TempList: TStrings; { Liste deklarieren }
begin
  TempList := TStringList.Create; { Listenobjekt erzeugen }
  try   { Stringliste verwenden }
  ...
So Leute, heut bin ich wieder am Grübeln. :gruebel: Immer wieder begegnen mir Codes, in denen Variablen als TStrings deklariert, aber mit TStringList.Create erstellt werden!? In dem obigen Beispiel wird, außer in dem Code-Schnipsel, auch noch im Beschreibungstext explizit darauf hingewiesen:

Code:
So erstellen Sie langlebige Stringlisten:
 
1. Fügen Sie in der Unit-Datei für das Hauptformular Ihrer Anwendung ein Feld des Typs TStrings in die Formulardeklaration ein.

2. ...
Gibt es dafür einen Grund, dass TStringList-en als TStrings deklariert werden? Spricht etwas dagegen, eine TStringList auch mit TStringList zu dekalrieren? Was ist besser? :spin2:

Guido.

Edit: Mir ist bekannt, dass TStrings die Basisklasse, und TStringList davon abgeleitet ist. :smile2:

mkinzler 2. Jan 2010 14:04

Re: Warum TStrings erstellen mit TStringList.Create?
 
TStrings ist die abstrakte Basisklasse von TStringList
Du kannst den Typ natürlich auch alsn TStringList deklariere

himitsu 2. Jan 2010 14:12

Re: Warum TStrings erstellen mit TStringList.Create?
 
Oder besser gesagt: TStrings ist eine abstrakte Basisklasse, welche eine gemeinsame Schnittstelle bietet und selber keine Speicherverwaltung hat.

TStringList ist ein Nachfahre davon ... es gibt noch andere Nachfahren (wie sich z.B. eine hinter .Lines eines TMemo versteckt)



Wenn du selber die TempList nur als TStringList verwendest und sie nicht weitergibst, dann kannst du sie auch direkt als TStringList deklarieren und hast dann auch direkten Zugriff auf spezielle Erweiterungen der TStringList.

s.h.a.r.k 2. Jan 2010 14:16

Re: Warum TStrings erstellen mit TStringList.Create?
 
Ich meine neulich mal etwas bzgl. (Abwärts-)Kompatibilitätsgründen (der Delphi-IDEs) gelesen zu haben, finde es aber leider nicht mehr :gruebel:

Guido Eisenbeis 2. Jan 2010 14:22

Re: Warum TStrings erstellen mit TStringList.Create?
 
Zitat:

Zitat von mkinzler
TStrings ist die abstrakte Basisklasse von TStringList

Hallo Markus. Als hätte ich's geahnt! :mrgreen: Siehe mein "Edit" oben. Deine Antwort kam gerade, als ich den Senden-Button geklickt hab. :hi:


Zitat:

Zitat von mkinzler
Du kannst den Typ natürlich auch alsn TStringList deklariere

Ok, das ist ja schon mal was! Und wie sieht es mit dem oben beschriebenen mischen aus? Warum trifft man das immer wieder mal an?


Zitat:

Zitat von himitsu
Wenn du selber die TempList nur als TStringList verwendest und sie nicht weitergibst, dann kannst du sie auch direkt als TStringList deklarieren und hast dann auch direkten Zugriff auf spezielle Erweiterungen der TStringList.

Hm, ... :gruebel: das ist mir noch nicht ganz klar. Ich verstehe das jetzt mal so, dass man evtl. keine TStringList übergeben kann, wenn TStrings verlangt wird, oder umgekehrt. Aber: Beißt sich da nicht die Katze selbst in den Schwanz, denn wenn man eine als TStrings deklarierte Variable aber beim Instanzieren mit TStringList erstellt, dann ist doch da der Typ festgelegt. Dann kann man das doch auch nicht mehr als TStrings übergeben, oder?


Zitat:

Zitat von s.h.a.r.k
Ich meine neulich mal etwas bzgl. (Abwärts-)Kompatibilitätsgründen (der Delphi-IDEs) gelesen zu haben, finde es aber leider nicht mehr :gruebel:

War mein erster Gedanke, deshalb hab ich mich auch entschlossen zu posten.

Guido.

himitsu 2. Jan 2010 14:23

Re: Warum TStrings erstellen mit TStringList.Create?
 
Zitat:

Zitat von s.h.a.r.k
Ich meine neulich mal etwas bzgl. (Abwärts-)Kompatibilitätsgründen (der Delphi-IDEs) gelesen zu haben, finde es aber leider nicht mehr :gruebel:

Nee nee,

wenn du z.B. diese Prozedur erstellst,
Delphi-Quellcode:
procedure MyProc(List: TStrings);
dann kannst du ihr alle Nachfahren von Strings übergeben.
also z.B. TStringList oder TMemoStrings (die interne virtuelle Stringliste des Memos, mit Umleitung zur Memokomponente von Windows)

Wenn man jetzt sowas macht,
Delphi-Quellcode:
procedure MyProc(List: TStringList);
dann kann man dieser Funktionen nur noch eine TStringList und deren Nachfahren übergeben,
aber z.B. kein Memo.Lines mehr.

Zitat:

Hm, ... Grübelnd... das ist mir noch nicht ganz klar.
TStringList hat ein paar zusätzliche Funktionen, an welche du mit der Variable als TStrings natürlich nur über eine Typumwandlung rankommst.

Guido Eisenbeis 2. Jan 2010 14:48

Re: Warum TStrings erstellen mit TStringList.Create?
 
Zitat:

Zitat von himitsu
Wenn man jetzt sowas macht,
Delphi-Quellcode:
procedure MyProc(List: TStringList);
dann kann man dieser Funktionen nur noch eine TStringList und deren Nachfahren übergeben,
aber z.B. kein Memo.Lines mehr.

So langsam kommt Klarheit in die Sache! Man kann also einen kleinen Eimer (Nachfahre) in einen großen Eimer (Basisklasse) stecken. :mrgreen:

Das hab ich auch gerade getestet. Das eine (TStrings übergeben, wenn TStringList verlangt wird) wird verweigert, während das umgekehrte funktioniert.


Zitat:

Zitat von himitsu
Zitat:

Hm, ... Grübelnd... das ist mir noch nicht ganz klar.
TStringList hat ein paar zusätzliche Funktionen, an welche du mit der Variable als TStrings natürlich nur über eine Typumwandlung rankommst.

Hoppla, gut zu wissen! Also zum Beispiel per TypeCast: TStringList(List).Sort ?

Guido Eisenbeis 2. Jan 2010 14:56

Re: Warum TStrings erstellen mit TStringList.Create?
 
Ok, bleibt immer noch die Ausgangs-Frage: Warum eine Variable als TStrings deklarieren, wenn mit TStringList instanziert wird?

himitsu 2. Jan 2010 14:56

Re: Warum TStrings erstellen mit TStringList.Create?
 
Zitat:

Zitat von Guido Eisenbeis
So langsam kommt Klarheit in die Sache! Man kann also einen kleinen Eimer (Nachfahre) in einen großen Eimer (Basisklasse) stecken. :mrgreen:

Das hab ich auch gerade getestet. Das eine (TStrings übergeben, wenn TStringList verlangt wird) wird verweigert, während das umgekehrte funktioniert.

Jupp, denn TStringList kann alles, was auch TStrings kann (und noch etwas mehr),
darum kann man es auch an alles übergeben, welches TStrings "verlangt"

TString kann nicht alles, welches TStringList kann, darum kann man es auch nicht an etwas übergeben,
welches "mindestens" das verlangt, was auch eine TStringList kann.

thkerkmann 2. Jan 2010 15:13

Re: Warum TStrings erstellen mit TStringList.Create?
 
Dann ist ja wohl TStringlist der größere Eimer :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:58 Uhr.
Seite 1 von 3  1 23      

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