Usando condicionais na unidade principal do projeto - IDE destrói código
-
27-10-2019 - |
Pergunta
Estou construindo um aplicativo de serviço do Windows que tem uma configuração para compilá-lo como um aplicativo básico do Windows.O arquivo de projeto principal para o exe inclui condicionais que determinam se o projeto está sendo compilado como um aplicativo de serviço ou como um aplicativo de formulários do Windows.
O problema é que, quando faço algo que altera o código do projeto, o código é destruído e quebrado.Por exemplo, uma linha que diz Application.Initialize;
torna-se AppliApplication.Initialize;
e a linha que tem {$R *.RES}
é cortada para S}
, e a maioria das minhas condicionais é excluída.
Estou me perguntando se há uma maneira de superar esse problema, se há algum truque ou se eu só tenho que sorrir e aguentar?
Aqui está o arquivo abaixo, pois gostaria que ficasse ...
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.
Solução
Como David disse, você está preso ao IDE acreditando que o dpr é seu próprio quintal privado.A solução mais fácil é ter tudo em uma unidade separada e remover as condicionais da cláusula de uso do dpr.FastMM será útil em sua versão de serviço, bem como em seu aplicativo de teste de qualquer maneira, e a distinção entre vcl.forms e vcl.svcMgr pode ser feita nessa unidade separada.
dpr seria reduzido 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 sua unidade de aplicativo principal pegaria o resto do código do 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.
Outras dicas
A resposta simples é apenas criar um projeto diferente e usá-lo como uma versão autônoma.Isso é o que eu faço com meus serviços e significa que você pode usar outras condicionais para se adequar a cada modo.
Sim, o IDE faz isso e sempre fez.Não há maneira conhecida de impedir que se comporte assim.Você só vai ter que engolir.
Tenho condicionais semelhantes e a maneira como lido com eles é usando meu sistema de controle de revisão para me ajudar, na hora do commit, a desfazer as mudanças que o IDE faz.Portanto, sempre que eu verifico um arquivo .dpr, eu reviso as diferenças e reverto as falsas.
Também tento adicionar e remover unidades do projeto editando o arquivo .dpr em vez de permitir que o IDE faça isso.Isso tende a reduzir a taxa de incidência dos mods falsos.