Ich bin wieder hier mit Frames. Ich habe diese Hauptform:Wie werden verschiedene Rahmentypen instanziiert?
Es ist nur eine einfache Form geschaffen, um die Verwendung von Frames zu verstehen. Mit den beiden Tasten auf der Oberseite der Form würde Ich mag diese beiden Frames öffnen:
Frame1
und Frame2
hier der Code der einfacher Code des ersten Rahmens:
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.
und hier ist der Code des zweiten Rahmens:
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.
Also nichts Besonderes in den beiden Rahmen. um den Rahmen aus der Hauptform zu öffnen Ich habe eine Schnittstelle wie folgt erstellt:
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.
An dieser Stelle meiner Intension ist es, die Schnittstelle zu verwenden, für die beiden Rahmen zu schaffen, aber ich kann nicht erkennen, wie man erreiche diese Aufgabe. Mein Hauptformularcode ist dies:
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.
Als ich co kompilieren das Projekt versuchen, erhalte ich diese Fehler:
[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'
So würde Ich mag zu verstehen, wie die beiden Rahmen vom Haupt erstellen. Wie kann ich der TFrameClass den richtigen Objekttyp zuweisen? Ich habe über Generika gelernt, aber ich habe keine Idee, wie diese Art von Schnittstelle zu implementieren, um einen "generischen" Rahmen zu öffnen, der von der Haupt erstellt werden kann, wenn die Verwendung wählen, um es zu öffnen.
Ich hoffe, ich habe mein Problem klar erklärt, aber ich weiß, dass es kompliziert erscheinen mag, zu verstehen.
Hallo NGLN, ich habe schon versuchen, die TFrameClass zu setzen, wie Sie sagen, aber in diesem Fall erhalte ich diesen Fehler: E2010 Inkompatible Typen: ‚TFrameClass‘ und 'TFrame' – Eros
@Eros NGLN spricht die Frage an, die Sie gestellt haben. Wenn Sie stattdessen etwas anderen Code verwenden möchten, müssten Sie das tun. Sie können nicht erwarten, dass wir Code debuggen, den Sie uns nicht gezeigt haben. Denken Sie daran, dass wir kein Debugging-Dienst sind. Sie müssen immer noch bereit sein, sich etwas Mühe zu geben. –
Hallo David, du hast Recht, aber ich habe viele Dinge versucht, also habe ich den letzten Code nicht gepostet. Ich habe den FramesManager-Code bearbeitet und jetzt ist es der, den ich in meinem Projekt habe. – Eros