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 TStringList.Capacity Zuweisung? (https://www.delphipraxis.net/172346-tstringlist-capacity-zuweisung.html)

PeterPanino 28. Dez 2012 01:04

Delphi-Version: XE2

TStringList.Capacity Zuweisung?
 
Wieso ist in TStringList SetCapacity eigentlich nicht definiert? Gibt es einen speziellen Grund dafür?
Delphi-Quellcode:
procedure TStrings.SetCapacity(NewCapacity: Integer);
begin
  // do nothing - descendents may optionally implement this method
end;

Olli73 28. Dez 2012 01:59

AW: TStringList.Capacity Zuweisung?
 
Meinst du jetzt TStringList oder TStrings?

TStringList (als Nachfahre von TStrings) hat es nämlich implementiert.

Popov 28. Dez 2012 02:19

AW: TStringList.Capacity Zuweisung?
 
Du bist da wohl klein wenig durcheinander gekommen. Bei TStringList steht in SetCapacity etwas (zumindest in D7). Bei TStrings nicht. Das ist der Vorfahr von TStringList.

Delphi-Quellcode:
procedure TStrings.SetCapacity(NewCapacity: Integer);
begin
  // do nothing - descendents may optionally implement this method
end;

procedure TStringList.SetCapacity(NewCapacity: Integer);
begin
  ReallocMem(FList, NewCapacity * SizeOf(TStringItem));
  FCapacity := NewCapacity;
end;

DeddyH 28. Dez 2012 10:55

AW: TStringList.Capacity Zuweisung?
 
Es steht doch im Kommentar :gruebel:. Die Alternative wäre gewesen, die Methode abstract zu deklarieren, aber dann muss jede abgeleitete Klasse sie implementieren. So kann jede Ableitung selbst entscheiden, ob sie das tut oder eben nicht.

Morphie 28. Dez 2012 11:54

AW: TStringList.Capacity Zuweisung?
 
Zitat:

Zitat von DeddyH (Beitrag 1196920)
Die Alternative wäre gewesen, die Methode abstract zu deklarieren, aber dann muss jede abgeleitete Klasse sie implementieren. So kann jede Ableitung selbst entscheiden, ob sie das tut oder eben nicht.

Ich bin ja immer dafür, in einer Klasse (auch in einer Basisklasse) nur das zu deklarieren, was auch Sinn macht.
Wenn in der Basisklasse eine Methode keinen Sinn macht, sondern nur in einer speziellen geerbten Klasse, dann würde ich es in der Basisklasse einfach gar nicht deklarieren.

Das wäre so, als wenn ich in einer Klasse TKraftfahrzeug die Methode "Schwimmen" anbiete, obwohl das nur in der Klasse TAmphibienfahrzeug Sinn macht. Alle Kraftfahrzeuge haben jetzt die Methode Schwimmen, doch bei den meisten funktioniert diese eben nicht... Irgendwer kommt dann auf die Idee, mit einem TMotorrad in einen See zu fahren, weil es ja die Methode Schwimmen besitzt. (übertriebenes Beispiel :-D)

Man könnte sogar so weit gehen, und noch eine zweite Klasse dazwischen hängen, falls es SetCapacity in mehreren Nachfahren geben soll...
TStrings > TGrowStrings > TStringList, TOtherStrings,...

Ob es da irgendeine Eigenheit bei ObjectPascal gibt, damit das keinen Sinn machen könnte, weiß ich nicht, aber in strengen OOP-Sprachen würde ich das so machen...

Bummi 28. Dez 2012 12:01

AW: TStringList.Capacity Zuweisung?
 
@Morphie

Ich sehe das genau umgekehrt, ein paar zusätzliche virtuelle Methoden und vor allem mehr Methoden virtuell statt statisch implementiert würde einem oft viel "gefrickel" ersparen.
Das von Dir gewählte (etwas extreme) Beispiel würde ich auch nicht implementiert haben wollen.

DeddyH 28. Dez 2012 12:04

AW: TStringList.Capacity Zuweisung?
 
Dir ist aber schon aufgefallen, dass es sich um den Setter der Property Capacity handelt? Da kannst Du wenn überhaupt höchstens die ganze Property in der Basisklasse weglassen, zumindest fällt mir auf die Schnelle keine saubere Alternative ein. Irgendwer bei (wahrscheinlich noch) Borland wird sich dabei schon etwas gedacht haben.

Morphie 28. Dez 2012 12:07

AW: TStringList.Capacity Zuweisung?
 
Zitat:

Zitat von DeddyH (Beitrag 1196936)
Dir ist aber schon aufgefallen, dass es sich um den Setter der Property Capacity handelt?

Jo, ist mir bewusst... wenn ich von SetCapacity schreibe, meine ich natürlich die gesamte Property, die in der Basisklasse aber sonst nirgends genutzt wird, daher für mich überflüssig...

Bernhard Geyer 28. Dez 2012 12:09

AW: TStringList.Capacity Zuweisung?
 
Ich denke hier ist es nicht sinnvoll ein capacity-property schon in der Basisklasse einzuführen. Diese Property macht dort keinen Sinn da sowas zu sehr an die Speicherorganisation von TStringList (Dumme Pointerlist statt performanterer Tree oder Hashmap) angelehnt ist.

Willst du mit Variablen vom Typ TStrings arbeiten aber wenn es nötig ist die Capacity (vor-)belegen wäre ein setzen mit den RTTI-Funktionen möglich. Haben uns selbst SetIntProperty-Funktionen gebastelt um nur bei Klassen mit entsprechenden Properties diese zu setzen und bei fehlen einfach nix zu machen.

PeterPanino 29. Dez 2012 16:49

AW: TStringList.Capacity Zuweisung?
 
Der Grund meiner Frage war folgender: Wenn man in einer StringList die Capacity z.B. auf den Wert 10 einstellt, sollten beim StringList.LoadFromFile maximal 10 Zeilen gelesen werden (auch wenn die Datei etwa 100 Zeilen hat). Wäre eine solche Vorgangsweise möglich? Oder müsste man dazu eher die Methode LoadFromFile überschreiben?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:40 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