Hallo shmia,
sieht so aus als ob das ganze wohl immernoch versperrt ist.
Ich habe es nun folgendermaßen gelöst:
In jeder
Unit die einen Frame beherbergt habe ich einen Initialization Teil der folgendermaßen aussieht:
Delphi-Quellcode:
initialization
begin
if not Assigned(FrameManager) then
begin
FrameManager := TFrameManager.Create(nil);
end;
FrameManager.RegisterFrame(TFrame21);
end;
Die Klasse FrameManager verwaltet dort im die Klassen / Objekte zu den Frames:
Delphi-Quellcode:
unit FrameMgrU;
interface
uses Forms, Classes, Generics.Collections;
type TFrameClass =
class of TFrame;
type TFrameClassObject =
class
public
FrameClass: TFrameClass;
FrameObject: TFrame;
end;
type TFrameManager =
class
private
FOwner: TComponent;
coFrames: TObjectList<TFrameClassObject>;
function GetFrameCount: Integer;
function GetFrame(
Index: Integer): TFrameClassObject;
public
constructor Create(AOwner: TComponent);
procedure RegisterFrame(AFrame: TFrameClass);
property FrameCount: Integer
read GetFrameCount;
property Frames[
Index: Integer]: TFrameClassObject
read GetFrame;
end;
var
FrameManager: TFrameManager;
implementation
{ TFrameManager }
constructor TFrameManager.Create(AOwner: TComponent);
begin
FOwner := AOwner;
coFrames := TObjectList<TFrameClassObject>.Create;
end;
function TFrameManager.GetFrame(
Index: Integer): TFrameClassObject;
begin
Result := coFrames[
Index];
end;
function TFrameManager.GetFrameCount: Integer;
begin
Result := coFrames.Count;
end;
procedure TFrameManager.RegisterFrame(AFrame: TFrameClass);
var
coFrame: TFrameClassObject;
begin
coFrame := TFrameClassObject.Create;
coFrame.FrameClass := AFrame;
coFrame.FrameObject := AFrame.Create(
nil);
coFrames.Add(coFrame);
end;
end.
Nun kann man in einer beliebigen Form durch alle angemeldeten Frames iterieren und diese je nach belieben einblenden:
Delphi-Quellcode:
procedure TForm20.FormShow(Sender: TObject);
var
i: Integer;
begin
for i := 0 to FrameManager.FrameCount - 1 do
begin
ListBox1.AddItem(FrameManager.Frames[i].FrameClass.ClassName,
FrameManager.Frames[i].FrameObject);
end;
end;
procedure TForm20.ListBox1Click(Sender: TObject);
var
coFrame: TFrame;
i: Integer;
begin
for i := 0 to FrameManager.FrameCount - 1 do
begin
FrameManager.Frames[i].FrameObject.Visible := false;
end;
coFrame := (ListBox1.Items.Objects[ListBox1.ItemIndex] as TFrame);
coFrame.Parent := self;
coFrame.Width := self.Width;
coFrame.Left := 0;
coFrame.Height := self.Height;
coFrame.Top := ListBox1.Top + ListBox1.Height + 10;
coFrame.Visible := true;
end;
Das Beispiel erfordert eine ListBox.
Klappt super. Einen kleinen Nachteil hat das ganze:
Im Initialization-Teil muss bei jeder Klasse darauf geachtet werden, dass man dort den jeweiligen Namen des Frames einträgt:
FrameManager.RegisterFrame(
TFrame21);
Grüße
Stefan