AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Warum TStrings erstellen mit TStringList.Create?
Thema durchsuchen
Ansicht
Themen-Optionen

Warum TStrings erstellen mit TStringList.Create?

Ein Thema von Guido Eisenbeis · begonnen am 2. Jan 2010 · letzter Beitrag vom 5. Jan 2010
Antwort Antwort
Seite 3 von 3     123   
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#21

Re: Warum TStrings erstellen mit TStringList.Create?

  Alt 3. Jan 2010, 16:19
Zitat von mkinzler:
Wenn man den Typ einer Variablen nun auf TStrings festlegt, kann man hier Referenzen auf Objekte verschiedenster Ableitungen/Implementierungen ablegen; TStringList limitiert auf die eine Implementierungen ( und Nachfahren dieser)
Jetzt bin ich mir unsicher. Ich denke, ich stehe wirklich auf dem Schlauch.

Ok, nochmal zum Verständnis:

Wenn ich eine Variable mit der Basisklasse deklariere, bleiben mir Möglichkeiten offen, die mit eine Nachfolgerklasse schon festgelegt sind. Soweit klar. Meine Fragestellung beinhaltet aber auch, dass ich von vornherein vorhabe, die Variable mit TStringList zu instanzieren. Ist das geschehen, (und das ist ja hier das Thema) kann ich die Kasse TString doch nicht mehr nutzen!?

Oder meinst du vielleicht, dass man die Variable leert (TStringList.Free) und dann eine andere (Nachfolger-)Klasse instanziert?

Bin ich jetzt auf dem richtigen Weg, oder liege ich jetzt ganz daneben?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Warum TStrings erstellen mit TStringList.Create?

  Alt 3. Jan 2010, 16:22
Wie gesagt, wenn du Objekte von TStringList erzeugen/ablegen willst ist auch TStringList als Typ ok
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: Warum TStrings erstellen mit TStringList.Create?

  Alt 3. Jan 2010, 16:25
Zitat von Guido Eisenbeis:
Ist das geschehen, (und das ist ja hier das Thema) kann ich die Kasse TString doch nicht mehr nutzen!?
doch

Wenn die Klasse als TStrings deklariert ist, hast du aber über die Variable nur direkten Zugriff auf die Anteile der TStrings-Schnittstelle.
Sortieren kann man dann also nicht mehr.


Handhabe es einfach so:

- Variablendeklarationen so hoch wie möglich, denn dann hast du direkten Zugriff auf alle Möglichkeiten der instantitierten Klasse
> also TStringList

- Parameterdeklarationen so klein wie möglich, dann hast du die größte Kompatibilität zu anderen Ableitungen
> also TStrings
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#24

Re: Warum TStrings erstellen mit TStringList.Create?

  Alt 3. Jan 2010, 16:32
Wow! Danke für die Antworten! Bitte um Geduld, das muss ich jetzt erst verdauen und testen. Melde mich dann wieder.

Guido.

Edit: Gemeint sind alle Antworten ab Posting #20 von sirius. Will damit sagen, dass ich keinen vergessen habe, sondern am abarbeiten bin!
Edit 2: Hab tatsächlich noch welche übersehen, muss also heißen: Alle Antworten ab Posting #17 von mkinzler.
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#25

Re: Warum TStrings erstellen mit TStringList.Create?

  Alt 3. Jan 2010, 17:53
Mann oh Mann, ganz schön viel Zeugs! Ich versuche das mal möglichst kurz zusammen zu fassen. (Wird wohl trozdem ein bisschen länger )

Zitat von sirius:
Wenn man direkt folgendes macht:
Delphi-Quellcode:
var x:TStringList;
begin
  x:=TStringlist.create;
 
  ...
end;
und hier x nur als Tstringlist verwendet und ..., dann ist es völlig sinnlos TStrings zu nehmen und in der Hilfe auch unsauber erklärt.
...
Mit TStrings würdest du dir Möglichkeiten verbauen, die vorhanden sind, ...
Nach allem was ich jetzt so durchblicke, ist das in der Hilfe schon dicht an einem Bug, oder? Denn wie sirius und weiter unten auch himitsu (ist das Frank?) schreiben, sind dann die Möglichkeiten von TStringList nicht mehr vorhanden! (Hab ich selbstverständlich getestet.)

Zitat von sirius:
Wo nimmt man nun TStrings?
Möglichkeit 1 (Wurde schon mehrfach hier erwähnt ):
-> Parameter
Du hast eine Methode, welche als Parameter TStrings bekommt
Ist klar, ist aber ein anderes Thema.

