![]() |
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:48 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