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

Alle Frames der Anwendung ermitteln

  Alt 19. Jun 2009, 12:07
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
  Mit Zitat antworten Zitat
martin_

Registriert seit: 19. Mai 2008
Ort: Österreich
89 Beiträge
 
#2

Re: Alle Frames der Anwendung ermitteln

  Alt 19. Jun 2009, 14:10
Auf der Form könntest du wieder ComponentCount anwenden.
  Mit Zitat antworten Zitat
Dawn87

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

Re: Alle Frames der Anwendung ermitteln

  Alt 19. Jun 2009, 14:25
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Alle Frames der Anwendung ermitteln

  Alt 19. Jun 2009, 14:55
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.
Andreas
  Mit Zitat antworten Zitat
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
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: Alle Frames der Anwendung ermitteln

  Alt 19. Jun 2009, 15:32
Zitat von Dawn87:
Ich habe es nun folgendermaßen gelöst:
Sauber gelöst
Aber ich glaube du hast TFrameManager.Destroy vergessen; coFrames sollte freigegeben werden, sonst Speicherleck.
Andreas
  Mit Zitat antworten Zitat
Dawn87

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

Re: Alle Frames der Anwendung ermitteln

  Alt 19. Jun 2009, 15:35
Da hast du vollkommen recht. Wird natürlich noch gemacht

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 11:21 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