나는 프레임을 가지고 다시 여기있다.다른 프레임 유형을 인스턴스화하는 방법은 무엇입니까?
그것은 프레임의 사용을 이해하기 위해 만든 단지 간단한 양식입니다 : 나는이 기본 양식을했습니다. 양식의 상단에있는 두 개의 버튼으로 나는이 두 개의 프레임을 열고 싶습니다
프레임 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.
그래서 아무것도 : 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에 올바른 객체 유형을 할당하려면 어떻게해야합니까? 나는 제네릭에 대해 신경 써본 적이 있지만,이 인터페이스를 사용하여 메인 프레임에서 열 수있는 "일반"프레임을 열려면 인터페이스를 구현하는 방법을 모릅니다.
나는 분명히 내 문제를 설명했으면 좋겠지 만 이해가 복잡해 보일 수도 있습니다.
안녕 NGLN, 나는 이미 당신이 말하는대로 TFrameClass을 설정하려고했습니다. (또한,이 제네릭과는 아무 상관이 없습니다) 그러나이 경우 나는이 오류가 : E2010 호환되지 않는 유형을 'TFrameClass' 'TFrame' – Eros
@Eros NGLN은 귀하가 물어 본 질문에 답변하고 있습니다. 대신에 다른 코드와 마찬가지로 코드를 작성해야합니다. 우리에게 보여주지 않은 코드를 디버깅 할 수는 없습니다. 우리는 디버깅 서비스가 아님을 기억하십시오. 당신은 여전히 약간의 노력을 할 준비가되어 있어야합니다. –
안녕하세요, David, 맞습니다.하지만 마지막 코드를 게시하지 않았으므로 많은 것을 시도했습니다. FramesManager 코드를 편집했는데 이제는 프로젝트에서 사용한 코드입니다. – Eros