Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Alle Frames der Anwendung ermitteln (https://www.delphipraxis.net/135882-alle-frames-der-anwendung-ermitteln.html)

Dawn87 19. Jun 2009 11:07


Alle Frames der Anwendung ermitteln
 
Hallo,

gibt es eine Möglichkeit mir alle Frames die im Programm verfügbar sind ausgeben zu lassen?

Mit Application.Components kann ich mir nur Forms ausgeben lassen.

Grüße
Stefan

martin_ 19. Jun 2009 13:10

Re: Alle Frames der Anwendung ermitteln
 
Auf der Form könntest du wieder ComponentCount anwenden.

Dawn87 19. Jun 2009 13:25

Re: Alle Frames der Anwendung ermitteln
 
Hallo,

ich müsste irgendwie an die Info kommen, weil ich die prinzipiell in der Anwendung zur Verfügung stehenden Frames im Hauptformular beim Starten dynamisch erstellen möchte.

Im Prinzip würde es ja auch funktionieren, wenn sich die Frames in ihrem Initialization Abschnitt bei einer Klasse, welche die Frames verwaltet anmelden würden. Hab so etwas jedoch noch nie gemacht, werde da grad mal ein bißchen googeln.

Grüße
Stefan

shmia 19. Jun 2009 13:55

Re: Alle Frames der Anwendung ermitteln
 
Zitat:

Zitat von Dawn87
ich müsste irgendwie an die Info kommen...

Die Frames wurden mit RegisterClass() registriert und stehen in der globalen Variablen ClassList in der Unit Classes.
Leider ist ClassList von Aussen nicht zugänglich (gilt bis einschliesslich Delphi 5).
Bei höheren Delphi Versionen könnte es sein, dass Borland diese Tür aufgemacht hat, um man die registrierten Klassen durchlaufen kann.

Dawn87 19. Jun 2009 14:08

Re: Alle Frames der Anwendung ermitteln
 
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

shmia 19. Jun 2009 14:32

Re: Alle Frames der Anwendung ermitteln
 
Zitat:

Zitat von Dawn87
Ich habe es nun folgendermaßen gelöst:

Sauber gelöst :thumb:
Aber ich glaube du hast TFrameManager.Destroy vergessen; coFrames sollte freigegeben werden, sonst Speicherleck.

Dawn87 19. Jun 2009 14:35

Re: Alle Frames der Anwendung ermitteln
 
Da hast du vollkommen recht. Wird natürlich noch gemacht :-)

Grüße
Stefan


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz