![]() |
RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1 fehl
Hallo zusammen,
ich bin gerade dabei ein großes Projekt von Delphi XE8 zu Delphi 10.1 umzuziehen. Das Projekt lies sich schon nach kurzer Zeit wieder übersetzen. Ich musste lediglich die dproj-Datei löschen, da es sonst einige Fehler gab. Leider bekomme ich nun im laufenden Betrieb aber Probleme: Ich registriere verschiedene Frames im Abschnitt initialization mit RegisterClass:
Delphi-Quellcode:
Wenn ich nach dieser Registrierung mit FindClass danach suche, dann bekomme ich die Meldung "Klasse TMyFrame nicht gefunden".
initialization
RegisterClass(TMyFrame);
Delphi-Quellcode:
Wenn ich ein komplett neues Projekt im Delphi 10.1 anlege funktioniert alles bestens. Leider nicht bei meinem großen Projekt. Bei "normalen" Klassen funktioniert es jedoch auch in meinem großen Projekt...nur nicht bei meinen Frames. Ich habe zum Test auch nochmal ein komplett neues Frame im großen Projekt angelegt und dieses registriert. Aber auch hier habe ich keinen Erfolg und FindClass wirft einen Fehler.
FindClass('TMyFrame'); //Error
Habt ihr vllt eine Idee, woran das liegen kann? Grüße Headbucket |
AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
Compiliere doch einfach mal mit debug dcu und debugge in den registerclass aufruf hinein.
Sollte Dir den Fehler ja zeigen |
AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
Vielleicht fehlt ein
![]() |
AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
Das %ClassGroup hat eher auf RegisterComponent und die Anzeige in der Komponentenpalette .
Arbeitet ihr mit Laufzeitpackages? Und wenn ja, wird eure Unit (der Initialization-Abschnitt) auch verwendet/geladen? |
AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
Vielen Dank schonmal für die Antworten!
Zitat:
Delphi-Quellcode:
Nach dem Aufruf RegisterClass(TMyTestFrame) wird also zunächst TMyTestFrame registriert. Der ClassParent ist TFrame und wird AClass zugewiesen. Danach bricht die Schleife ab.
procedure RegisterClass(AClass: TPersistentClass);
begin RegGroups.Lock; try while not RegGroups.Registered(AClass) do begin RegGroups.RegisterClass(AClass); if AClass = TPersistent then Break; AClass := TPersistentClass(AClass.ClassParent); end; finally RegGroups.Unlock; end; end; Zitat:
Zitat:
Initialization wird in jedem Fall vorher ausgeführt. Edit: Unter XE8 funktioniert es wie gesagt einwandfrei. Wenn ich das Projekt 1:1 mit Delphi 10.1 öffne, dann funktioniert es nicht. Delphi 10.1 läuft allerdings in einer anderen virtuellen Maschine. Außerdem habe ich das Problem, dass meine Anwendung mit Delphi 10.1 den Look von Windows 2000 hat. Aus diesem Grund habe ich auch die dproj-Datei neu erstellen lassen. Danach war das Aussehen der Anwendung wieder normal. In beiden Fällen funktioniert aber FindClass nicht. Grüße Headbucket |
AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
Nachvollziehen kann ich es hier zwar nicht.
Was passiert wenn Du direkt nach dem Registerclass versuchst mit Findclass darauf zuzugreifen. Einfach zum testen. |
AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
Ein guter Tipp. Manchmal kommt man auf die einfachsten Dinge nicht... .
Delphi-Quellcode:
Auch hier erhalte ich einen Fehler. Ich habe aber nun Herausgefunden, dass es nicht alle Frames betrifft.
initialization
RegisterClass(TMyFrame); FindClass('TMyFrame'); //Fehler Die Struktur sieht bei mir wiefolgt aus:
Code:
Das kuriose, was ich auch schon geschrieben hatte: Wenn ich ein neues Frame erzeuge bekomme ich auch einen Fehler! :evil:
- TTemplateFrame = class(TFrame) //Diese Klasse kann ich registrieren und finden!
- TMyBaseFrame = class(TTemplateFrame) //Diese Klasse kann ich registrieren und finden! - TMySpecialFrame = class(TMyBaseFrame) //Kann nicht gefunden werden
Delphi-Quellcode:
Es muss also am Projekt liegen. Bis auf die dpr habe ich nun alle Dateien noch einmal gelöscht - kein Unterschied.
unit MyTestFrame_;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs; type TMyTestFrame = class(TFrame) private { Private-Deklarationen } public { Public-Deklarationen } end; implementation {$R *.dfm} initialization RegisterClass(TMyTestFrame); FindClass('TMyTestFrame'); //Fehler end. Es ist zum verrückt werden. Am Ende muss ich mir eine alternative Methode anschauen... . Grüße Headbucket |
AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
Wie viele verschiedene Frameklassen hast Du denn? Erzeugst Du von einer evtl. mehrere Instanzen? Ich hatte da nämlich auch schon einmal
![]() |
AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
Aktuell hat das Projekt 56 verschiedene Frames. Erzeugt werden sie immer nur einzeln, wobei verschiedene Basisklassen natürlich auch mehrfach instanziiert werden.
Bis einschließlich XE8 hatte ich mit Frames auch nie Probleme und es werden auch noch deutlich mehr werden. Es kommt ja aber auch gar nicht erst bis zur Erstellung der Frames. Vllt ein Bug in der neusten Delphi Version? (Update 2). Vllt werde ich mal den Vorgänger (Update 1) installieren... . Die werden aber natürlich nicht alle registriert. Manuell registriert werden zZ glabe nur 5. |
AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
Hallöle...8-)
Zitat:
|
AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
Zitat:
Also bei dem Frame der nicht funktioniert anschauen in welcher RegGroup der bei registerClass landet und mit welchem Hash. Dann im Findclass schauen welcher Hash zum suchen erzeugt wird und das ales vergleichen. Es muss da ein Problem sein und ich könnte nicht ruhig schlafen ohne dem nachzugehen |
AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
Der DFM-Loader macht selber RegisterClass/UnregisterClass mit allen Typen, die der Compiler im Published der zu ladenden Hauptklasse findet.
Da hätte es eventuell Probleme geben können, aber wenn es auch schon direkt nach der Registrierung knallt ... :gruebel: |
AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
Ich habe hier ein Projekt mit über 300 Frames in unterschiedlich tiefer Vererbungshierarchie - und das läuft problemlos auch unter Berlin Update 2.
Allerdings hatte ich zwischendurch auch das Problem, daß mir meine Frames beim Einfügen im Designer nicht angezeigt wurden. Abhilfe schaffte ein kleiner Eingriff in die dproj-Datei in der Art, daß die <DCCReference>-Einträge eines Frames zusätzlich zum <Form> folgende Sub-Einträge haben mussten:
Code:
Ich vermute mal, daß diese Frame-bezogenen Einträge beim Neuaufbau der dproj-Datei nicht gesetzt werden.<FormType>dfm</FormType> <DesignClass>TFrame</DesignClass> Ob das jetzt Auswirkungen auf das RegisterClass/FindClass hat, kann ich nicht sagen. |
AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
Vielen Dank für die vielen Antworten!
Zitat:
Zitat:
Delphi-Quellcode:
ein nil zurückgegeben... .
FClassList.TryGetValue(AClassName, Result);
FClassList ist vom Typ
Delphi-Quellcode:
Hier bin ich dann auch irgendwie mit meinem Latein am Ende :-(
TPersistentClassDictionary = TDictionary<string, TPersistentClass>;
Zitat:
Ich habe nun aber noch eine weitere Sache festgestellt. Angenommen ich habe folgende Struktur:
Code:
Rufe ich folgendes im TMyBaseFrame auf funktiniert alles:
- TMyBaseFrame = class(TFrame) //Basisframe
- TMySpecialFrame = class(TMyBaseFrame) //Von Basisframe abgeleitet
Delphi-Quellcode:
Rufe ich aber beim Programmstart noch einmal FindClass('TMyBaseFrame'); auf, dann findet er die Klasse schon nicht mehr.
initialization
RegisterClass(TMyBaseFrame); FindClass('TMyBaseFrame'); Wenn ich RegisterClass und FindClass im initialization-Abschnitt von TMySpecialFrame aufrufe, dann klappt es nicht mal dort. Arbeitet denn schon jemand mit der neusten Delphiversion mit der Registrierung von Frames? Mir gehen leider so langsam die Ideen aus. Grüße Headbucket |
AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
Zitat:
Zitat:
|
AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
Zitat:
Und dann was beim findclass gemacht wird? Wirklich mal komplett da durch debuggen. Ist vielleicht Zeitaufwändig aber immer noch besser als dauernd im Nebel herumzustochern. |
AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
:wall: :wall: :wall:
Ich habe den Fehler gefunden. Manchmal braucht man wirklich ein paar energische Worte, wie von euch beiden. Denn danach wollte ich das Projekt nochmal komplett neu erstellen. Beim Einfügen der Units wurde dabei 2 mal angemerkt, dass die uses-parts von 2 Units FMX-Units enthielten. Mit dem Hinweis, dass es zu Compiler-Fehlern kommen kann. Wenn ich diese Units durch VCL-Units ersetze, funktioniert nun auch wieder das FindClass ordnungsgemäß. Vielen Dank für eure Geduld. Auf so etwas kann man natürlich nicht kommen, denn sowas sollte natürlich auch erst gar nicht passieren. Grüße Headbucket |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:39 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