AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi TObjectlist und der Seitenwechsel
Thema durchsuchen
Ansicht
Themen-Optionen

TObjectlist und der Seitenwechsel

Ein Thema von Delbor · begonnen am 28. Mai 2019 · letzter Beitrag vom 31. Mai 2019
Antwort Antwort
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.460 Beiträge
 
Delphi 12 Athens
 
#1

AW: TObjectlist und der Seitenwechsel

  Alt 28. Mai 2019, 14:52
Moin...
zeige mal die Deklaration von FPdfList. Wenn es wirklich eine TObjectlist ist, dann sollte die Liste, wenn OwnsObjects = True ist, die Objekte sebst freigeben. Du mußt nur List.Delete oder List.Clear machen.
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.196 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TObjectlist und der Seitenwechsel

  Alt 28. Mai 2019, 15:36
Hi zusammen
So wird die Objectliste erzeugt:
Delphi-Quellcode:
constructor TRogersPdfFrame.Create(AOwner: TComponent);
begin
  inherited;
  FReportlist := TStringlist.Create;
  FPdfList := TDataObjectList<TPDFView>.Create();
  FPdfList.OwnsObjects := False;
end;
OwnsObjects hab ich hier absichtlich auf False gesetzt, da sich die enthaltenen Objektebei jedem Dokumentenwechsel zerstören sollen. Sie werden neu erzeugt, wenn ein neues PDF-Dokument angezeigt werden soll.
Deren Deklaration ist eigentlich nichts spektakuläres:
Delphi-Quellcode:
  TRogersPdfFrame = class(TFrame)
    ScrollBox1: TScrollBox;
    ScrollBox2: TScrollBox;
    Splitter1: TSplitter;
    Pdf1: TPdf;
  private
    { Private-Deklarationen }
    FPDFView: TPDFView;
    FReportList: TStringlist;
    FPdfList: TDataObjectList<TPDFView>; // <T: class>
    FPdfFileName : String;
    procedure WriteReportFile;
    procedure SetPdfFileName(Value: String);
    procedure Zoom;
    procedure Zoom10Percent(PdfPageWidth: Double; PdfPageHeight: Double; PageWidth: Double; PageHeight: Double);

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.518 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TObjectlist und der Seitenwechsel

  Alt 28. Mai 2019, 15:43
Dann sollte das von hoika helfen
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.196 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: TObjectlist und der Seitenwechsel

  Alt 28. Mai 2019, 16:02
Hi zusamen

Moin...
zeige mal die Deklaration von FPdfList. Wenn es wirklich eine TObjectlist ist, dann sollte die Liste, wenn OwnsObjects = True ist, die Objekte sebst freigeben. Du mußt nur List.Delete oder List.Clear machen.
Delete oder Clear entfernen nur die Objekte aus der Liste, zerstören sie aber nicht, zumindest, wen ich das Emba-Wicki richtig verstanden habe.

Das hier könnte ich möglicherweise aber überlesen haben:
Zitat:
Wenn die Liste zum Zeitpunkt des Entfernens des Eintragsobjekt aus der Liste dessen Eigentümer ist, wird das Eintragsobjekt freigegeben.
Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: TObjectlist und der Seitenwechsel

  Alt 28. Mai 2019, 18:23
Hallo,
hast Du meinen Tip mit dem Umdrehen der Schleife ausprobiert?
Heiko
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
727 Beiträge
 
Delphi 12 Athens
 
#6

AW: TObjectlist und der Seitenwechsel

  Alt 28. Mai 2019, 21:15
Delete oder Clear entfernen nur die Objekte aus der Liste, zerstören sie aber nicht, zumindest, wen ich das Emba-Wicki richtig verstanden habe.
Das hast Du nicht ganz richtig verstanden. Das Verhalten der Liste wird von der OwnsObjects-Eigenschaft gesteuert. Wenn die True ist zerstört die Liste die enthaltenen Objekte, wenn sie aus der Liste entfernt werden, also genau das, was Du haben willst. Was Du im Zitat oben geschrieben hast gilt, wenn OwnsObjects False ist.
Peter Below
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.196 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: TObjectlist und der Seitenwechsel

  Alt 29. Mai 2019, 06:58
