私は再びここにフレームがあります。異なるフレームタイプをインスタンス化する方法は?
それはフレームの使用を理解するために作成しただけの単純な形式です: 私はこのメインフォームをしました。私はこの2つのフレームを開きたいフォームの上部にある2つのボタンを持つ :
FRAME1
とフレーム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.
、ここで第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に正しいオブジェクトタイプを割り当てるにはどうすればよいですか? 私はジェネリックスについては苦労しましたが、この種のインターフェイスを実装して、メインフレームから開くことができる「汎用」フレームを開くために、このようなインターフェイスを実装する方法については考えていません。
私は明らかに私の問題を説明してくれることを望みますが、それは理解するのが難しいようです。
こんにちはNGLN、私はすでにあなたが言うが、この場合には、私はこのエラーが発生したとしてTFrameClassを設定しようとしました:E2010互換性のないタイプ:「TFrameClass」を'TFrame' – Eros
@Eros NGLNはあなたが尋ねた質問に対処しています。代わりに他のコードと同じようにしたい場合は、それを行う必要があります。あなたが私たちに示していないコードをデバッグすることは期待できません。私たちはデバッグサービスではないことを覚えておいてください。あなたはまだいくつかの努力をする準備が必要です。 –
こんにちはDavid、あなたは正しいですが、私は最後のコードを投稿していないので、多くのことを試しました。私はFramesManagerのコードを編集しましたが、今は私のプロジェクトで使っているものです。 – Eros