Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Automatische Generierung der Formulare bei Serviceanwendung verhindern (https://www.delphipraxis.net/200427-automatische-generierung-der-formulare-bei-serviceanwendung-verhindern.html)

t2000 18. Apr 2019 16:22

Automatische Generierung der Formulare bei Serviceanwendung verhindern
 
Hallo zusammen,

ich habe eine Windows (64bit) Serviceanwendung. Darin enthalten ist ein abgeleitetes Datamodule.
Also es gibt TMeinDatenmodul = class(TDataModule) und davon abgeleitet TMeinErweitertesDatenmodul = class(TMeinDatenmodul)
In der Unit MeinDatenmodul gibt es die globale Variable MeinModul : TMeinDatenmodul;
In der Unilt MeinErweitertesDatenmodul gibt es KEINE globae Variable.

Jetzt macht Delphi (Rio 10.3.1) im Quelltext der Serviceanwendung die Generierung von
Application.CreateForm(TMeinDatenmodul, MeinModul);
Application.CreateForm(TMeinService, MeinService);

Unter den Projektoptionen bei Formulare steht nichts!

Ich möchte nun natürlich, dass im Projektquelltext folgendes steht:
Application.CreateForm(TMeinErweitertesDatenmodul, MeinModul);

Also das auf die Variable MeinModul ein erweitertes Modul erzeugt wird.
Wenn ich das so von Hand ändere, klappt auch alles einwandfrei und der Service läuft wie gewünscht.

Nachdem ich dann aber weiterprogrammiert habe, überschreibt Delphi immer wieder den Projekt-Quelltext mit dem ursprünglichen: Application.CreateForm(TMeinDatenmodul, MeinModul);

Meistens merke ich es nicht sofort und wundere mich das die Anwendung nicht richtig läuft.
In "normalen" Programmen, kann ich das alles über die manuelle Erzeugung der Formulare machen, aber beim Service geht das offensichtlich nicht.

Weiß jemand was hier zu tun ist?

LG Thomas

peterbelow 19. Apr 2019 09:07

AW: Automatische Generierung der Formulare bei Serviceanwendung verhindern
 
Zitat:

Zitat von t2000 (Beitrag 1430587)
Hallo zusammen,

ich habe eine Windows (64bit) Serviceanwendung. Darin enthalten ist ein abgeleitetes Datamodule.
Also es gibt TMeinDatenmodul = class(TDataModule) und davon abgeleitet TMeinErweitertesDatenmodul = class(TMeinDatenmodul)
In der Unit MeinDatenmodul gibt es die globale Variable MeinModul : TMeinDatenmodul;
In der Unilt MeinErweitertesDatenmodul gibt es KEINE globae Variable.

Jetzt macht Delphi (Rio 10.3.1) im Quelltext der Serviceanwendung die Generierung von
Application.CreateForm(TMeinDatenmodul, MeinModul);
Application.CreateForm(TMeinService, MeinService);

Unter den Projektoptionen bei Formulare steht nichts!

Das ist nicht normal. In einem Service wird normalerweise nur das Service-Objekt selbst per CreateForm erzeugt, alles andere muss man selbst im Kode erzeugen.
Hab's gerade mal ausprobiert (RIO 10.3.1), ein neues Serviceproject erzeugt, Platform auf Win64 gesetzt und gespeichert, ein TDatamodule dazugepackt und gespeichert, ein weiteres davon abgeleitet (per visual form inheritance) und gespeichert. Im DPR-File steht nur die CreateForm-Zeile für den Service selbst, keine für die beiden TDatamodules.

Lösch doch mal das DPROJ-File des Projektes (oder benenne es um), ebenso das DSK-File. Öffne das DPR-File in der IDE und setz die Projektoptionen neu. Danach funktioniert hoffentlich wieder alles wie es sollte.

Uwe Raabe 19. Apr 2019 09:26

AW: Automatische Generierung der Formulare bei Serviceanwendung verhindern
 
Man kann die IDE daran hindern, automatisch die Formulare und Datenmodule zu erzeugen. Die zugehörige Option findet man in 10.3 unter Tools - Optionen - Benutzeroberfläche- Formular-Designer - Optionen für die Modulerzeugung - Autom. Formulare & Datenmodule.

Allerdings könnte es dein spezielles Problem vielleicht gar nicht lösen, da du eine vom Standard abweichende Anforderung hast (Typ und Variablenname passen nicht zusammen):
Code:
Ich möchte nun natürlich, dass im Projektquelltext folgendes steht:
Application.CreateForm(TMeinErweitertesDatenmodul, MeinModul);
Musst du halt mal probieren.

t2000 19. Apr 2019 12:57

AW: Automatische Generierung der Formulare bei Serviceanwendung verhindern
 
Ich habe mal die autom. Generierung ausgeschaltet. Werde mal abwarten.
Danke erstmal.

t2000 19. Apr 2019 15:17

AW: Automatische Generierung der Formulare bei Serviceanwendung verhindern
 
Es ist gerade wieder passiert. Nach einigen "Erzeugen" und auch zwischnzeitlichen Neustart von Delphi wurde im Service-Quelltext die Create-Routiune automatisch überschrieben.
Trotz der neuen Einstellung, dass keine automatische Erzeugung gemacht werden soll.

Ich denke, ich werde irgendein Kontrollcode einbauen müssen, damit mir das nicht versehentlich passiert. Am besten etwas, dass schon beim Compilieren meckert und nicht erst beim Start.

Uwe Raabe 19. Apr 2019 15:57

AW: Automatische Generierung der Formulare bei Serviceanwendung verhindern
 
Ich vermute, es liegt an dieser Abnormität bezüglich Typname und Variablenname. Wenn du das irgendwie bereinigt kriegst, sollte das Problem behoben sein. Du könntest z.B. den Aufruf
Delphi-Quellcode:
Application.CreateForm(TMeinErweitertesDatenmodul, MeinModul);
in die Klasse TMeinErweitertesDatenmodul verlagern und mit einer globalen oder Klassen-Methode im DPR-Code aufrufen.

Die IDE hat so ihre eigenen Vorstellungen vom Code in der DPR und man sollte möglichst nicht dagegen arbeiten.

t2000 19. Apr 2019 16:55

AW: Automatische Generierung der Formulare bei Serviceanwendung verhindern
 
Ich werde das mal durchdenken. Aber es ist ja nicht nur die erweiterte Klasse.
Ich habe ein großes Projekt, bestehend aus, na ja, ich sag mal Microservices. Die zentrale Funktionsweise ist bei allen gleich. Das ist in dem Basis-Datenmodul abgebildet.
Nun hat jeder Microservice seine spezielle Aufgabe. Die sind dann in der abgeleiteten Version.
Daher sollte die Spezialversion (ErweiterteDatenmodul) möglichst wenig machen.

Aber du hast Recht, ich sollte eine globale Klasse entwickeln, die das alles steuert. Wie gesagt, ich muss ein wenig darüber nachdenken wie es am sinnvollsten für die Zukunft ist.
Dies wird die Basis für ein min. 10-jährige Pflege bzw. Weiterentwicklung. Also besser einige Stunden länger überlegen und testen.

Uwe Raabe 19. Apr 2019 17:14

AW: Automatische Generierung der Formulare bei Serviceanwendung verhindern
 
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.

t2000 19. Apr 2019 18:16

AW: Automatische Generierung der Formulare bei Serviceanwendung verhindern
 
Vielen Dank für daas Beispiel.
Ich denke, ich werde das mal so oder ähnlich ausprobieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:45 Uhr.

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