Zitat von sirius:
Möglichkeit 2
-> Unterschiedliche Instanzierung von TStrings
Du bist dir bei der Deklaration noch nicht sicher welche Variante du von TStrings nimmst (das entscheidet sich quasi erst zur Laufzeit)
Auch klar, auch ein anderes Thema. In diesem Thema geht es darum, dass TStringList gebraucht wird. Und die Deklaration in der Hilfe als TStrings deshalb auch als Bug anzusehen ist, denn man kann ja die Methoden und Eigenschaften von TStringList nicht nutzen (wie z. B. Sort).

Hier kristallisiert sich jetzt auch eine andere Formulierung der Ausgangsfrage herraus. Denn mit zunehmenden Informationen scheint es mir immer unsinniger, eine TString-Variable mit TStringList.Create zu instanzieren. In einem Beispiel von sirius verzweigt er zwar in einer Abfrage nach TStringlist.create,

Delphi-Quellcode:
var x:TStrings;
begin
  if irgendetwas=irgendetwasanders then
    x:=TStringlist.create // <-- hier
  else
    x:=Memo1.lines;
  end;
aber wirklich Sinn macht es doch nicht, da nur die Eigenschaften und Methoden von TStrings verwendet werden können. Es kann an der obigen Stelle doch mit was-weiß-ich-was instanziert werden, es bleibt doch immer nur TStrings verfügbar. Oder sehe ich das falsch?

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 ...
Soweit ich das jetzt verstanden und getestet habe, ist es egal, als was man "TempList" deklariert oder instanziert hat. Es ist bei Weitergeben nur wichtig, welchen Datentyp der Parameter der Weitergabe-Routine hat. Ist zum Beispiel in der Routine der Parameter mit TStringList deklariert, meine Variable vorher mit TStrings deklariert und mit TStringList.Create instanziert, wirft der Compiler Fehler, wegen inkompatiblen Typen.

Zitat von himitsu:
... kannst du sie auch direkt als TStringList deklarieren und hast dann auch direkten Zugriff auf spezielle Erweiterungen der TStringList.
Das finde ich einen wichtigen Punkt, der in der Hilfe fehlt! Denn wenn man nun das hier alles nicht weiß, in seinem Programm eine Variable mit TStrings deklariert und mit TStringList instanziert, wundert man sich vielleicht, warum dann z. B. Methoden von TStringList nicht verfügbar sind.

Zitat von mkinzler:
TStrings ist eine abstrakte Klasse, hierin wird ein (Soll-)Verhalten festgelegt
TStringList ist eine Klasse, die das vorgegebene Verhalten implementiert.
...
Wenn man den Typ einer Variablen nun auf TStrings festlegt, kann man hier Referenzen auf Objekte verschiedenster Ableitungen/Implementierungen ablegen; TStringList limitiert auf die eine Implementierungen ( und Nachfahren dieser)
Ist klar (und war es auch schon vorher, ... naja, vielleicht nicht so deutlich wie jetzt ). Das bestätigt doch das was ich von vornherein vermutet habe: Wenn man TStringList haben will, ist eine Deklaration mit TStrings falsch = Fehler in der Delphi-Hilfe.

Zitat von himitsu:
Wenn die Klasse als TStrings deklariert ist, hast du aber über die Variable nur direkten Zugriff auf die Anteile der TStrings-Schnittstelle.
Sortieren kann man dann also nicht mehr.
Bestätigt das ebenfalls.

Zitat von himitsu:
- Parameterdeklarationen so klein wie möglich, dann hast du die größte Kompatibilität zu anderen Ableitungen
> also TStrings
Dem stimme ich zu.

Zitat von himitsu:
- Variablendeklarationen so hoch wie möglich, denn dann hast du direkten Zugriff auf alle Möglichkeiten der instantitierten Klasse
> also TStringList
Das sehe ich genauso. Damit sehe ich die Ausgangsfrage als beantwortet an: Wenn man TStringList mit seinen Eigenschaften und Methoden haben will (und nach meiner Meinung ist das der Fall, wenn man mit TStringList.Create instanziert), dann ist es falsch mit TStrings zu deklarieren.

Puh, geschafft. Vielen Dank an alle für die Antworten! Falls ich das Resümee (schreibt man wirklich so) falsch erstellt habe, freue ich mich über Berichtigung. Falls es richtig ist (könnte fast eine if-Abfrage formulieren *smile*) freue ich mich über Bestätigung.

Guido.

PS: Ich hoffe, ich hab da nicht allzuviele Fehler drin, es war jetzt doch ziemlich viel aufzuarbeiten.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Warum TStrings erstellen mit TStringList.Create?

  Alt 3. Jan 2010, 18:08