Hi peterbelow
Delete oder Clear entfernen nur die Objekte aus der Liste, zerstören sie aber nicht, zumindest, wen ich das Emba-Wicki richtig verstanden habe.
Das hast Du nicht ganz richtig verstanden. Das Verhalten der Liste wird von der OwnsObjects-Eigenschaft gesteuert. Wenn die True ist zerstört die Liste die enthaltenen Objekte, wenn sie aus der Liste entfernt werden, also genau das, was Du haben willst. Was Du im Zitat oben geschrieben hast gilt, wenn OwnsObjects False ist.
Ich hab das bisher immer so verstanden, dass TObjectList bei OwnsObject := true; seine Items nur zerstört, wenn sie selbst zerstört wird. Man lernt nie aus!

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: TObjectlist und der Seitenwechsel

  Alt 29. Mai 2019, 07:06
Hallo,
Zitat:
wenn die True ist zerstört die Liste die enthaltenen Objekte, wenn sie aus der Liste entfernt werde
das macht ja keinen Sinn.

Das würde ja Speicherlecks erzeugen.


OwnsObject = mir gehört das Objekt.

Mache ich ein Delete(0), erwarte ich

1. Das Objekt wird freigegeben
2. der Listeneintrag wird freigegeben (die Liste wird also um 1 kleiner)


Aber: Gut das wir darüber geredet haben
Heiko
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
727 Beiträge
 
Delphi 12 Athens
 
#9

AW: TObjectlist und der Seitenwechsel

  Alt 29. Mai 2019, 12:04
Hallo,
Zitat:
wenn die True ist zerstört die Liste die enthaltenen Objekte, wenn sie aus der Liste entfernt werde
das macht ja keinen Sinn.

Das würde ja Speicherlecks erzeugen.
Wie kommst Du denn da drauf? Wenn man eine TObjectlist mit OwnsObject = true erzeugt will man damit erreichen, dass die Liste die Lebensdauer der hinzugefügten Objekte verwaltet und man sich nicht mehr selbst darum kümmern muss. Das ist wie das Owner-Konzept bei TComponent & Cie.
Wenn man die Liste leert, zerstört oder einen einzelnen Eintrag mit Delete entfernt ruft die Liste für die betroffenen Objekte Free auf, also kein Leck. Wenn man eines der Objekte in der Liste selbst zerstört bleibt in der Liste eine ungültige Referenz zurück, die später meist zu einer Exception führt. Wenn man ein Objekt zurückhaben will muss man die Extract-Methode verwenden und nicht Delete oder Remove; damit übernimmt man dann auch die Verwaltung der Lebensdauer wieder.
Peter Below
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.196 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: TObjectlist und der Seitenwechsel

  Alt 29. Mai 2019, 19:01
Hi zusammen
Ich behaupte mal: Hoika hat recht. Das Embarcadero Wiki zu TObjectlist.Ownsobject:
Zitat:
Ermittelt oder setzt den Eigentümer des Objekts.

OwnsObjects ermittelt oder legt fest, ob die Liste Eigentümer der Objekte in der Liste ist. Wenn die Liste zum Zeitpunkt des Entfernens des Eintragsobjekts aus der Liste Eigentümer der Einträge ist, wird das Eintragsobjekt freigegeben. Create initialisiert diese Eigenschaft.
Es stellt sich jetzt halt die Frage, was der fett formatierte Satz nun wirklich heisst. Tatsache ist, dass bei einem Delete eines bestimmten Eintrags dieser aus der Liste entfernt wird, und zwar unabhängig davon, ob OwnsObjects nun False oder True ist. Nun suggeriert aber der bewusste Satz, dass bei True das Eintragsobjekt freigegeben wird, also ein "Eintragsobject.Free" durchgeführt wird.
Technisch wäre dies wohl möglich, wenn die Objectlist alle damit zusammenhängenden Propertys und deren Felder aktualisieren würde. Nebst dem Count-Property würde dies wohl auch Capacity betreffen. Würde... Aber:
An dieser Stelle wollte ich eigentlich die Stelle aus dem Embarcadero Wiki zitieren, die ich heute morgen gelesen hatte, jetzt aber nicht mehr finden kann. Da wurde darauf hingewiesen, dass man das Ereignis OnNotify verwenden solle, um das Objekt nicht nur aus der Liste zu entfernen, sondern wirklich freizugeben/zu zerstören. Gefunden habe ich stattdessen:

Mein Fazit: Beide, hoika sowohl peterbelow haben recht - die nicht generische Liste verlangt einfach etwas mehr Handarbeit.
Wie das nun wirklich ist, kann nur ein Studium / durchsteppen durch die Sourcen geben.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:50 Uhr.
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