AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Alle Frames der Anwendung ermitteln

Offene Frage von "Dawn87"
Ein Thema von Dawn87 · begonnen am 19. Jun 2009 · letzter Beitrag vom 19. Jun 2009
Antwort Antwort
Dawn87

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

Re: Alle Frames der Anwendung ermitteln

  Alt 19. Jun 2009, 14: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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz