Du kannst auch ein normales Datenmodul anlegen und automatisch erzeugen lassen, in dem du dann alles notwendige ausführst. Das würde die Besonderheiten aus der
DPR fernhalten.
Ich verwende diese Technik gern, wenn in einem
VCL-Projekt z.B. das MainForm von den Umgebungsbedingungen abhängt oder bestimmte Module und/oder Forms nur unter bestimmten Bedingungen erzeugt werden sollen. Dann lasse ich in der
DPR nur ein Loader-Datenmodul erzeugen, in dem dann alles notwendige passiert. Die Basisklasse dafür sieht dann in etwa so aus (nur die wesentlichen Methoden):
Delphi-Quellcode:
TdmBasicLoader = class(TDataModule)
private type
TComponentList = TList<TComponent>;
private
FLoader: TComponentList;
procedure AccessInstance(Lock: Boolean);
procedure FreeModules;
protected
procedure AddComponent(Component: TComponent);
procedure CreateModule(InstanceClass: TComponentClass; var Reference);
procedure InternalCreateDataModules; virtual;
procedure InternalCreateForms; virtual;
procedure InternalFinalize; virtual;
procedure InternalInitialize; virtual;
procedure InternalShutDown; virtual;
procedure InternalStartUp; virtual;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ShutDown;
procedure StartUp;
end;
procedure TdmBasicLoader.StartUp;
begin
InternalStartUp;
InternalCreateDataModules;
InternalCreateForms;
InternalInitialize;
end;
procedure TdmBasicLoader.ShutDown;
begin
InternalFinalize;
InternalShutDown;
FreeModules;
FLoader.Clear;
end;
procedure TdmBasicLoader.CreateModule(InstanceClass: TComponentClass; var Reference);
begin
Application.CreateForm(InstanceClass, Reference);
AddComponent(TComponent(Reference));
end;
In den jeweiligen Projekten leite ich dann dieses Loader-Modul ab und überschreibe die Internal-Methoden mit den entsprechenden Aufrufen. Der
DPR-Code sieht dann ungefähr so aus:
Delphi-Quellcode:
Application.Initialize;
Application.MainFormOnTaskBar := true;
Application.CreateForm(TdmLoader, dmLoader);
dmLoader.StartUp;
Application.Run;
dmLoader.ShutDown;
Durch das explizite ShutDown nach dem Run, kann ich genau die Reihenfolge für das Freigeben der Forms und Datenmodule kontrollieren und bin nicht auf das DoneApplication im finalization Teil der
Vcl.Forms
Unit angewiesen.