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
Delbor

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

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
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.667 Beiträge
 
Delphi 12 Athens
 
#2

AW: TObjectlist und der Seitenwechsel

  Alt 29. Mai 2019, 20:16
Wenn ein Eintrag aus der Liste entfernt wird, wird intern ein Notify-Event gefeuert, das muss dich aber gar nicht interessieren. Ist die Liste Eigentümer ihrer enthaltenen Objekte, wird das zu entfernende Objekt auch freigegeben.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
peterbelow

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

AW: TObjectlist und der Seitenwechsel

  Alt 30. Mai 2019, 12:51
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.
Und genau das passiert auch, sowohl in TObjectlist als auch bei TObjectlist<T>. Dieser Notification-Mechanismus wird von TObjectlist vom Elter TList geerbt und überschrieben, um das Verhalten bei OwnsObjects = true zu implementieren. Da muss der Programmierer nichts mehr nachflicken, das ist alles schon geregelt.

OnNotify muss man sich nur antun, wenn man TList oder TList<T> verwendet und die Lebensdauer der Items in der Liste nicht anderswo verwaltet.
Peter Below
  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 30. Mai 2019, 16:18
Hi zusammen

Danke für eure Antworten! In Bezug auf die generische Liste steht das ja so in der Help - ich war mir nur nicht sicher, ob ich das richtig verstanden habe. Inzwischen habe ich die entsprechende Unit in meinem Projekt geöffnet und einen Haltepunkt gesetzt, so quasi für die letzte Bestätigung. Bei der nichtgenerischen Liste werde ich dies allerdings nicht tun, sondern einfach glauben, dass es so ist, da ich die ich eh nie verwenden werde.
Inzwischen hat sich aber ein neues "Problem" ergeben. In der folgenden Prozedur lösche ich alle TPdfViews aus der Liste, wenn ich eine neue PDF öffne:
Delphi-Quellcode:
procedure TRogersPdfFrame.DeletePdfListObjects;
  var i: Integer;
begin
  i := 0;
  HomeOfficerMainForm.EdiBeforeDelete.Text := 'BeforeDelete: '+ IntToStr(FPdfList.Count);
  while i <= FPdfList.Count-1 do
  begin
    if FPdfList.Items[i].Active then
    begin
      FPdfList.Items[i].Active := False;
      FPdfList.Delete(i);
    end;
    inc(i);
  end;
  HomeOfficerMainForm.EdiAfterDelete.Text := 'AfterDelete : '+ IntToStr(FPdfList.Count);
end;
Die Anweisungen an die Edits 'EdiBeforeDelete' und 'EdiAfterDelete' dienten mir zur Kontrolle, da ich mir erst nicht sicher war, dass auch alle TPdfViews(die Items der Liste) gelöscht werden. Der Wert von 'EdiBeforeDelete' ist dabei immer 1, unabhängig davon, wie gross FPdfList.Count tatsächlich ist. Der andere Wert ist 0.
Ich hab das gerade nochmal getestet. Dabei ist mir Delphi eiingefroren, und ich musste das Ding mit dem Taskmanager abschiessen. Nachdem ich das erste mal ein neues PDF geöffnet hatte:
16_52_30-RogersPdfFrameUnit.jpg
Anschliessend versuchte ich nochmal, eine neue PDF zu öffnen - abschuss. *
In der Listbox links eben dem Pdf trage ich jedesmal, wenn ich ein neues PDFView erzeuge, dessen Namen ein. Die ist also korrekt.

Kurz, bevor ich Delphi abschiessen musste, viel mir auf, dass das Edit 'EdiBeforeDelete' den Wert 3 anzeigte...

Gruss
Delbor

PS: Das mit dem Abschuss hielt ich erst für ziemlich 'mysteriös', habmir dann jedoch die drei nächsthöheren PDFs mal angesehen. Die sind zwischen knappen 6000 und guten 30'000 kb gross. Ich hätte Delphi also wohl nicht abschiesssen müssen, sonder nur noch etwas Geduld haben müssen. Oder in Zukunft begindoc und enddoc einbauen...
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (30. Mai 2019 um 16:50 Uhr) Grund: PS angefügt
  Mit Zitat antworten Zitat
peterbelow

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

AW: TObjectlist und der Seitenwechsel

  Alt 31. Mai 2019, 12:20
Hi zusammen

Danke für eure Antworten! In Bezug auf die generische Liste steht das ja so in der Help - ich war mir nur nicht sicher, ob ich das richtig verstanden habe. Inzwischen habe ich die entsprechende Unit in meinem Projekt geöffnet und einen Haltepunkt gesetzt, so quasi für die letzte Bestätigung. Bei der nichtgenerischen Liste werde ich dies allerdings nicht tun, sondern einfach glauben, dass es so ist, da ich die ich eh nie verwenden werde.
Inzwischen hat sich aber ein neues "Problem" ergeben. In der folgenden Prozedur lösche ich alle TPdfViews aus der Liste, wenn ich eine neue PDF öffne:
Wenn Du in einer Schleife etwas aus einer Liste löscht sollte die Schleife immer vom Ende der Liste rückwärts laufen. Schließlich ändert der Löschvorgang nicht nur die Zahl der Einträge in der Liste sondern auch die Indices aller Einträge nach dem gelöschten.

Ersetze die While-Schleife einfach durch

Delphi-Quellcode:
 for i := FPdfList.Count-1 downto 0
  begin
    if FPdfList.Items[i].Active then
    begin
      FPdfList.Items[i].Active := False;
      FPdfList.Delete(i);
    end;
  end;
anfangen und am Ende Dec(i) anstelle von Inc(i) verwenden. Oh, un der
Peter Below
  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 08:19 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