我在這裏再次與框架。 我有這個主要形式有:如何實例化不同的幀類型?
這只是爲了瞭解使用框架創建了一個簡單的形式。 隨着形式的頂部的兩個按鈕,我想開這兩個框架:
幀1
和式2
這裏是代碼第一幀的簡單代碼:
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? 我已經討論過泛型,但我不知道如何實現這種類型的接口,以便打開一個「通用」框架,當用戶選擇打開它時,可以從主體創建框架。
我希望我已經清楚地解釋了我的問題,但我知道看起來似乎很難理解。
嗨NGLN,我已經嘗試設置TFrameClass就像你說的,但在這種情況下,我收到此錯誤:E2010不兼容的類型:「TFrameClass」和'TFrame' – Eros
@Eros NGLN正在處理您提出的問題。如果你想代替其他代碼,你需要這樣做。你不能指望我們調試你沒有顯示給我們的代碼。請記住,我們不是一個調試服務。你仍然需要做好一些準備。 –
嗨大衛,你是對的,但我已經嘗試了很多東西,所以我沒有發佈最後的代碼。我編輯了FramesManager代碼,現在它是我在項目中使用的代碼。 – Eros