Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.024 Beiträge
 
Delphi 12 Athens
 
#8

AW: Automatische Generierung der Formulare bei Serviceanwendung verhindern

  Alt 19. Apr 2019, 17:14
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat