Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1 fehl (https://www.delphipraxis.net/191396-registerclass-getclass-von-tframe-schlaegt-nach-projektumstieg-xe8-delphi-10-1-fehl.html)

Headbucket 11. Jan 2017 08:52

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:
initialization
  RegisterClass(TMyFrame);
Wenn ich nach dieser Registrierung mit FindClass danach suche, dann bekomme ich die Meldung "Klasse TMyFrame nicht gefunden".
Delphi-Quellcode:
FindClass('TMyFrame'); //Error
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.

Habt ihr vllt eine Idee, woran das liegen kann?

Grüße
Headbucket

Fritzew 11. Jan 2017 09:47

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

uligerhardt 11. Jan 2017 10:12

AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
 
Vielleicht fehlt ein %CLASSGROUP in der Frame-Unit. Und gibt's da nicht ein FrameworkType o.ä. in der *.dproj?

himitsu 11. Jan 2017 10:17

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?

Headbucket 11. Jan 2017 10:25

AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
 
Vielen Dank schonmal für die Antworten!

Zitat:

Zitat von Fritzew (Beitrag 1358629)
Compiliere doch einfach mal mit debug dcu und debugge in den registerclass aufruf hinein.
Sollte Dir den Fehler ja zeigen

Habe ich gemacht. Hier scheint alles i.O. zu sein. RegisterClass sieht ja wie folgt aus:

Delphi-Quellcode:
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;
Nach dem Aufruf RegisterClass(TMyTestFrame) wird also zunächst TMyTestFrame registriert. Der ClassParent ist TFrame und wird AClass zugewiesen. Danach bricht die Schleife ab.

Zitat:

Zitat von uligerhardt (Beitrag 1358630)
Vielleicht fehlt ein %CLASSGROUP in der Frame-Unit. Und gibt's da nicht ein FrameworkType o.ä. in der *.dproj?

Das werde ich mir sofort mal anschauen.

Zitat:

Zitat von himitsu (Beitrag 1358631)
Arbeitet ihr mit Laufzeitpackages?
Und wenn ja, wird eure Unit (der Initialization-Abschnitt) auch verwendet/geladen?

Wir verwenden nur statische Packages, welche aber damit gar nichts zu tun haben sollte, da der Fehler ja auch auftritt, wenn ich ein neues Frame erstelle und dieses direkt von TFrame ableite :-(.

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

Fritzew 11. Jan 2017 11:02

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.

Headbucket 11. Jan 2017 12:12

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:
initialization
  RegisterClass(TMyFrame);
  FindClass('TMyFrame'); //Fehler
Auch hier erhalte ich einen Fehler. Ich habe aber nun Herausgefunden, dass es nicht alle Frames betrifft.

Die Struktur sieht bei mir wiefolgt aus:
Code:
- 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
Das kuriose, was ich auch schon geschrieben hatte: Wenn ich ein neues Frame erzeuge bekomme ich auch einen Fehler! :evil:
Delphi-Quellcode:
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 muss also am Projekt liegen. Bis auf die dpr habe ich nun alle Dateien noch einmal gelöscht - kein Unterschied.

Es ist zum verrückt werden. Am Ende muss ich mir eine alternative Methode anschauen... .

Grüße
Headbucket

DeddyH 11. Jan 2017 12:46

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 massive Probleme. Die Ursache habe ich bis heute nicht herausfinden können.

Headbucket 11. Jan 2017 13:07

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.

haentschman 11. Jan 2017 13:11

AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
 
Hallöle...8-)
Zitat:

Am Ende muss ich mir eine alternative Methode anschauen...
Käme die Variante der dynamischen Erzeugung der Frames in Frage?


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:58 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz