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/)
-   -   Delphi [ Eledigt ]Inkompatible Typen TformClass und Class reference (https://www.delphipraxis.net/111424-%5B-eledigt-%5Dinkompatible-typen-tformclass-und-class-reference.html)

Newbi 3. Apr 2008 09:54


[ 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.

freak4fun 3. Apr 2008 10:00

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. ;)

Newbi 3. Apr 2008 10:22

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.

Newbi 3. Apr 2008 15:52

Re: Inkompatible Typen TformClass und Class reference
 
Srry aber ich kann den Fehler einfach nicht finden.


Kann jemand den Code mal bitte richtig posten ??

Muetze1 3. Apr 2008 16:23

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.

SirThornberry 3. Apr 2008 17:05

Re: Inkompatible Typen TformClass und Class reference
 
ich glaub dein Fehler liegt hier:
Delphi-Quellcode:
procedure TFrm_Main.ShowForm(aForm: TFormClass);
var
  newFormClass: TFormClass; //<---- hier ist der Fehler
begin
[...]
newForm := newFormClass.Create(self);
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.

Muetze1 3. Apr 2008 18:57

Re: Inkompatible Typen TformClass und Class reference
 
Zitat:

Zitat von SirThornberry
ich glaub dein Fehler liegt hier:
Delphi-Quellcode:
procedure TFrm_Main.ShowForm(aForm: TFormClass);
var
  newFormClass: TFormClass; //<---- hier ist der Fehler
begin
[...]
newForm := newFormClass.Create(self);
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.

Alles richtig, bis auf den Punkt, dass newForm vom Typ TForm ist. Es ist ein Member und newFormClass != newForm...

SirThornberry 3. Apr 2008 19:19

Re: Inkompatible Typen TformClass und Class reference
 
das es nicht genau eine instanz von TForm ist war mir klar aber eben ein Nachfahre.

busybyte 3. Apr 2008 19:58

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 ?

Hawkeye219 3. Apr 2008 21:15

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 diese Seite gefunden. Im Abschnitt "Metaklassen" wird an einem Beispiel der Unterschied zwischen Klassen und Klassenreferenzen erklärt.

Gruß Hawkeye

busybyte 3. Apr 2008 21:43

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:
Type
TMyClassof :=Class of TIrgendwas;
end;
Var MeineVar:Tirgendwas;
//und dann
TMyClassof:=Tirgendwas;
MeineVar:=TMyClassof.create;

//oder gleich
MeineVar:=TIrgendwas.create;
verwende ???

Muetze1 3. Apr 2008 21:49

Re: Inkompatible Typen TformClass und Class reference
 
Zitat:

Zitat von SirThornberry
das es nicht genau eine instanz von TForm ist war mir klar aber eben ein Nachfahre.

Aber du schriebst was anderes:

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;

Newbi 3. Apr 2008 22:12

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:
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.
Nun kommen 2 Fehler:
1) Zu viele Parameter ( ShowForm(TFrm_Startseite); )
2) Inkompatible Typen [TForm und TFrm_Startseite] ( newForm:= TFrm_Startseite.Create(self); )

Muetze1 3. Apr 2008 23:28

Re: Inkompatible Typen TformClass und Class reference
 
Zitat:

Zitat von Newbi
Das ich ein Frame einbinden will ist zutreffend, dieses hat aber bis auf sich selbts noch keinen Inhalt.

<ironie>Sehr schön, ist schliesslich grundlegend unwichtig.</ironie>

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:

Zitat von Newbi
Nun kommen 2 Fehler:
1) Zu viele Parameter ( ShowForm(TFrm_Startseite); )
2) Inkompatible Typen [TForm und TFrm_Startseite] ( newForm:= TFrm_Startseite.Create(self); )

zu 1): Ja, ich habe doch den Parameter entfernt, weil wir doch nun die TFormClass eingespart haben. Somit ist der Parameter überflüssig.

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.

Newbi 4. Apr 2008 07:52

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 06:42 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