Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi FormularArray den richtigen Create aufrufen! Wie? (https://www.delphipraxis.net/178830-formulararray-den-richtigen-create-aufrufen-wie.html)

Mavarik 30. Jan 2014 12:19


FormularArray den richtigen Create aufrufen! Wie?
 
Neuer Versuch!

Gegeben sein TForm42,TForm43

Delphi-Quellcode:
type
   TF : Array[1..2] of TForm;
Um jetzt ein Formular zu erzeugen, fehlt mir aber der Typ (TForm32.Create(Self)). Den bekomme ich doch sicher aus der RTTI oder?

Habe es jetzt umgesetzt mit:
Delphi-Quellcode:
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;
Jemand ne schönere Idee?

Mavarik

himitsu 30. Jan 2014 12:45

AW: FormularArray den richtigen Create aufrufen! Wie?
 
Delphi-Quellcode:
var
  F : Array [1..2] of TFormClass;
begin
  F[1] := TForm42;
  F[2] := TForm43;
  F[1].Create(Self).Show;
end;
So?

Nja, und wie du schon erkannt hasst:
Via TRTTI die Klasse suchen, als TFormClass casten und dann
Delphi-Quellcode:
F.Create(Self).Show;
.

Sir Rufo 30. Jan 2014 12:47

AW: FormularArray den richtigen Create aufrufen! Wie?
 
Delphi-Quellcode:
var
  F : Array [1..2] of TFormClass;
begin
  F[1].Create( Self ).Show;
end;
Und wenn du deine Forms registrierst mit Delphi-Referenz durchsuchenRegisterClass oder Delphi-Referenz durchsuchenRegisterClassAlias dann kannst du dir die über den Namen suchen Delphi-Referenz durchsuchenFindClass

Jumpy 30. Jan 2014 12:48

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.

Bummi 30. Jan 2014 12:48

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;

Sir Rufo 30. Jan 2014 12:52

AW: FormularArray den richtigen Create aufrufen! Wie?
 
@Jumpy

Warum nicht Delphi-Referenz durchsuchenRegisterClass bzw. Delphi-Referenz durchsuchenRegisterClassAlias und Delphi-Referenz durchsuchenFindClass?

Medium 30. Jan 2014 12:54

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.

Sir Rufo 30. Jan 2014 12:55

AW: FormularArray den richtigen Create aufrufen! Wie?
 
Zitat:

Zitat von Medium (Beitrag 1245969)
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.)

Ab Delphi-Referenz durchsuchenTComponent ist der auf jeden Fall
Delphi-Quellcode:
virtual

Medium 30. Jan 2014 13:06

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.

Mavarik 30. Jan 2014 13:33

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 08:08 Uhr.
Seite 1 von 5  1 23     Letzte »    

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