![]() |
FormularArray den richtigen Create aufrufen! Wie?
Neuer Versuch!
Gegeben sein TForm42,TForm43
Delphi-Quellcode:
Um jetzt ein Formular zu erzeugen, fehlt mir aber der Typ (TForm32.Create(Self)). Den bekomme ich doch sicher aus der RTTI oder?
type
TF : Array[1..2] of TForm; Habe es jetzt umgesetzt mit:
Delphi-Quellcode:
Jemand ne schönere Idee?
type
TShowForm = reference to Function(Owner : TComponent):TForm; var F : Array [1..2] of TShowForm; begin F[1] := Function(Owner:TComponent):TForm begin Result := TForm42.Create(Owner); end; F[2] := Function(Owner:TComponent):TForm begin result := TForm43.Create(Owner); end; F[1](self).Show; end; Mavarik |
AW: FormularArray den richtigen Create aufrufen! Wie?
Delphi-Quellcode:
So?
var
F : Array [1..2] of TFormClass; begin F[1] := TForm42; F[2] := TForm43; F[1].Create(Self).Show; end; Nja, und wie du schon erkannt hasst: Via TRTTI die Klasse suchen, als TFormClass casten und dann
Delphi-Quellcode:
.
F.Create(Self).Show;
|
AW: FormularArray den richtigen Create aufrufen! Wie?
Delphi-Quellcode:
Und wenn du deine Forms registrierst mit
var
F : Array [1..2] of TFormClass; begin F[1].Create( Self ).Show; end; ![]() ![]() ![]() |
AW: FormularArray den richtigen Create aufrufen! Wie?
Geht das nicht irgendwie in Richtung factory patterns? Quasi eine "Formfactory"?
Edit: Wahrsch. hab ich die Frage nicht verstanden, dann vergesst den ganzen Rest. Sowas hab ich mit Tips von hier mal für Frames gemacht.
Delphi-Quellcode:
unit uFrameFactory;
interface uses Projekt, fBaseFrame, fLAFrame, fKSTFrame, fSTOFrame, Controls, Classes, ADODB; Type TBaseFrameClass = class of TBaseFrame; Type TBaseFrameClassRec = record Name:String; Header:String; Klasse:TBaseFrameClass; end; const FrameClassList: Array[0..8{ggf. erhöhen}] of TBaseFrameClassRec = ( (Name: 'LA'; Header: 'Lohnarten'; Klasse: TLAFrame), (Name: 'KST'; Header: 'Kostenstellen'; Klasse: TKSTFrame), //... ); Type TFrameFactory = class private fParent : TWinControl; fOwner : TComponent; fCon : TADOConnection; //... function GetClassFromName(FrameName:String):TBaseFrameClass; function GetHeaderFromName(FrameName:String):String; public constructor create(Owner:TWinControl);overload; property Owner:TComponent read fOwner; property Parent:TWinControl read fParent write fParent; property Con:TADOConnection read fCon write fCon; function GetFrame(FrameName:String):TBaseFrame; end; implementation { TFrameFactory } constructor TFrameFactory.create(Owner: TWinControl); begin inherited create; fOwner:=Owner; end; function TFrameFactory.GetClassFromName(FrameName: String): TBaseFrameClass; var i: Integer; begin Result:=nil; for i := 0 to High(FrameClassList) do if FrameClassList[i].Name = FrameName then begin Result := FrameClassList[i].Klasse; break; end; end; function TFrameFactory.GetHeaderFromName(FrameName: String): String; var i: Integer; begin Result:=''; for i := 0 to High(FrameClassList) do if FrameClassList[i].Name = FrameName then begin Result := FrameClassList[i].Header; break; end; end; function TFrameFactory.GetFrame(FrameName: String): TBaseFrame; var f:TBaseFrame; begin f:=GetClassFromName(FrameName).Create(Owner); f.Parent:=Parent; f.Align:=alClient; f.Con:=Con; f.Header:=GetHeaderFromName(FrameName); //... Result:=f; end; end. |
AW: FormularArray den richtigen Create aufrufen! Wie?
Delphi-Quellcode:
uses unit4,unit5;
{$R *.dfm} type TShowForm = Reference to Function(Owner : TComponent):TForm; const FC: Array [1..2] of TFormClass=(Tform4,Tform5); var F : Array [1..2] of TShowForm; procedure TForm3.Button1Click(Sender: TObject); var s:TShowForm; begin s := F[2]; s(self).Show; end; procedure TForm3.FormCreate(Sender: TObject); begin F[1] := Function(Owner:TComponent):TForm begin Result := FC[1].Create(Owner); end; F[2] := Function(Owner:TComponent):TForm begin Result := FC[2].Create(Owner); end end; |
AW: FormularArray den richtigen Create aufrufen! Wie?
|
AW: FormularArray den richtigen Create aufrufen! Wie?
Kann man Konstruktoren nicht ggf. virtuell deklarieren? Das wäre ja quasi ein Paradebeispiel. (Oder sind sie es eventuell sogar schon? Kann's grad nicht selber prüfen.)
Edit: Ansonsten halt über eine virtuelle Init-Methode, die jede Form-Klasse selbst implementiert. |
AW: FormularArray den richtigen Create aufrufen! Wie?
Zitat:
![]()
Delphi-Quellcode:
virtual
|
AW: FormularArray den richtigen Create aufrufen! Wie?
Dann sollte ein Aufruf des Konstruktors über eine Basisklasse ab TComponent immer den richtigen liefern, wie Sir Rufo es oben schon hingeschrieben hat.
|
AW: FormularArray den richtigen Create aufrufen! Wie?
SUPER! Danke...
TFormClass kannte ich bisher noch nicht...:stupid: Hab das bis heute auch noch nie gebraucht... Danke auf für das FormFactry Beispiel. Soll so was ähnliches werden. Grüsse Mavarik |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:30 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