![]() |
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 |
Re: Alle Frames der Anwendung ermitteln
Auf der Form könntest du wieder ComponentCount anwenden.
|
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 |
Re: Alle Frames der Anwendung ermitteln
Zitat:
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. |
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:
Die Klasse FrameManager verwaltet dort im die Klassen / Objekte zu den Frames:
initialization
begin if not Assigned(FrameManager) then begin FrameManager := TFrameManager.Create(nil); end; FrameManager.RegisterFrame(TFrame21); end;
Delphi-Quellcode:
Nun kann man in einer beliebigen Form durch alle angemeldeten Frames iterieren und diese je nach belieben einblenden:
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.
Delphi-Quellcode:
Das Beispiel erfordert eine ListBox.
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; 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 |
Re: Alle Frames der Anwendung ermitteln
Zitat:
Aber ich glaube du hast TFrameManager.Destroy vergessen; coFrames sollte freigegeben werden, sonst Speicherleck. |
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 06:22 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 by Thomas Breitkreuz