Was macht ein EClassNotFound ausgelöst zur Laufzeit wirklich zu bedeuten, wenn die Klasse in Frage, da zur compile-und link-Zeit, und dort explizit im code?
Habe ich einen Laufzeit-Fehler Auftritt in der rtl-Streaming in einer form, verursacht eine Ausnahme EClassNotFound erhöht werden, während Sie TReader.ReadRootComponent. Die Besondere Fehlermeldung "Klasse nicht gefunden TActionList".
Was seltsam ist:
- Meine Haupt-form verwendet, in der Liste Aktion.
- Für Spaß, ich habe ActnList.pas (von der VCL-source-Ordner) in mein Projekt, um zu versuchen, es zu beheben.
Mir das passiert, wenn der Instantiierung eines Formulars gibt, die hatte ich bis vor ein paar Minuten. Die änderung, die ich machte, wurde in einigen sub-frame-code: ich entfernte alle seine implementation-Abschnitt-code mit einem ifdef-marker, denn ich bin mocking bis einige frames, für unit-Tests und Prototypen.
Habe ich versucht, indem in der Liste Aktion die Klasse auf das Projekt, und ich habe versucht, mit und ohne verschiedene compiler-und link-Optionen, und doch, ich bekomme immer noch diese exception. Natürlich etwas komisch ist. Es muss eine andere seltsame Weg, um dieses problem.
In der Tat, es scheint, es ist etwas wirklich komisches passiert. Wenn dieser Fehler ausgelöst wird, bekomme ich die folgende Aufrufliste:
rtl.Classes.ClassNotFound('TActionList')
rtl.Classes.TReader.FindComponentClass(???)
rtl.Classes.FindExistingComponent
rtl.Classes.TReader.ReadComponent(nil) /// NIL!? WHAT!!!!!
rtl.Classes.TReader.ReadDataInner(???)
rtl.Classes.TReader.ReadData(???)
rtl.Classes.TComponent.ReadState(???)
vcl.Controls.TControl.ReadState(???)
vcl.Controls.TWinControl.ReadState($60B9CF0)
vcl.Forms.TCustomForm.ReadState(???)
rtl.Classes.TReader.ReadRootComponent($606EB90)
rtl.Classes.TStream.ReadComponent($606EB90)
rtl.Classes.InternalReadComponentRes(???,???,$606EB90)
rtl.Classes.InitComponent(TComplexFormContainingFrames)
Scheint es der nil ist beabsichtigt, in TReader.ReadDataInner(Beispiel:TComponent):
while not EndOfList do ReadComponent(nil);
Update: ich glaube, die Antwort auf diese Frage zu verstehen, "die Serialisierung von Kontexten", wie Maurer erwähnt hat. Und, es ist Zeit, zuzugeben meine eigene Dummheit: ich entfernte das übergeordnete Element der frame aus dem Projekt, nicht ahnend, es war das parent des Frames. Ich arbeitete um es zu fehlen, durch das stubbing von der Typdeklaration für TMyFrameParent
als TMyFrameParent = class(TFrame)
, und dies wiederum führt zu der Bedingung in Frage. Ich lasse die Frage hier, weil ich denke, es könnte wirklich sein nützlich in Zukunft zu beachten, wenn diese Ausnahme Auftritt bei obskuren Fällen, und wie es zu lösen ist. Insbesondere, Mason hat eine wirklich interessante Informationen über "Serialisierung Kontexten" und, wie Sie sich auf Klassen-Namen-finden.
- Der nil nur Signale zu ReadComponent zu instanziieren einer neuen Instanz zu Lesen, anstatt in eine bestehende ein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es bedeutet, dass die Klasse nicht gefunden in der aktuellen Deserialisierung Kontext. Nicht alle vorhandenen Klassen registriert sind, für alle laden. Jede form-Klasse hat RTTI mit verweisen auf die Komponenten verwendet. Zu bekommen dies funktioniert, stellen Sie sicher, dass Ihre form (oder des Rahmens, wenn dieser eine frame) bestimmt, die mindestens eine TActionList, bevor die private tag:
Verwenden Klassen.RegisterClass registrieren Sie Klassen, die Sie verwenden möchten, mit dem streaming-system. Zitat von der doc
Es scheint, dass dies geschieht, wenn Sie kopieren ein Bild aus einem Projekt in ein anderes Projekt, und das frame erbt von etwas, und Sie gefälschte des Erbes, aber lassen Sie das "geerbt" item-Beschreibungen im Rahmen dfm, Gegenstände wie diese:
Dies wiederum führt in der "aktuellen Deserialisierung Kontext", dass Mason gesprochen, nicht mit der Klasse. Ein fix ist die Veränderung Geerbt Objekt in allen oben genannten Fällen.
Bekam ich ein "EClassNotFound" Fehler, wenn ich hatte ein TLabel Erklärung in meinem DFM-Datei, aber es gab keine Erklärung für das entsprechende PAS Datei. Irgendwie ist der Formular-editor geschraubt.
War der Fehler nicht sichtbar, bis ich Sie gelöscht, alle Aufkleber von meiner form, außer, dass insbesondere "beschädigt" ein. Es war schwierig, Sie zu jagen Sie nach unten, denn das label war versteckt unter einem panel.
Einem einfachen fix ist, Ausschneiden (Strg+x), die Bezeichnung (wenn Sie es gefunden haben) aus dem Formular und fügen es wieder. Diese Zeit der Formular-editor wird korrekt legen Sie eine Erklärung für die in der PAS-Datei.
Es ist ein weiterer Weg, um diese Fehlermeldung erhalten: den "öffentlichen" an der Spitze der Formular-definition-Klasse. Standardmäßig Schüler werden 'veröffentlicht'. Ich habe versehentlich Hinzugefügt "öffentlichkeit" an die Spitze der Formular-Deklaration, und es erzeugt mehrere 'Klasse nicht gefunden' exceptions zur Laufzeit.