Jetzt funkts einwandfrei.
Umgesetzt wie empfohlen über eine virtuelle Methode.
Jetzt kann ich jedes abgeleitete Form erzeugen zentral über die Methode StartChildForm erzeugen lassen und kann beliebige Parameter übergeben.
Tausend Dank für die großartige Hilfestellung.
Gruß Kostas
[Edit]
Was mit gerade wundert, ich habe mit Absicht die Methode SetMyParams aus dem Child Form entfernt. Das Form wird erzeugt ohne eine
Exception!
Ich rufe ja hier die Methode SetMyParams auf.
Eigentlich müsste man ein Interface benutzen. Dann ist man gezwungen die Methode im ChildForm zu implementieren.
Delphi-Quellcode:
with result as TfrmBaseChild do
begin
TfrmBaseChild(result).SetMyParams(Params);
end;
Delphi-Quellcode:
{------------------------------------------------------------------------------------------------------------}
{}function TfrMain2.StartChildForm(FormClass: TFormClass; Berechtigt:TBerechtigung; Params:TObject=nil):TForm;
{------------------------------------------------------------------------------------------------------------}
{-----------------------------------------}
{}procedure CreateAForm(var Result: TForm);
{-----------------------------------------}
begin
if FormClass.InheritsFrom(TfrMaster) then
begin
result := TFormClass(FormClass).Create(Application);
end;
if (result<>nil) then
begin
with result as TfrMaster do
begin
TfrMaster(result).SetMyParams(Params);
end;
AdvToolBar1.AddMDIChildMenu(result);
Inc(FChildCount);
result.OnClose := ChildFormClose;
AdvOfficeMDITabSet1.AddTab(result);
end;
end;{CreateAForm}
begin
CheckBerechtigtBis(Berechtigt); //führ Abort aus falls keine Berechtigung
result := nil;
if (GetKeyState(VK_LCONTROL)<0)then //mit Absicht eine weitere Instanz des ChildForms erzeugen
begin
CreateAForm(Result);
end else
begin
//existierendes Form in den Vordergrund holen
result := BringChildFormToFront(copy(FormClass.ClassName,2,Length(FormClass.ClassName)),'');
//neues Form erzeugen
if (result = nil)then
begin
CreateAForm(Result);
end;{if}
end;{if}
end;{StartChildForm}
//Das Masterformular aus dem geerbt wird
Delphi-Quellcode:
unit Master;
interface
uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs;
type
TfrMaster =
class(TForm)
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
procedure SetMyParams(
const Value: TObject);
virtual;
end;
var
frMaster: TfrMaster;
implementation
{$R *.dfm}
{ TForm1 }
procedure TfrMaster.SetMyParams(
const Value: TObject);
begin
inherited;
end;
end.
//Das ChildForm welches aus TfrMaster erbt
Delphi-Quellcode:
unit Adressen;
interface
uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs, Master;
type
TfrAdressen =
class(TfrMaster)
private
{ Private-Deklarationen }
FParams:TObject;
public
{ Public-Deklarationen }
procedure SetMyParams(
const Value: TObject);
override;
end;
var
frAdressen: TfrAdressen;
implementation
{$R *.dfm}
procedure TfrAdressen.SetMyParams(
const Value: TObject);
begin
inherited;
FParams := value;
end;
end.