2016-09-28 9 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. 

그래서 아무것도 : 63,210

여기에 두 번째 프레임의 코드입니다. 내 긴장은 두 개의 프레임을 생성하기위한 인터페이스를 사용하는이 시점에서

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' 

그래서 내가 주에서 두 개의 프레임을 만드는 방법을 이해하고 싶습니다 : 나는 공동 프로젝트를 컴파일하려고 할 때이 오류가 발생

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입니다 : TFrame에서 내려

type 
    TFrameClass = class of TFrame; 

TFrame1 모두 있기 때문에 TFrame2, 모두는 TFrameClass 변수에 넣을 수 있습니다.

그러나 나는이 TFrameClass가 이미 VCL 어딘가에 이미 존재한다고 확신합니다.이 경우에는이 유형을 재 선언 할 필요가 없습니다.

이어서 FGenericFrame 개인 필드의 유형은 TFrameClass 대신 TFrame이되어야합니다.

+0

안녕 NGLN, 나는 이미 당신이 말하는대로 TFrameClass을 설정하려고했습니다. (또한,이 제네릭과는 아무 상관이 없습니다) 그러나이 경우 나는이 오류가 : E2010 호환되지 않는 유형을 'TFrameClass' 'TFrame' – Eros

+0

@Eros NGLN은 귀하가 물어 본 질문에 답변하고 있습니다. 대신에 다른 코드와 마찬가지로 코드를 작성해야합니다. 우리에게 보여주지 않은 코드를 디버깅 할 수는 없습니다. 우리는 디버깅 서비스가 아님을 기억하십시오. 당신은 여전히 ​​약간의 노력을 할 준비가되어 있어야합니다. –

+0

안녕하세요, David, 맞습니다.하지만 마지막 코드를 게시하지 않았으므로 많은 것을 시도했습니다. FramesManager 코드를 편집했는데 이제는 프로젝트에서 사용한 코드입니다. – Eros