AGB  ·  Datenschutz  ·  Impressum  







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

Form close - EINvalidPointer

Ein Thema von Int3g3r · begonnen am 10. Apr 2019 · letzter Beitrag vom 10. Apr 2019
Antwort Antwort
Seite 1 von 3  1 23      
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#1

Form close - EINvalidPointer

  Alt 10. Apr 2019, 09:14
Guten Tag,

Ich verwende das erste mal eine TObjectList. Leider bekomme ich nun beim close; des Forms eine exception: EInvalidPointer 'Ungültige zeigeroperation'.

Delphi-Quellcode:
// unit System;
procedure TObject.FreeInstance;
begin
  CleanupInstance;
  _FreeMem(Pointer(Self)); // <- Hier wird die exception ausgelöst.
end;
Im Anhang befindet sich der Source.
close; <- Zeile 292

Programmbeschreibung:

Anhand einer Mitarbeiter Tabelle erstelle ich Frames. Für jeden Mitarbeiter erzeuge ich ein Frame, dies füge ich einer TObjectList(PersonList) hinzu. Der Owner bei der TObjectList ist auf true.

In der Mitarbeiter Tabelle habe ich Aktive und nicht Aktive Mitarbeiter. Wenn alle Mitarbeiter auf Aktiv sind kommt kein Pointer-Fehler. Sobald ich aber ein Mitarbeiter deaktiviere kommt beim close der Pointer-Fehler. Ob ich das Free am ende mache oder nicht hat keinen einfluss auf die Exception

Ich habe nun mehrmals die TObjectList mit Breaktpoints beobachtet. Ich habe die korrekte Anzahl an Objekten in dieser Liste. Daher verstehe ich nicht warum ich ein Pointerfehler bekomme.

Mfg Int3g3r
Angehängte Dateien
Dateityp: pas form_Ansicht.pas (8,7 KB, 12x aufgerufen)
  Mit Zitat antworten Zitat
hoika

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

AW: Form close - EINvalidPointer

  Alt 10. Apr 2019, 09:20
Hallo,
setz erst mal das Owner auf False.

Wenn du ein Frame erzeugst, wem gehört der Frame, dem erzeugenden Form?
Wenn ja, wir ja der Frame versucht, 2mal freizugegeben, einmal in der ObjectList und dann im Form selber.

Ich würde das Form als Owner des Frames setzen und der ObjectList, wie oben geschrieben, den owner wegnehmen (False).
Heiko
  Mit Zitat antworten Zitat
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Form close - EINvalidPointer

  Alt 10. Apr 2019, 09:29
Hallo,
setz erst mal das Owner auf False.

Wenn du ein Frame erzeugst, wem gehört der Frame, dem erzeugenden Form?
Wenn ja, wir ja der Frame versucht, 2mal freizugegeben, einmal in der ObjectList und dann im Form selber.

Ich würde das Form als Owner des Frames setzen und der ObjectList, wie oben geschrieben, den owner wegnehmen (False).
Hmm... Also das Ziel bei einer TObjectList ist doch das die Items automatisch freigegeben werden wenn der owner auf true ist. Somit muss ich nicht jedes Objekt manuell in einer Schleife freigeben.

Ich habe es trotzdem mal versucht und den owner auf false gesetzt. Dies hat an der situation nichts geändert.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Form close - EINvalidPointer

  Alt 10. Apr 2019, 09:32
.. was passiert denn, wenn eine Mitarbeiter deaktiviert wird?
Entfernst Du dann das Frame aus der Liste - oder beendest Du das Frame nur?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Form close - EINvalidPointer

  Alt 10. Apr 2019, 09:36
.. was passiert denn, wenn eine Mitarbeiter deaktiviert wird?
Entfernst Du dann das Frame aus der Liste - oder beendest Du das Frame nur?

Grüße
Klaus
Nein, ich werde die komplette TObjecList freigeben und neu aufbauen, somit auch alle Frames freigeben/neu erzeugen. Wenn ein Mitarbeiter deaktiviert wurde wird dieser bei der SQL abfrage nun nicht mehr in der Tabelle angezeigt. Anhand der anzahl der Tabelleneinträge werden mir die anzahl Frames erzeugt.

Code:
   qryMitarbeiter.Close;
   qryMitarbeiter.SQL.Text := 'select * from mitarbeiter where mitarbeiter.aktiv = 1';
   qryMitarbeiter.Open;

Geändert von Int3g3r (10. Apr 2019 um 09:43 Uhr)
  Mit Zitat antworten Zitat
hoika

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

AW: Form close - EINvalidPointer

  Alt 10. Apr 2019, 10:16
Hallo,
Zitat:
ich werde die komplette TObjecList freigeben
werde = Zukunft
oder machst du das bereits?
Heiko

