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:

  1. Meine Haupt-form verwendet, in der Liste Aktion.
  2. 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.
InformationsquelleAutor Warren P | 2011-09-02
Schreibe einen Kommentar