Question

Je construis une application de service Windows qui a une configuration pour le compiler comme une application Windows de base. Le fichier principal de projet pour l'exe comprend conditionals qui déterminent si le projet est en cours d'élaboration comme une application de service ou une application Windows de formes.

Le problème est, quand je fais quelque chose qui rend le changement de code du projet, le code est détruit et brisé. Par exemple, une ligne qui dit Application.Initialize; devient AppliApplication.Initialize; et la ligne qui a {$R *.RES} se réduit à S}, et la plupart de mes conditionals sont supprimés.

Je me demande s'il y a un moyen de remédier à ce problème, s'il y a des trucs, ou si je dois juste sourire et le supporter?

Voici le fichier ci-dessous comme je le voudrais rester ...

program JDRMServer;

uses
{$IFDEF TESTAPP}
  FastMM4,
  Vcl.Forms,
{$ELSE}
  Vcl.SvcMgr,
{$ENDIF TESTAPP}
  uJDRMServer in 'uJDRMServer.pas' {JDRMSvr: TService},
  uJDRMSessions in 'uJDRMSessions.pas',
  uJDRMSvrCli in 'uJDRMSvrCli.pas',
  uJDRMSvrDsh in 'uJDRMSvrDsh.pas',
  JDDB in 'JDDB.pas',
  uJDRMServerTEST in 'uJDRMServerTEST.pas' {JDRMSvrTest},
  uJDRMServerThread in 'uJDRMServerThread.pas',
  uJDRMSvrMessages in 'uJDRMSvrMessages.pas';

{$R *.RES}

begin

{$IFDEF TESTAPP}
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TJDRMSvrTest, JDRMSvrTest);
{$ELSE}
  if (not Application.DelayInitialize) or (Application.Installing) then
    Application.Initialize;
  Application.CreateForm(TJDRMSvr, JDRMSvr);
{$ENDIF TESTAPP}
  Application.Run;
end.
Était-ce utile?

La solution

Comme David dit, vous êtes coincé avec l'IDE croyant que le DPR est sa propre arrière-cour privée. La solution la plus simple est d'avoir juste tout dans une unité séparée et retirez les conditionals de la clause uses du DPR. FastMM sera utile dans votre version de service, ainsi que dans votre application de test de toute façon et la distinction entre vcl.forms et vcl.svcMgr peut être fait dans cette unité séparée.

RRM serait réduite à:

uses
  FastMM4,
  YourAppMain,
  uJDRMServer,
  uJDRMSessions,
  uJDRMSvrCli in 'uJDRMSvrCli.pas',
  uJDRMSvrDsh in 'uJDRMSvrDsh.pas',
  JDDB in 'JDDB.pas',
  uJDRMServerTEST in 'uJDRMServerTEST.pas' {JDRMSvrTest},
  uJDRMServerThread in 'uJDRMServerThread.pas',
  uJDRMSvrMessages in 'uJDRMSvrMessages.pas';

{$R *.RES}

begin
  YourAppMain.Execute;
end;

Et votre unité d'application principale prendrait le reste du code du DPR:

unit YourAppMain;

interface

procedure Execute;

implementation

uses
{$IFDEF TESTAPP}
  Vcl.Forms,
{$ELSE}
  Vcl.SvcMgr,
{$ENDIF TESTAPP}
  OtherUnits;

procedure Execute;
begin
{$IFDEF TESTAPP}
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TJDRMSvrTest, JDRMSvrTest);
{$ELSE}
  if (not Application.DelayInitialize) or (Application.Installing) then
    Application.Initialize;
  Application.CreateForm(TJDRMSvr, JDRMSvr);
{$ENDIF TESTAPP}
  Application.Run;
end;

end.

Autres conseils

La réponse simple est de créer simplement un projet différent et l'utiliser comme la version autonome. C'est ce que je fais avec mes services, et cela signifie que vous pouvez utiliser d'autres conditionals en fonction de chaque mode.

Oui, l'IDE fait cela et a toujours fait. Il n'y a aucun moyen connu pour arrêter de se comporter comme ça. Vous allez juste devoir le sucer.

Je conditionals similaires et la façon dont je traite avec eux est d'utiliser mon système de contrôle de révision pour me aider, à consacrer du temps, annuler les modifications que les marques IDE. Donc, chaque fois que je vérifie dans un fichier .dpr je passe en revue les différences et rétablir les de faux.

J'essaie aussi d'ajouter et de supprimer des unités du projet en éditant le fichier .dpr plutôt que de laisser l'IDE faire. Cela tend à réduire le taux d'incidence des mods de faux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top