![]() |
Form close - EINvalidPointer
Liste der Anhänge anzeigen (Anzahl: 1)
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:
Im Anhang befindet sich der Source.
// unit System;
procedure TObject.FreeInstance; begin CleanupInstance; _FreeMem(Pointer(Self)); // <- Hier wird die exception ausgelöst. end; 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 |
AW: Form close - EINvalidPointer
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). |
AW: Form close - EINvalidPointer
Zitat:
Ich habe es trotzdem mal versucht und den owner auf false gesetzt. Dies hat an der situation nichts geändert. |
AW: Form close - EINvalidPointer
.. 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 |
AW: Form close - EINvalidPointer
Zitat:
Code:
qryMitarbeiter.Close;
qryMitarbeiter.SQL.Text := 'select * from mitarbeiter where mitarbeiter.aktiv = 1'; qryMitarbeiter.Open; |
AW: Form close - EINvalidPointer
Hallo,
Zitat:
oder machst du das bereits? |
AW: Form close - EINvalidPointer
Moin...8-)
Zitat:
Zum Verständnis...Entweder die Objektliste oder der Owner gibt den Frame frei. :warn:
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:
Erzeugen und freigeben der Liste bitte im FormCreate/FormDestroy. Da sind sie besser aufgehoben. :wink:
PersonList := TObjectList<TfrmPerson>.Create(True);
PersonList.Free; eine Bitte: Keine globalen Variablen. :warn:
Delphi-Quellcode:
besser:
var
PersonList : TObjectList<TfrmPerson>;
Delphi-Quellcode:
TfrmAnsicht = class(TForm)
private FPersonList : TObjectList<TfrmPerson>; |
AW: Form close - EINvalidPointer
Zitat:
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. |
AW: Form close - EINvalidPointer
Zitat:
Code:
Habe ich nun wie in deinem beispiel getestet. Hat leider nichts gebracht der PointerFehler besteht weiterhin.
// 1. Variante
FrmPerson := TFrmPerson.Create(nil); // Owner hier auf nil PersonList := TObjectList<TfrmPerson>.Create(True); // bleibt Im Frame habe ich noch Arrays[0..30] of Shortint; diese müssen ja nicht spezifisch freigegeben werden, richtig ?
Code:
Hmm... Ich möchte sehen welche Units ich Manuell eingebunden Habe.
TfrmAnsicht = class(TForm)
private FPersonList : TObjectList<TfrmPerson>; 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! :-D |
AW: Form close - EINvalidPointer
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 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