Delphi-PRAXiS

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?

Fritzew 11. Jan 2017 13:15

AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
 
Zitat:

Zitat von Headbucket (Beitrag 1358657)
Vllt ein Bug in der neusten Delphi Version? (Update 2). Vllt werde ich mal den Vorgänger (Update 1) installieren... .

Also bevor Du Dir das antust würde ich wirklich mal da durch Debuggen.

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

himitsu 11. Jan 2017 13:26

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:

Uwe Raabe 11. Jan 2017 13:49

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:
           
  <FormType>dfm</FormType>
  <DesignClass>TFrame</DesignClass>
Ich vermute mal, daß diese Frame-bezogenen Einträge beim Neuaufbau der dproj-Datei nicht gesetzt werden.

Ob das jetzt Auswirkungen auf das RegisterClass/FindClass hat, kann ich nicht sagen.

Headbucket 16. Jan 2017 11:44

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

Zitat:

Zitat von haentschman (Beitrag 1358659)
Käme die Variante der dynamischen Erzeugung der Frames in Frage?

Die Frames werden ja bereits dynamisch erzeugt. Damit ich aber weiß, welches Frame ich erzeugen muss, werden sie vorher registriert :-).

Zitat:

Zitat von Fritzew (Beitrag 1358660)
Also bevor Du Dir das antust würde ich wirklich mal da durch Debuggen.
[...]
Es muss da ein Problem sein und ich könnte nicht ruhig schlafen ohne dem nachzugehen

Ich habe nun mal etwas intensiver mit dem Debugger geschaut. Es werden bei FindClass auf die selben Listen zugegriffen. Ich sehe sogar im Debugger meinen registrierten Eintrag. Es wird jedoch trotzdem bei
Delphi-Quellcode:
FClassList.TryGetValue(AClassName, Result);
ein nil zurückgegeben... .
FClassList ist vom Typ
Delphi-Quellcode:
TPersistentClassDictionary = TDictionary<string, TPersistentClass>;
Hier bin ich dann auch irgendwie mit meinem Latein am Ende :-(

Zitat:

Zitat von Uwe Raabe (Beitrag 1358671)
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:
           
  <FormType>dfm</FormType>
  <DesignClass>TFrame</DesignClass>

Ich habe bei mir den FormType hinzugefügt, denn dieser hat tatsächlich bei allen Frames gefehlt. Geändert hat sich dadurch leider nichts.

Ich habe nun aber noch eine weitere Sache festgestellt. Angenommen ich habe folgende Struktur:
Code:
- TMyBaseFrame = class(TFrame) //Basisframe
- TMySpecialFrame = class(TMyBaseFrame) //Von Basisframe abgeleitet
Rufe ich folgendes im TMyBaseFrame auf funktiniert alles:
Delphi-Quellcode:
initialization
  RegisterClass(TMyBaseFrame);
  FindClass('TMyBaseFrame');
Rufe ich aber beim Programmstart noch einmal FindClass('TMyBaseFrame'); auf, dann findet er die Klasse schon nicht mehr.
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

Uwe Raabe 16. Jan 2017 12:02

AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
 
Zitat:

Zitat von Headbucket (Beitrag 1358936)
Arbeitet denn schon jemand mit der neusten Delphiversion mit der Registrierung von Frames?

Wie du selbst schreibst...

Zitat:

Zitat von Headbucket (Beitrag 1358625)
Wenn ich ein komplett neues Projekt im Delphi 10.1 anlege funktioniert alles bestens.

... liegt es wohl kaum an der neuen Delphi-Version. Deswegen wird es für uns schwer sein, das von dir beobachtete Verhalten nachzuvollziehen. Irgendetwas an deinem Projekt ist eben anders als es sein soll. Was das ist, können wir allenfalls raten.

Fritzew 16. Jan 2017 12:15

AW: RegisterClass/GetClass von TFrame schlägt nach Projektumstieg XE8 -> Delphi 10.1
 
Zitat:

Deswegen wird es für uns schwer sein, das von dir beobachtete Verhalten nachzuvollziehen. Irgendetwas an deinem Projekt ist eben anders als es sein soll. Was das ist, können wir allenfalls raten.
Dem schließe ich mich an. Hast Du mal geschaut wohin beim Registrieren mit RegisterClass geschrieben wird.
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.

Headbucket 16. Jan 2017 13:29

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 19:26 Uhr.

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