Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Wer und was ruft alles TList.Pack() auf (und warum?) (https://www.delphipraxis.net/175051-wer-und-ruft-alles-tlist-pack-auf-und-warum.html)

Der schöne Günther 27. Mai 2013 17:00

Delphi-Version: XE2

Wer und was ruft alles TList.Pack() auf (und warum?)
 
Elementares Verhalten einer elementaren Klasse. Und ich finde nichts konkretes.

Folgendes: Ich dachte, ich sei schlau und füge einer
Delphi-Quellcode:
TObjectList
ab und an auch mal ein eine Nullreferenz hinzu:
Delphi-Quellcode:
Add(nil)
. Das Anfügen scheint allerdings immer einen
Delphi-Quellcode:
Pack()
-Befehl auszuführen: Die Nullzeiger werden hier wohl herausgeworfen. Dabei waren doch gerade die Teil meiner ausgefuchsten Überlegungen! :|

Das DocWiki spricht zu
Delphi-Quellcode:
Pack()
:
Zitat:

Löscht alle nil- (Delphi) oder NULL- (C++) Elemente aus dem Array Items.

Mit Pack werden innerhalb des Arrays Items alle Elemente, die keine nil- (Delphi) bzw. keine NULL- (C++) Zeiger sind, nach vorne gebracht. Dabei wird der Wert der Eigenschaft Count auf die Zahl der Elemente verringert, die tatsächlich verwendet werden. Die Methode Pack gibt allerdings den für die nil- (Delphi) bzw. NULL- (C++) Zeiger verwendeten Speicher nicht frei. Hierzu muss die Eigenschaft Capacity auf den neuen Wert von Count gesetzt werden.
In der Hilfe vermisse ich zu
Delphi-Quellcode:
Add()
jetzt den Hinweis, dass
Delphi-Quellcode:
Pack()
überhaupt aufgerufen wird. Insgesamt auch, welche Methoden noch auf ein Pack() zurückgreifen. Und ob ich das vielleicht auch abstellen kann.

Doch Ihr werdet mir sicher weiterhelfen können. :smile2:

sx2008 27. Mai 2013 17:25

AW: Wer und was ruft alles TList.Pack() auf (und warum?)
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1216595)
Ich dachte, ich sei schlau und füge einer
Delphi-Quellcode:
TObjectList
ab und an auch mal ein eine Nullreferenz hinzu

Schlauer wäre es das Null-Objekt-Pattern einzusetzen.

Nehmen wir mal an, bei den Objekte handle es sich um Spielfiguren, die sich selbst zeichnen können.
Delphi-Quellcode:
TGameObj = class(TObject)
public
  procedure Paint2Canvas(canvas:TCanvas);virtual; abstract;
end;

TNullGameObj = class(TGameObj)
public
  procedure Paint2Canvas(canvas:TCanvas);override;
end;

procedure TNullGameObj.Paint2Canvas(canvas:TCanvas);
begin
  // nichts tun
end;
Anstatt nil werden jetzt bei Bedarf Objekte der Klasse TNullGameObj eingefügt.

Das hat den Vorteil dass man später keine Fallunterscheidung benötigt und Null-Objekte genau gleich wie alle anderen Objekte behandeln kann.

Uwe Raabe 27. Mai 2013 17:26

AW: Wer und was ruft alles TList.Pack() auf (und warum?)
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1216595)
In der Hilfe vermisse ich zu
Delphi-Quellcode:
Add()
jetzt den Hinweis, dass
Delphi-Quellcode:
Pack()
überhaupt aufgerufen wird.

Wird es auch gar nicht.

Edit: wir reden doch hier über System.Contnrs.TObjectList?

Der schöne Günther 27. Mai 2013 17:55

AW: Wer und was ruft alles TList.Pack() auf (und warum?)
 
Liste der Anhänge anzeigen (Anzahl: 4)
Nein, die Objektliste ist parametrisiert und stammt somit aus
Delphi-Quellcode:
System.Generics.Collections
. Macht das einen Unterschied?

Noch einmal ein ganz einfaches Beispiel:
  1. Liste anlegen:
    Delphi-Quellcode:
    meineListe := TObjectList<TMeinObjekt>.Create(True);
  2. meineListe.Add(nil);
  3. Ablauf im Debugger für Add(nil) anschauen

Ich habe mal als vier Bilder angehängt, was man im Aufrufstack bzw. im Quelltext-Editor sieht. Ich verstehe es nicht.


Edit:
Bei Niklaus Wirths Lendenschurz, kann es sein, dass Pack() tatsächlich nie aufgerufen wird? Ich habe mich mit dem Delphi-Debugger noch nicht richtig anfreunden können, er scheint oft eine Zeile zu weit unten zu markieren. Wenn man auf das letzte Bild schaut - Meint der Debugger in Wirklichkeit die Notify-Methode? Das würde vollkommen Sinn machen.

Uwe Raabe 27. Mai 2013 18:34

AW: Wer und was ruft alles TList.Pack() auf (und warum?)
 
Prüf doch einfach, ob nach dem Add der Count auf 1 steht.

Der schöne Günther 27. Mai 2013 20:46

AW: Wer und was ruft alles TList.Pack() auf (und warum?)
 
Ja, es ist alles im grünen Bereich :thumb:

Ich bin nur wieder aufgeschreckt, da mir der Debugger wieder "eine Funktion zu weit nach unten" gerutscht ist und behauptet hat, er würde gerade in
Delphi-Quellcode:
meineListe.Pack()
stecken, statt
Delphi-Quellcode:
meineListe.Notify()
.

Delphi-Quellcode:
Pack()
wurde tatsächlich nie angefasst, so wie es sein sollte.

Vielen Dank für die Teilnahme :)

Und ja, eine eigene Nullinstanz wäre sicher besser, ich war bislang nur zu faul :stupid:


Und für diese komische Debugger-Sache mache ich bei Gelegenheit (und Notwendigkeit) noch einmal ein neues Thema auf, das bringt mich wirklich durcheinander...


Alle Zeitangaben in WEZ +2. Es ist jetzt 03:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf