Domanda

Sto creando un'applicazione di servizio Windows che ha una configurazione per compilarla come applicazione Windows di base.Il file di progetto principale per exe include condizionali che determinano se il progetto viene compilato come applicazione di servizio o come applicazione Windows Form.

Il problema è che, quando faccio qualcosa che fa cambiare il codice del progetto, il codice viene distrutto e rotto.Ad esempio, una riga che dice Application.Initialize; diventa AppliApplication.Initialize; e la riga che ha {$R *.RES} viene ridotta a S} e la maggior parte dei miei condizionali vengono eliminati.

Mi chiedo se c'è un modo per superare questo problema, se ci sono dei trucchi o se devo solo sorridere e sopportarlo?

Ecco il file di seguito come vorrei che rimanesse ...

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.
È stato utile?

Soluzione

Come dice David, sei bloccato con l'IDE credendo che il dpr sia il suo cortile privato.La soluzione più semplice è avere tutto in un'unità separata e rimuovere i condizionali dalla clausola di utilizzo del dpr.FastMM tornerà utile nella versione del servizio e comunque nell'app di test e la distinzione tra vcl.forms e vcl.svcMgr può essere fatta in quell'unità separata.

dpr verrebbe ridotto a:

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;

E la tua unità applicativa principale prenderebbe il resto del codice dal 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.

Altri suggerimenti

La semplice risposta è creare un progetto diverso e utilizzarlo come versione standalone.Questo è ciò che faccio con i miei servizi e significa che puoi usare altri condizionali per adattarsi a ciascuna modalità.

Sì, l'IDE lo fa e lo ha sempre fatto.Non esiste un modo noto per impedire che si comporti in quel modo.Dovrai solo succhiarlo.

Ho condizionali simili e il modo in cui li gestisco è usare il mio sistema di controllo delle revisioni per aiutarmi, al momento del commit, ad annullare le modifiche apportate dall'IDE.Quindi ogni volta che eseguo il check in un file .dpr riesamino le differenze e ripristino quelle fasulle.

Provo anche ad aggiungere e rimuovere unità dal progetto modificando il file .dpr piuttosto che lasciare che sia l'IDE a farlo.Ciò tende a ridurre il tasso di incidenza dei mod fasulli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top