2016-09-28 53 views
3

我在這裏再次與框架。 我有這個主要形式有:如何實例化不同的幀類型?

enter image description here

這只是爲了瞭解使用框架創建了一個簡單的形式。 隨着形式的頂部的兩個按鈕,我想開這兩個框架:

幀1

enter image description here

和式2

enter image description here

這裏是代碼第一幀的簡單代碼:

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. 

,這裏是第二幀的代碼:

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. 

所以沒有在兩幀特殊。 爲了從主窗體打開幀我已經創建了一個這樣的接口:

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. 

此時我的內涵是使用界面創建兩個框架,但我不能認識到如何完成這項任務。 我主要形式的代碼是這樣的:

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. 

當我嘗試共同編制的項目,我收到此錯誤:

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

所以我想知道如何創建從主兩幀。 如何將正確的對象類型分配給TFrameClass? 我已經討論過泛型,但我不知道如何實現這種類型的接口,以便打開一個「通用」框架,當用戶選擇打開它時,可以從主體創建框架。

我希望我已經清楚地解釋了我的問題,但我知道看起來似乎很難理解。

回答

5
type 
    TFrameClass = class(TFrame) 
    end; 

您的TFrameClass聲明是錯誤的。現在它被聲明爲TFrame的後代,它只是另一個類。

你需要的是一個class reference

type 
    TFrameClass = class of TFrame; 

因爲無論TFrame1TFrame2TFrame下降,既可以放入TFrameClass變量。

但我很肯定這個TFrameClass已經存在於VCL的某個地方,在這種情況下你不必重新聲明這種類型。

隨後,FGenericFrame私有字段的類型需要變爲TFrame而不是TFrameClass

(同樣,這無關與泛型。)

+0

嗨NGLN,我已經嘗試設置TFrameClass就像你說的,但在這種情況下,我收到此錯誤:E2010不兼容的類型:「TFrameClass」和'TFrame' – Eros

+0

@Eros NGLN正在處理您提出的問題。如果你想代替其他代碼,你需要這樣做。你不能指望我們調試你沒有顯示給我們的代碼。請記住,我們不是一個調試服務。你仍然需要做好一些準備。 –

+0

嗨大衛,你是對的,但我已經嘗試了很多東西,所以我沒有發佈最後的代碼。我編輯了FramesManager代碼,現在它是我在項目中使用的代碼。 – Eros