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/)
-   -   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


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:26 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