2016-09-28 1 views
3

Ich bin wieder hier mit Frames. Ich habe diese Hauptform:Wie werden verschiedene Rahmentypen instanziiert?

enter image description here

Es ist nur eine einfache Form geschaffen, um die Verwendung von Frames zu verstehen. Mit den beiden Tasten auf der Oberseite der Form würde Ich mag diese beiden Frames öffnen:

Frame1

enter image description here

und Frame2

enter image description here

hier der Code der einfacher Code des ersten Rahmens:

unit AppFrame1; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
    System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, 
    Vcl.StdCtrls; 

type 
    TFrame1 = class(TFrame) 
    lblFrame1: TLabel; 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

implementation 

{$R *.dfm} 

end. 

und hier ist der Code des zweiten Rahmens:

unit AppFrame2; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
    System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, 
    Vcl.StdCtrls; 

type 
    TFrame2 = class(TFrame) 
    lblFrame2: TLabel; 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

implementation 

{$R *.dfm} 

end. 

Also nichts Besonderes in den beiden Rahmen. um den Rahmen aus der Hauptform zu öffnen Ich habe eine Schnittstelle wie folgt erstellt:

unit FramesManager; 

interface 

uses 
    Vcl.Forms, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Controls; 

type 

    TFrameClass = class(TFrame) 

    end; 


    IFrameManager = interface 
    ['{A00E0D1B-3438-4DC4-9794-702E8302B567}'] 
    procedure CreateGenericFrame(AParentPanel: TPanel; AFrameClass: TFrameClass); 
    procedure DestroyGenericFrame(); 
    end; 

    TFrameManager = class(TInterfacedObject, IFrameManager) 
    private 
    FGenericFrame: TFrameClass; 
    procedure CreateGenericFrame(AParentPanel: TPanel; AFrameClass: TFrameClass); 
    procedure DestroyGenericFrame(); 
    public 
    property Frame: TFrameClass read FGenericFrame write FGenericFrame; 
    end; 

implementation 

{ TFrameManagement } 

procedure TFrameManager.CreateGenericFrame(AParentPanel: TPanel; 
    AFrameClass: TFrameClass); 
begin 
    FGenericFrame := AFrameClass.Create(AParentPanel); 
    FGenericFrame.Parent := AParentPanel; 
    FGenericFrame.Align := alClient; 
end; 

procedure TFrameManager.DestroyGenericFrame; 
begin 
    FGenericFrame.Free; 
end; 

end. 

An dieser Stelle meiner Intension ist es, die Schnittstelle zu verwenden, für die beiden Rahmen zu schaffen, aber ich kann nicht erkennen, wie man erreiche diese Aufgabe. Mein Hauptformularcode ist dies:

unit Main; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
    System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, 
    Vcl.ExtCtrls, FramesManager, Vcl.StdCtrls, AppFrame1, AppFrame2; 

type 
    TfrmMain = class(TForm) 
    pnlCommands: TPanel; 
    pnlFrames: TPanel; 
    btnCrtFrame1: TButton; 
    btnCrtFrame2: TButton; 
    procedure FormCreate(Sender: TObject); 
    procedure btnCrtFrame1Click(Sender: TObject); 
    procedure btnCrtFrame2Click(Sender: TObject); 
    private 
    FFrame: IFrameManager; 
    public 
    { Public declarations } 
    end; 

var 
    frmMain: TfrmMain; 

implementation 

{$R *.dfm} 


procedure TfrmMain.FormCreate(Sender: TObject); 
begin 
    FFrame := TFrameManager.Create; 
end; 


procedure TfrmMain.btnCrtFrame1Click(Sender: TObject); 
begin 
    FFrame.CreateGenericFrame(pnlFrames, TFrame1); 
end; 

procedure TfrmMain.btnCrtFrame2Click(Sender: TObject); 
begin 
    FFrame.CreateGenericFrame(pnlFrames, TFrame2); 
end; 

end. 

Als ich co kompilieren das Projekt versuchen, erhalte ich diese Fehler:

[dcc32 Error] Main.pas(41): E2010 Incompatible types: 'TFrameClass' and 'class of TFrame1' 
[dcc32 Error] Main.pas(46): E2010 Incompatible types: 'TFrameClass' and 'class of TFrame2' 

So würde Ich mag zu verstehen, wie die beiden Rahmen vom Haupt erstellen. Wie kann ich der TFrameClass den richtigen Objekttyp zuweisen? Ich habe über Generika gelernt, aber ich habe keine Idee, wie diese Art von Schnittstelle zu implementieren, um einen "generischen" Rahmen zu öffnen, der von der Haupt erstellt werden kann, wenn die Verwendung wählen, um es zu öffnen.

Ich hoffe, ich habe mein Problem klar erklärt, aber ich weiß, dass es kompliziert erscheinen mag, zu verstehen.

Antwort

5
type 
    TFrameClass = class(TFrame) 
    end; 

Ihre TFrameClass Erklärung ist falsch. Gerade jetzt wird es als ein Nachkomme von TFrame deklariert, das nur eine andere Klasse ist.

Was Sie brauchen, ist ein class reference:

type 
    TFrameClass = class of TFrame; 

Da sowohl TFrame1 und TFrame2 von TFrame absteigen, können beide in eine TFrameClass Variable gesetzt werden.

Aber ich bin ziemlich sicher, dass diese TFrameClass bereits irgendwo in der VCL existiert, in diesem Fall müssen Sie diesen Typ nicht neu deklarieren.

Anschließend muss der Typ FGenericFrame private Feld TFrame statt TFrameClass werden.

(Auch dies nichts mit Generics zu tun hat.)

+0

Hallo NGLN, ich habe schon versuchen, die TFrameClass zu setzen, wie Sie sagen, aber in diesem Fall erhalte ich diesen Fehler: E2010 Inkompatible Typen: ‚TFrameClass‘ und 'TFrame' – Eros

+0

@Eros NGLN spricht die Frage an, die Sie gestellt haben. Wenn Sie stattdessen etwas anderen Code verwenden möchten, müssten Sie das tun. Sie können nicht erwarten, dass wir Code debuggen, den Sie uns nicht gezeigt haben. Denken Sie daran, dass wir kein Debugging-Dienst sind. Sie müssen immer noch bereit sein, sich etwas Mühe zu geben. –

+0

Hallo David, du hast Recht, aber ich habe viele Dinge versucht, also habe ich den letzten Code nicht gepostet. Ich habe den FramesManager-Code bearbeitet und jetzt ist es der, den ich in meinem Projekt habe. – Eros

Verwandte Themen