Geändert von hoika (10. Apr 2019 um 10:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

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

AW: Form close - EINvalidPointer

  Alt 10. Apr 2019, 10:37
Moin...
Zitat:
Also das Ziel bei einer TObjectList ist doch das die Items automatisch freigegeben werden wenn der owner auf true ist.
Diese Aussage ist falsch.
Zum Verständnis...Entweder die Objektliste oder der Owner gibt den Frame frei.
Delphi-Quellcode:
// 1. Variante
FrmPerson := TFrmPerson.Create(nil); // Owner hier auf nil
PersonList := TObjectList<TfrmPerson>.Create(True); // bleibt

// 2. Variante
FrmPerson := TFrmPerson.Create(self); // Owner bleibt
PersonList := TObjectList<TfrmPerson>.Create(False); // heißt, daß die Liste ihre Objekte nicht selbst freigibt
Delphi-Quellcode:
PersonList := TObjectList<TfrmPerson>.Create(True);
PersonList.Free;
Erzeugen und freigeben der Liste bitte im FormCreate/FormDestroy. Da sind sie besser aufgehoben.

eine Bitte:
Keine globalen Variablen.
Delphi-Quellcode:
var
  PersonList : TObjectList<TfrmPerson>;
besser:
Delphi-Quellcode:
TfrmAnsicht = class(TForm)
private
 FPersonList : TObjectList<TfrmPerson>;

Geändert von haentschman (10. Apr 2019 um 10:47 Uhr)
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
701 Beiträge
 
Delphi 12 Athens
 
#8

AW: Form close - EINvalidPointer

  Alt 10. Apr 2019, 10:55
Guten Tag,

Ich verwende das erste mal eine TObjectList. Leider bekomme ich nun beim close; des Forms eine exception: EInvalidPointer 'Ungültige zeigeroperation'.


Programmbeschreibung:

Anhand einer Mitarbeiter Tabelle erstelle ich Frames. Für jeden Mitarbeiter erzeuge ich ein Frame, dies füge ich einer TObjectList(PersonList) hinzu. Der Owner bei der TObjectList ist auf true.
Wenn man TComponent-Abkömmlinge in einer TObjectlist mit OwnsObjects = true ablegt muss man sich sehr genau überlegen, wie denn nun die Verwaltung der Lebensdauer sein soll. TComponents haben normalerweise einen Owner, der automatisch alle Komponenten zerstört, wenn er selbst zerstört wird. Bei TControls ist das noch verschärft, da die auch noch einen Parent haben müssen, damit sie angezeigt werden. Der Parent ist ein Psychopath per excellance: er ermordet alle seine Kinder bevor er selbst ins Jenseits entschwindet . Es gibt da also reichlich Potential für Konflikte, zumal die Objectlist ja nicht mitbekommt, wenn ein in ihr enthaltenes Objekt anderswo zerstört wird. Sie enthält dann ungültige Objektreferenzen, die solche pointer-Fehler erzeugen, wenn die TObjectlist versucht, ihren Inhalt zu free-en.

In deinem Fall mußt Du also unbedingt die TObjectlist löschen und darfst dann auch keinen Fall mehr versuchen, eines der Frames "anzufassen", die existieren dann nämlich nicht mehr. Kode in TComponent sorgt dafür, dass der Owner benachrichtigt wird, wenn sein Eigentum externem Vandalismus anheim fällt, da gibt es also keine Probleme, und auch die Parent <-> Child Beziehung wird ordentlich beendet. Deine TObjectlist ist aber außerhalb der automatischen Verwaltung der Lebensdauer, da bist Du also selbst dafür verantwortlich, eine enthaltene Objektreferenz zu entfernen, wenn Du das Objekt anderswo zerstörst. TObjectlist hat eine Extract-Methode dafür, die entfernt eine Referenz aus der Liste ohne zu versuchen, die freizugeben.
Peter Below
  Mit Zitat antworten Zitat
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Form close - EINvalidPointer

  Alt 10. Apr 2019, 11:05
Zitat:
Zum Verständnis...Entweder die Objektliste oder der Owner gibt den Frame frei.
Besten Dank für die Erklärung. Dies habe ich wohl falsch verstanden. Ich habe gedacht das der owner dann auf die TObjectList übertragen wird. Somit hatte ich 2 Owner.

Code:
// 1. Variante
FrmPerson := TFrmPerson.Create(nil); // Owner hier auf nil
PersonList := TObjectList<TfrmPerson>.Create(True); // bleibt
Habe ich nun wie in deinem beispiel getestet. Hat leider nichts gebracht der PointerFehler besteht weiterhin.

Im Frame habe ich noch Arrays[0..30] of Shortint; diese müssen ja nicht spezifisch freigegeben werden, richtig ?

Code:
TfrmAnsicht = class(TForm)
private
 FPersonList : TObjectList<TfrmPerson>;
Hmm... Ich möchte sehen welche Units ich Manuell eingebunden Habe.
Wenn ich dies wie in deinem Beispiel mache bin ich gezwungen die frame_Person in der ersten Uses einzutragen wo alle system units eingebunden werden.

Wenn ich diese global deklariere kann ich dies nach der Implementation machen und sehe somit auf anhib welche units ich eingebunden habe. Oder gibt es eine möglichkeit diese als private zu deklarieren nach der Implementation ?

Ah ja bevor ichs vergesse, Vielen Dank für die Hilfe!

Geändert von Int3g3r (10. Apr 2019 um 11:27 Uhr)
  Mit Zitat antworten Zitat
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Form close - EINvalidPointer

  Alt 10. Apr 2019, 11:27
In deinem Fall mußt Du also unbedingt die TObjectlist löschen und darfst dann auch keinen Fall mehr versuchen, eines der Frames "anzufassen", die existieren dann nämlich nicht mehr. Kode in TComponent sorgt dafür, dass der Owner benachrichtigt wird, wenn sein Eigentum externem Vandalismus anheim fällt, da gibt es also keine Probleme, und auch die Parent <-> Child Beziehung wird ordentlich beendet. Deine TObjectlist ist aber außerhalb der automatischen Verwaltung der Lebensdauer, da bist Du also selbst dafür verantwortlich, eine enthaltene Objektreferenz zu entfernen, wenn Du das Objekt anderswo zerstörst. TObjectlist hat eine Extract-Methode dafür, die entfernt eine Referenz aus der Liste ohne zu versuchen, die freizugeben.
Hmm ich verstehe nicht wo meine Frames zerstört werden ? Ich habe keinen code der die Frames freigibt oder zerstört, ausser beim btnSchliessen. Oder werden bei PersonList.Free nur die Frames freigegeben aber die Referenzen in der Liste nicht gelöscht?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 15:14 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