AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Automatische Generierung der Formulare bei Serviceanwendung verhindern
Thema durchsuchen
Ansicht
Themen-Optionen

Automatische Generierung der Formulare bei Serviceanwendung verhindern

Ein Thema von t2000 · begonnen am 18. Apr 2019 · letzter Beitrag vom 19. Apr 2019
Antwort Antwort
Benutzerbild von t2000
t2000

Registriert seit: 15. Dez 2005
Ort: NRW
212 Beiträge
 
Delphi 11 Alexandria
 
#1

Automatische Generierung der Formulare bei Serviceanwendung verhindern

  Alt 18. Apr 2019, 16:22
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
Thomas
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Automatische Generierung der Formulare bei Serviceanwendung verhindern

  Alt 19. Apr 2019, 09:07
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.
Peter Below
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Automatische Generierung der Formulare bei Serviceanwendung verhindern

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

Registriert seit: 15. Dez 2005
Ort: NRW
212 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Automatische Generierung der Formulare bei Serviceanwendung verhindern

  Alt 19. Apr 2019, 12:57
Ich habe mal die autom. Generierung ausgeschaltet. Werde mal abwarten.
Danke erstmal.
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000

Registriert seit: 15. Dez 2005
Ort: NRW
212 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Automatische Generierung der Formulare bei Serviceanwendung verhindern

  Alt 19. Apr 2019, 15:17
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.
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Automatische Generierung der Formulare bei Serviceanwendung verhindern

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

Registriert seit: 15. Dez 2005
Ort: NRW
212 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Automatische Generierung der Formulare bei Serviceanwendung verhindern

  Alt 19. Apr 2019, 16:55
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.
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.006 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
Benutzerbild von t2000
t2000

Registriert seit: 15. Dez 2005
Ort: NRW
212 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Automatische Generierung der Formulare bei Serviceanwendung verhindern

  Alt 19. Apr 2019, 18:16
Vielen Dank für daas Beispiel.
Ich denke, ich werde das mal so oder ähnlich ausprobieren.
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 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