2016-09-28 4 views
3

Я снова здесь с кадрами. Я эта основная форма:Как создавать различные типы кадров?

enter image description here

Это только простая форма, созданная для того, чтобы понять использование кадров. С помощью двух кнопок на верхней части формы я хотел бы открыть эти два кадра:

Frame1

enter image description here

и frame2

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; 

Так как TFrame1 и TFrame2 спускаются с TFrame, как можно поместить в TFrameClass переменную.

Но я уверен, что это TFrameClass уже существует где-то в VCL, и в этом случае вам не нужно повторно использовать этот тип.

Впоследствии тип FGenericFrame частного поля должен стать TFrame вместо TFrameClass.

(Кроме того, это не имеет ничего общего с генериков.)

+0

Привет NGLN, я уже пытаюсь установить TFrameClass, как вы говорите, но в этом случае я получаю эту ошибку: E2010 Несовместимые типы: «TFrameClass» и «TFrame» – Eros

+0

@Eros NGLN решает вопрос, который вы задали. Если вы хотите вместо этого использовать какой-то другой код, вам нужно будет это сделать. Вы не можете ожидать от нас отладки кода, который вы нам не показывали. Помните, что мы не являемся сервисом отладки. Вы все еще должны быть готовы приложить некоторые усилия. –

+0

Привет, Дэвид, ты прав, но я много чего пробовал, поэтому я не отправил последний код. Я редактировал код FramesManager, и теперь это тот, который у меня есть в моем проекте. – Eros

Смежные вопросы