Zitat:
auch himitsu (ist das Frank?)
Ja

Zitat:
eine Deklaration mit TStrings falsch = Fehler in der Delphi-Hilfe.
Ich würde das nicht als Fehler sehen.

Zitat:
Es kann an der obigen Stelle doch mit was-weiß-ich-was instanziert werden, es bleibt doch immer nur TStrings verfügbar. Oder sehe ich das falsch?
Jein. das Objekt( die Instanz) ist schon vom entsprechenden Typ und kennt auch alle Attribute/Methoden/Properties.

Delphi-Quellcode:
var
  sl, sl2: TStrings;
begin
  sl := TStrings.Create;
  sl2 := TStringList.Create;
  (sl2 as TStringList).Sort; //Funktioniert;
  (sl as TStringList).Sort; //Funktioniert nicht, da die Instanz die Methode nicht kennt
Markus Kinzler
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#27

Re: Warum TStrings erstellen mit TStringList.Create?

  Alt 5. Jan 2010, 12:49
Zitat von mkinzler:
Zitat:
eine Deklaration mit TStrings falsch = Fehler in der Delphi-Hilfe.
Ich würde das nicht als Fehler sehen.
Nun ja, das ist dann eine Frage der Definition. Ich verstehe schon, was du meinst. Dennoch frage ich mich, warum das hier in der Hilfe gemacht wird. Mir ist außer TStringList kein anderer Fall bekannt, wo in der Hilfe mit einer Basisklasse deklariert, und einer Nachfahrenklasse instanziert wird. Ich lasse mich aber gerne eines Besseren belehren, wenn jemand ein anderes Beispiel in der Hilfe weiß, wo das vorkommt. Denn genauso könnte man, getreu der hier genannten Argumente, dieses Vorgehen bei vielen anderen Klassen anwenden. Das ist mir aber aus der Delphi-Hilfe bei keiner andren Klasse bekannt.

Damit will ich sagen, dass mir trotz der hier erklärten Möglichkeiten (die ich ja auch verstehe) nicht einleuchten will, warum man (gerade) bei TStringList-Instanzierung mit der Basisklasse deklarieren sollte. Ich sehe zwar die hier genannten Möglichkeiten, die sich dadurch ergeben, aber nicht die Notwendigkeit dieser Vorgehensweise. Anders ausgedrückt: Es macht soviel Sinn, wie den Mount Everest zu besteigen. Man kann das tun, ist vielleicht toll, muss man aber nicht.

Weshalb ich von Fehler spreche ist, dass ich es einfach "richtiger" finde, eine Instanz von TStringList auch mit TStringList zu deklarieren. Spätestens nach all den Postings hier finde ich auch keinen Nachteil, der dadurch entstehen würde, und der nicht mit irgendeinem TypeCast zu beheben wäre.


Zitat von mkinzler:
Zitat:
Es kann an der obigen Stelle doch mit was-weiß-ich-was instanziert werden, es bleibt doch immer nur TStrings verfügbar. Oder sehe ich das falsch?
Jein. das Objekt( die Instanz) ist schon vom entsprechenden Typ und kennt auch alle Attribute/Methoden/Properties.

Delphi-Quellcode:
var
  sl, sl2: TStrings;
begin
  sl := TStrings.Create;
  sl2 := TStringList.Create;
  (sl2 as TStringList).Sort; //Funktioniert;
  (sl as TStringList).Sort; //Funktioniert nicht, da die Instanz die Methode nicht kennt
Auch für diesen Hinweis vielen Dank! Hat mich allerdings auch verwirrt. Ich dachte: "Wo fängt das an, wo hört das auf?" Auch der alte Spruch von Toyota fiel mir ein: "Nichts ist un-möööööö-glich, To-yooo-taaa!" Denn irgendwie geht ja (fast) alles.


Zum Schluss sei noch erwähnt:
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
Ich halte das in einem gewissen Sinn für möglich. Ich habe in der Hilfe von Delphi 7 nachgesehen und dort steht 1:1 genau das gleiche Beispiel drin. Es beschleicht mich das Gefühl, das da mal irgendwer beim Erstellen der Hilfe vielleicht ungewollt mit TString deklariert und mir TStringList instanziert hat, und das wurde immer und immer wieder übernommen.

Kann jemand mal in einer neueren Delphi-Version nachsehen, ob es dort auch 1:1 übernommen wurde? Es ist zu finden unter dem Thema "Eine neue Stringliste erstellen", Abschnit "Kurzlebige Stringlisten".

Ansonsten: Vielen Dank für all die Postings!

Guido.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 21:10 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