2016-09-28 3 views
3

私は再びここにフレームがあります。異なるフレームタイプをインスタンス化する方法は?

enter image description here

それはフレームの使用を理解するために作成しただけの単純な形式です: 私はこのメインフォームをしました。私はこの2つのフレームを開きたいフォームの上部にある2つのボタンを持つ :

FRAME1

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. 

、ここで第2のフレームのコードです:だから

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. 

二つのフレームで何も特別な。 私はこのようなインターフェイスを作成したメインフォームからフレームを開くために:私の意図は、2つのフレームを作成するためのインターフェイスを使用することですが、私はどのように実現することはできません。この時点で

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. 

このタスクに到達します。 私のメインフォームのコードはこれです:

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

は、だから私は、メインの2つのフレームを作成する方法を理解したいと思います:私は、共同プロジェクトをコンパイルしようとすると、私はこのエラーを受け取る

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. 

。 TFrameClassに正しいオブジェクトタイプを割り当てるにはどうすればよいですか? 私はジェネリックスについては苦労しましたが、この種のインターフェイスを実装して、メインフレームから開くことができる「汎用」フレームを開くために、このようなインターフェイスを実装する方法については考えていません。

私は明らかに私の問題を説明してくれることを望みますが、それは理解するのが難しいようです。

答えて

5
type 
    TFrameClass = class(TFrame) 
    end; 

TFrameClass宣言が間違っています。今はちょうど別のクラスであるTFrameの子孫として宣言されています。あなたが必要なもの

class referenceです:

type 
    TFrameClass = class of TFrame; 

TFrame1TFrame2両方がTFrameから派生しているので、両方がTFrameClass変数に入れることができます。

しかし、私はこのTFrameClassがすでにVCLのどこかに存在していると確信しています。その場合、このタイプを再宣言する必要はありません。

その後、FGenericFrameプライベートフィールドのタイプはTFrameClassの代わりにTFrameになる必要があります。

(また、これはジェネリックとは何の関係もありません。)

+0

こんにちはNGLN、私はすでにあなたが言うが、この場合には、私はこのエラーが発生したとしてTFrameClassを設定しようとしました:E2010互換性のないタイプ:「TFrameClass」を'TFrame' – Eros

+0

@Eros NGLNはあなたが尋ねた質問に対処しています。代わりに他のコードと同じようにしたい場合は、それを行う必要があります。あなたが私たちに示していないコードをデバッグすることは期待できません。私たちはデバッグサービスではないことを覚えておいてください。あなたはまだいくつかの努力をする準備が必要です。 –

+0

こんにちはDavid、あなたは正しいですが、私は最後のコードを投稿していないので、多くのことを試しました。私はFramesManagerのコードを編集しましたが、今は私のプロジェクトで使っているものです。 – Eros

関連する問題