Einzelnen Beitrag anzeigen

Dawn87

Registriert seit: 15. Feb 2007
Ort: Lüdenscheid
189 Beiträge
 
Delphi XE5 Professional
 
#5

Re: Alle Frames der Anwendung ermitteln

  Alt 19. Jun 2009, 15:08
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
  Mit Zitat antworten Zitat