![]() |
[ Eledigt ]Inkompatible Typen TformClass und Class reference
Ich habe nen Menü Programiert, entsprechend einer von hier heruntergeladenen Demo, das haut bei mir nur leider net ganz hin.
Delphi-Quellcode:
unit Unit_Main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TFrm_Main = class(TForm) Panel_Menu: TPanel; Panel_Content: TPanel; Btn_Adress_Add: TButton; Btn_Adress_Edit: TButton; Btn_Close: TButton; Button4: TButton; Btn_Adress_Search: TButton; Btn_Adress_Delete: TButton; Btn_Adress_Clear: TButton; Button8: TButton; Button9: TButton; procedure FormCreate(Sender: TObject); private newForm: TForm; procedure ShowForm(aForm: TFormClass); { Private-Deklarationen } public { Public-Deklarationen } Start_first_time:integer; // Variable die den ersten Start des Programmes speichert. end; var Frm_Main: TFrm_Main; implementation uses Unit_Startseite; {$R *.dfm} procedure TFrm_Main.FormCreate(Sender: TObject); begin // Wurde die LadenSeite schon ausgeführt ? If Start_first_time = 1 then begin // Buttens Einblenden. Btn_Adress_Add.Visible:=true; Btn_Adress_Clear.Visible:=true; Btn_Adress_Edit.Visible:=true; Btn_Adress_Delete.Visible:=true; Btn_Adress_Search.Visible:=true; Btn_Close.Visible:=true; end else begin ShowForm(TFrm_Startseite); end; end; procedure TFrm_Main.ShowForm(aForm: TFormClass); var newFormClass: TFormClass; begin newFormClass := NIL; newFormClass := aForm; if Assigned(newFormClass) then begin newForm := newFormClass.Create(self); newForm.BorderStyle := bsNone; newForm.Parent := Panel_Content; // "In diesem Panel" werden die Forms angezeigt. newForm.Align := alClient; newForm.Show; end; end; end. Ich komme einfach net weiter. |
Re: Inkompatible Typen TformClass und Class reference
"newForm" ist vom Typ TForm und nicht "TFormClass". Du solltest also die Zeile 69 (newForm := newFormClass.Create(self);) nochmal überdenken. ;)
|
Re: Inkompatible Typen TformClass und Class reference
öhm wie ich schon sagte habe ich den Code einem Beispiel entnommen, welches auch funktionierte.
Aber jetzt stehe ich wirklich 100% aufem Schlauch. |
Re: Inkompatible Typen TformClass und Class reference
Srry aber ich kann den Fehler einfach nicht finden.
Kann jemand den Code mal bitte richtig posten ?? |
Re: Inkompatible Typen TformClass und Class reference
Soweit ist alles richtig. Mich würde vor allem mal die genaue Zeile interessieren die angemeckert wird.
@freak4fun: Mach dich mal kundig was TFormClass ist. Sein Code ist richtig. |
Re: Inkompatible Typen TformClass und Class reference
ich glaub dein Fehler liegt hier:
Delphi-Quellcode:
denn TFormClass.Create gibt dir ein TForm zurück und kein TFormClass. Dementsprechend kannst du den Rückgabewert von TFormClass.Create nur auf eine Variable vom Typ TForm zuweisen und nicht auf eine Variable vom Typ TFormClass.
procedure TFrm_Main.ShowForm(aForm: TFormClass);
var newFormClass: TFormClass; //<---- hier ist der Fehler begin [...] newForm := newFormClass.Create(self); |
Re: Inkompatible Typen TformClass und Class reference
Zitat:
|
Re: Inkompatible Typen TformClass und Class reference
das es nicht genau eine instanz von TForm ist war mir klar aber eben ein Nachfahre.
|
Re: Inkompatible Typen TformClass und Class reference
Ich habe mir mal die Form.pas angeschaut und entdeckt das TFormClass nicht class(TForm) sondern class of TForm ist.
Deswegen bekomme ich kein Create hin ohne diese Fehlermeldung inkompatible Typen. Was ist denn jetzt der Unterschied zwischen Class(TForm) und Class of TForm ? |
Re: Inkompatible Typen TformClass und Class reference
Hallo,
meine Vermutung ist, dass es sich bei TFrm_Startseite nicht um den Namen einer von TForm abgeleiteten Klasse handelt, sondern beispielsweise um einen TFrame-Nachfolger. In diesem Fall würde der Fehler in der Zeile mit dem Aufruf der Methode ShowForm auftreten. @busybyte Bei einer schnellen Suche habe ich nur ![]() Gruß Hawkeye |
Re: Inkompatible Typen TformClass und Class reference
@HawkEye219 genial,vielen Dank !!!
Jetzt ist mir das klar. Class of kann nur Typen aufnehmen und ist selbst kein Typ, sondern nur ein zeiger auf einen Typ.Der Sinn dahinter ist mir allerdings schleierhaft. ob ich
Delphi-Quellcode:
verwende ???
Type
TMyClassof :=Class of TIrgendwas; end; Var MeineVar:Tirgendwas; //und dann TMyClassof:=Tirgendwas; MeineVar:=TMyClassof.create; //oder gleich MeineVar:=TIrgendwas.create; |
Re: Inkompatible Typen TformClass und Class reference
Zitat:
SirThornberry denn TFormClass.Create gibt dir ein TForm zurück und kein TFormClass. Dementsprechend kannst du den Rückgabewert von TFormClass.Create nur auf eine Variable vom Typ TForm zuweisen und nicht auf eine Variable vom Typ TFormClass. Und das stimmt nicht bzw. hat er gemacht, da newForm vom Typ TForm ist. Mehr habe ich nicht anmerken wollen. @Busybyte: Damit kannst du eine eine Methode nutzen um eine Klasse zu instanziieren ohne das ihr genauer Typ zur Designtime feststeht. Dieser kann erst zur Laufzeit ermittelt werden. Es ist sozusagen eine Variable die einen Klassentyp aufnehmen kann. Somit kannst du zur Laufzeit ohne den wirklichen Typ zu kennen eine Instanz bilden. Bei deinem Ausgangsbeispiel wurde das in der Methode ShowForm genutzt um unabhängig von der später verwendeten Form das gewünschte Verhalten zu implementieren. Es hätte natürlich eine vorhandene Form Instanz gereicht, aber da er die Form auch erzeugt braucht er eine solche Klassenreferenz. Aber hier dein Beispiel weniger "frei" und angepasst an dein spezielles Beispiel ohne TFormClass:
Delphi-Quellcode:
procedure TFrm_Main.ShowForm;
begin newForm := TFrm_Startseite.Create(self); newForm.BorderStyle := bsNone; newForm.Parent := Panel_Content; // "In diesem Panel" werden die Forms angezeigt. newForm.Align := alClient; newForm.Show; end; |
Re: Inkompatible Typen TformClass und Class reference
:gruebel: :gruebel: :gruebel: :gruebel: :wiejetzt: :wall: :wall:
Also ich verstehe zur Zeit nur Bahnhof. Das ich ein Frame einbinden will ist zutreffend, dieses hat aber bis auf sich selbts noch keinen Inhalt. Ich verwende Delphi 6. Ich bin noch net so erfahren, aber eben sehr lernwillig. Was der Code in groben Zügen macht ist mir soweit auch geläufig, bei irgendeiner feinheit hapert es aber. Diese Feinheit habt ihr anscheind gefunden und auch sicherlich sehr gut erklärt was ich machen soll. Ich verstehe es nur leider nicht. Könnte bitte jemand die erklärung nochmal erklären ?? Nachtrag: Danke nur ist der Groschen gefallen. :coder2: Nachtrag 2: Oder auch nicht.
Delphi-Quellcode:
Nun kommen 2 Fehler:
unit Unit_Main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TFrm_Main = class(TForm) Panel_Menu: TPanel; Panel_Content: TPanel; Btn_Adress_Add: TButton; Btn_Adress_Edit: TButton; Btn_Close: TButton; Button4: TButton; Btn_Adress_Search: TButton; Btn_Adress_Delete: TButton; Btn_Adress_Clear: TButton; Button8: TButton; Button9: TButton; procedure FormCreate(Sender: TObject); procedure ShowForm; private newForm: TForm; { Private-Deklarationen } public { Public-Deklarationen } Start_first_time:integer; // Variable die den ersten Start des Programmes speichert. end; var Frm_Main: TFrm_Main; implementation uses Unit_Startseite; {$R *.dfm} procedure TFrm_Main.FormCreate(Sender: TObject); begin // Wurde die LadenSeite schon ausgeführt ? If Start_first_time = 1 then begin // Buttens Einblenden. Btn_Adress_Add.Visible:=true; Btn_Adress_Clear.Visible:=true; Btn_Adress_Edit.Visible:=true; Btn_Adress_Delete.Visible:=true; Btn_Adress_Search.Visible:=true; Btn_Close.Visible:=true; end else begin ShowForm(TFrm_Startseite); end; end; procedure TFrm_Main.ShowForm; begin newForm:= TFrm_Startseite.Create(self); newForm.BorderStyle := bsNone; newForm.Parent := Panel_Content; // "In diesem Panel" werden die Forms angezeigt. newForm.Align := alClient; newForm.Show; end; end. 1) Zu viele Parameter ( ShowForm(TFrm_Startseite); ) 2) Inkompatible Typen [TForm und TFrm_Startseite] ( newForm:= TFrm_Startseite.Create(self); ) |
Re: Inkompatible Typen TformClass und Class reference
Zitat:
Eine Frame ist keine Form. Eine Frame kann im Gegensatz zu einer Form nicht alleine als Fenster angezeigt werden sondern nur auf einem Formular eingebettet werden. Der gesamte Code zielt aber darauf ab, ein Formular anzuzeigen. Zitat:
zu 2): Ja, wie gesagt: eine TFrame ist was anderes als eine TForm. Es würde auch nichts bringen das ganze anzupassen, da eine Frame auf ein Formular eingebettet wird und somit musst du erstmal erklären wie und wo die angezeigt werden soll bzw. was du nun direkt erreichen willst. |
Re: Inkompatible Typen TformClass und Class reference
Danke an alle. Es funktioniert.
Ich habe fix aus dem Frame ne Form gemacht und aus 1) Zu viele Parameter ( ShowForm(TFrm_Startseite); ) 1) Zu viele Parameter ( ShowForm; ) gemacht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:15 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