AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TObjectList.Free erzeugt AV

Ein Thema von SvB · begonnen am 6. Feb 2015 · letzter Beitrag vom 9. Feb 2015
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
SvB

Registriert seit: 21. Okt 2004
Ort: Eckenroth
426 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

TObjectList.Free erzeugt AV

  Alt 6. Feb 2015, 17:01
Delphi-Version: XE7
Ich stehe gerade etwas auf dem Schlauch und würde mich über eine Tipp freuen.

Ich habe eine TObjectList mit OwnObjects = True. In der Liste sind mehrere Objekte angefügt.
Jetzt hab ich das Problem, dass ein Objekt an anderer Stelle schon frei gegeben wurde und
ObjectList.Free eine Exception auslöst, da das eine Objekt nicht mehr existiert.

Jetzt möchte ich vor dem ObjectList.Free prüfen, ob die Objekte in der Liste noch gültig sind und ungültige aus der Liste entfernen.
Ich hab nur gerade ein Brett vorm Kopf, wie ich das abfrage. Wer kann helfen?
Sven

Alle sagen, das geht nicht. Da kam einer, der wusste das nicht und hat es gemacht.
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#2

AW: TObjectList.Free erzeugt AV

  Alt 6. Feb 2015, 17:42
Wenn Du eine TObjectList hast, bei der die Liste der Eigentümer der Objekte ist, dann solltest Du auch das Freigeben der Objekte der Liste überlassen und die nicht selbst irgendwo freigeben ohne es der Liste mitzuteilen.

Der Schlüssel zum Erfolg liegt bei:

TObjectList.Remove(AObject: TObject);
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: TObjectList.Free erzeugt AV

  Alt 6. Feb 2015, 17:47
Das ist doch einfach: Es geht schlicht und ergreifend nicht.

Du hast die Verwaltung der Lifetime der Instanz an die Liste gegeben und nun schmeisst du es irgendwo aus dem Speicher. Das macht man nicht.

Das ist so, als ob du mir etwas schenkst und dann mir wieder wegnimmst. Das gibt auch Mecker (mindestens).

Nur das es bei Referenzen eben schlecht mit dem Kontrollieren aussieht, ob da an der Referenz noch etwas liegt. Denn der Speicher ist noch da (du klaust ja keinen RAM-Riegel aus dem System) und da kann auch noch irgendwas stehen. Es gibt also keine zuverlässige Möglichkeit zu prüfen ob unter der Referenz noch eine gültige Instanz zu finden ist.

Mach es anders und alles wird gut.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
SvB

Registriert seit: 21. Okt 2004
Ort: Eckenroth
426 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: TObjectList.Free erzeugt AV

  Alt 6. Feb 2015, 18:05
OK, hatte gehofft, das man das prüfen kann. Dann mach ich anders, ist auch kein Problem.
Danke Euch für die Infos.
Sven

Alle sagen, das geht nicht. Da kam einer, der wusste das nicht und hat es gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.332 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: TObjectList.Free erzeugt AV

  Alt 6. Feb 2015, 18:25
Wenn du anderswo ein entsprechendes eigenes Objekt zum Freigeben benötigst, kannst du ja eine Kopie erstellen. Alles andere wäre nicht sauber.

Eine mögliche Alternative wären Interfaces.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: TObjectList.Free erzeugt AV

  Alt 6. Feb 2015, 19:10
Wenn die Objekte nachfahren von TComponent sind, dann kann man deren Messagesystem benutzen und das Objekt sich selber aus der Liste löschen lassen, wenn es freigegeben wird.
Quasi eine TComponentList mit AutoRemove.

Ab XE wäre das auch für alle anderen Nicht-TComponents relativ leicht möglich und davor bissl schwerer, aber ist nicht wirklich schön, sowas umzusetzen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
SvB

Registriert seit: 21. Okt 2004
Ort: Eckenroth
426 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

AW: TObjectList.Free erzeugt AV

  Alt 6. Feb 2015, 19:56
Ich glaube ich habe mich da etwas verrannt. Nach weiteren Überlegungen passen meine Idee und mein Ansatz dann doch nicht so ganz.

Ich arbeite schon mit einem TInterfacedObject, in dem die TObjectList enthalten ist.
In einem Formular erzeuge ich im OnCreate noch andere benötigte Formulare, deren Referenz ich in der TObjectList ablege, damit die auf jeden Fall aufgeräumt werden, falls es mal krachen sollte.
Die Unterformulare habe ich auf Position = poOwnerFormCenter eingestellt, und wollte die dann schön zentriert über dem Hauptformular anzeigen lassen. Das funktioniert nur, wenn die Unterformulare mit Owner = Hauptformular erzeugt werden.
Wenn ich dann das Hauptformular schließe, dann werden durch den Owner auch die Unterformulare aufgeräumt und danach wird Interfaced ObjectList automatisch aufgeräumt und es gibt die Exception.

Das zentrieren lasse ich jetzt, ich glaube, das war so ein Hirngespinst in das ich mich hineingesteigert habe und nicht wirklich brauche.
Ich glaube, ich werde die Unterformulare auch erst dann erzeugen, wenn ich sie brauche. Sie werden nicht immer alle benötigt und sind nicht sehr umfangreich. Das Erzeugen wird nach Bedarf dann auch schnell gehen.
Sven

Alle sagen, das geht nicht. Da kam einer, der wusste das nicht und hat es gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: TObjectList.Free erzeugt AV

  Alt 6. Feb 2015, 20:03
Warum sagst du denn nicht gleich, dass es sich um Nachfahren von TComponent handelt, die du in der Liste speichern möchtest.

Gerade die senden dir nach Anmeldung eine Nachricht, wenn die sich aus dem Speicher entfernen.
Delphi-Referenz durchsuchenTComponent.FreeNotification
Delphi-Referenz durchsuchenTComponent.RemoveFreeNotification
Fliegt also so eine Instanz weg, ohne dass du die aus der Liste nimmst, dann wirf die einfach aus der Liste raus
Delphi-Quellcode:
CompList.OwnsObjects := False;
try
  CompList.Remove( AComponent );
finally
  CompList.OwnsObjects := True;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#9

AW: TObjectList.Free erzeugt AV

  Alt 6. Feb 2015, 20:31
Delphi-Quellcode:
CompList.OwnsObjects := False;
try
  CompList.Remove( AComponent );
finally
  CompList.OwnsObjects := True;
end;
Wenn Du "CompList.Extract( AComponent )" nimmst, dann brauchst Du .OwnObjects nicht zu verändern und auch den "try finally" - Block kannst Du Dir sparen.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: TObjectList.Free erzeugt AV

  Alt 6. Feb 2015, 20:37
Delphi-Quellcode:
CompList.OwnsObjects := False;
try
  CompList.Remove( AComponent );
finally
  CompList.OwnsObjects := True;
end;
Wenn Du "CompList.Extract( AComponent )" nimmst, dann brauchst Du .OwnObjects nicht zu verändern und auch den "try finally" - Block kannst Du Dir sparen.
Stimmt, kam mir doch gleich so komisch vor
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 09:20 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