![]() |
AW: FormularArray den richtigen Create aufrufen! Wie?
Zitat:
Delphi-Quellcode:
type
TFoo = class; TFooClass = class of TFoo; TFoo = class constructor Create( ABar : TBar ); virtual; class function CreateFoo( AFooClass : TFooClass; ABar : TBar ) : TFoo; overload; // Registrieren von Nachfahren und erzeugen über den Klassen- oder Alias-Namen class procedure RegisterClass( AFooClass : TFooClass ); overload; class procedure RegisterClass( const AAlias : string; AFooCLass : TFooClass ); class function CreateFoo( const AName : string; ABar : TBar ) : TFoo; overload; end; TSomeFoo = class( TFoo ) end; TConcreteFoo = class( TFoo ) constructor Create( Bar : TBar ); override; end; class function TFoo.CreateFoo( AFooCLass : TFooClass; ABar : TBar ) : TFoo; begin Result := AFooCLass.Create( ABar ); end; function CreateFooInstance( AFooClass : TFooClass; ABar : TBar ) : TFoo; begin Result := AFooClass.Create( ABar ); end; var LFoo : TFoo; LBar : TBar; // Erzeugt eine TConcreteFoo-Instanz LFoo := CreateFooInstance( TConcreteFoo, LBar ); LFoo := TFoo.CreateFoo( TConcreteFoo, LBar ); // Erzeugt eine TSomeFoo-Instanz LFoo := CreateFooInstance( TSomeFoo, LBar ); LFoo := TFoo.CreateFoo( TSomeFoo, LBar ); |
AW: FormularArray den richtigen Create aufrufen! Wie?
TFormClass selber mußt du nicht unbedingt kennen.
Delphi-Quellcode:
Das ist ein Typ, in den keine Instantzen des Typs reinkommen (wie bei TForm, wo TForm.Create und Nachkommen rein kommt),
type
TFormClass = class of TForm; sondern wo Typen reinkommen, welche z.B. davon abgeleitet sind. Das Wichtigste dabei ist nur, daß die gewünschte Methode (wie z.B. Create) im Basistyp virtual oder dynamic sein muß. |
AW: FormularArray den richtigen Create aufrufen! Wie?
Zitat:
Und weil es bei einem Problem meist schnell gehen muss, nimmt man die erst beste Idee, die man zur Lösung finden kann, auch wenn's bei weiterer Suche oder mehr Erfahrung vllt. einfacheres oder schöneres gegeben hätte. Hab die Hilfe dazu grad nur mal überflogen und gesehen, dass es das in D6 ja auch schon gibt, muss mir das aber auch nochmal in Ruhe angucken, genau wie das Beispiel in #11, wo mir noch nicht ganz klar ist, was das macht. Sieht aber auf jeden Fall interessant aus. Zu RegisterClass und FindClass: Verstehe ich das so, dass ich damit die Konstruktion mit dem Record und dem Array nicht brauchen würde? Aber wo/wie benutzt man dann RegisterClass? Sprich, das muss doch wahrscheinlich für jede Klasse einmal aufgerufen werden, oder? Im Constructor der Factory? |
AW: FormularArray den richtigen Create aufrufen! Wie?
Zitat:
Delphi-Quellcode:
Abschnitt, wo diese Klasse auch definiert wurde.
initialization
Das FindClass kann dann irgendwo aufgerufen werden. Dadurch kann man z.B. der MainForm Zugriff auf alle vorhandenen Formular-Klassen ermöglichen ohne die ganzen Formular-Units dort einzubinden. Ich baue mal ein kleines Beispiel zusammen ... stay tuned |
AW: FormularArray den richtigen Create aufrufen! Wie?
Zitat:
Zitat:
|
AW: FormularArray den richtigen Create aufrufen! Wie?
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Delphi-Quellcode:
) eingebunden sein, aber wenn die Klassen registriert sind, dann brauchen diese Units nirgendwo anders mit eingebunden werden.
.dpr
Zitat:
Hier der Code der MainForm
Delphi-Quellcode:
unit FormMain;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TMainForm = class( TForm ) FormNames_ListBox : TListBox; Form_Panel : TPanel; procedure FormNames_ListBoxClick( Sender : TObject ); private FForm : TForm; procedure CreateFormFromName( const FormName : string; Parent : TWinControl ); public { Public-Deklarationen } end; var MainForm : TMainForm; implementation {$R *.dfm} procedure TMainForm.CreateFormFromName( const FormName : string; Parent : TWinControl ); var LClass : TPersistentClass; begin if Assigned( FForm ) then begin FForm.Release; FForm := nil; end; // Wirft eine Exception, wenn die Klasse nicht gefunden wird // LClass := FindClass( FormName ); // Liefert einfach nur nil, wenn die Klasse nicht gefunden wird LClass := GetClass( FormName ); if Assigned( LClass ) and LClass.InheritsFrom( TForm ) then begin // Form-Instanz erzeugen FForm := TFormClass( LClass ).Create( Self ); // Ein bisschen Zucker drüber FForm.Parent := Parent; FForm.BorderStyle := bsNone; FForm.Align := alClient; // fertig FForm.Show; end; end; procedure TMainForm.FormNames_ListBoxClick( Sender : TObject ); begin CreateFormFromName( ( Sender as TListBox ).Items[( Sender as TListBox ).ItemIndex], Form_Panel ); end; initialization // In der Regel eigentlich nicht, aber hier ist es lustig :o) RegisterClass( TMainForm ); end. |
AW: FormularArray den richtigen Create aufrufen! Wie?
Zitat:
Eine Unit war in der DPR für eine BPL eingebunden, aber da diese Unit sonst in keiner anderen Unit aufgerufen wurde und auch nichts "direkt" aus der Unit verwendet wurde... Es sollte da auch nur etwas registriert werden. - In einer EXE einkompilert funktioniert es. - In einer BPL einkompiliert wurde diese Unit nicht initialisiert. Das passerte erst, nachdem die Unit explizit in einer anderen Unit eingebunden wurde. |
AW: FormularArray den richtigen Create aufrufen! Wie?
Zitat:
|
AW: FormularArray den richtigen Create aufrufen! Wie?
Liste der Anhänge anzeigen (Anzahl: 1)
Danke.
Kriegs in D6 kompiliert und gestartet, muss aber in den initialization Abschnitten jeweils eines der RegisterClassAlias auskommentieren sonst bekomme ich einen Laufzeitfehler. Siehe Bild. Woran könnte das liegen? Da ich auch ReportMemoryLeaksOnShutdown := True; auskommentieren musste: Wenn ich X mal hintereinander so das MainForm erzeuge und dann das vorderste wieder wechsele, werden dann die restlichen alle gelöscht (owner ist ja jeweils angegeben)? |
AW: FormularArray den richtigen Create aufrufen! Wie?
Es kann nur einen geben.
Es darf immer nur eine Klasse, mit dem selben Namen, zur gleichen Zeit registriert sein. Nochmal was Gleichnamiges registrieren knallt demnach. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:54 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