Я снова здесь с кадрами. Я эта основная форма:Как создавать различные типы кадров?
Это только простая форма, созданная для того, чтобы понять использование кадров. С помощью двух кнопок на верхней части формы я хотел бы открыть эти два кадра:
Frame1
и frame2
здесь код простой код первого кадра:
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