Usando condicionales en la unidad principal del proyecto - IDE destruye el código
-
27-10-2019 - |
Pregunta
Estoy creando una aplicación de servicio de Windows que tiene una configuración para compilarla como una aplicación básica de Windows.El archivo de proyecto principal para el exe incluye condicionales que determinan si el proyecto se está compilando como una aplicación de servicio o como una aplicación de Windows Forms.
El problema es que, cuando hago algo que hace que el código del proyecto cambie, el código se destruye y se rompe.Por ejemplo, una línea que dice Application.Initialize;
se convierte en AppliApplication.Initialize;
y la línea que tiene {$R *.RES}
se reduce a S}
, y la mayoría de mis condicionales se eliminan.
Me pregunto si hay una manera de superar este problema, si hay algún truco o si solo tengo que sonreír y soportarlo.
Aquí está el archivo a continuación, ya que me gustaría que se quedara ...
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.
Solución
Como dice David, estás atascado con el IDE creyendo que el dpr es su propio patio trasero privado.La solución más sencilla es tener todo en una unidad separada y eliminar los condicionales de la cláusula de usos de la dpr.FastMM será útil en su versión de servicio, así como en su aplicación de prueba de todos modos, y la distinción entre vcl.forms y vcl.svcMgr se puede hacer en esa unidad separada.
dpr se reduciría 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;
Y su unidad de aplicación principal tomaría el resto del código del 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.
Otros consejos
La respuesta simple es simplemente crear un proyecto diferente y usarlo como la versión independiente.Esto es lo que hago con mis servicios, y significa que puedes usar otros condicionales para adaptarse a cada modo.
Sí, el IDE hace eso y siempre lo ha hecho.No hay forma conocida de evitar que se comporte así.Vas a tener que aguantarte.
Tengo condicionales similares y la forma en que los trato es usar mi sistema de control de revisiones para ayudarme, en el momento de confirmar, deshacer los cambios que hace el IDE.Entonces, cada vez que reviso un archivo .dpr, reviso las diferencias y revierto las falsas.
También trato de agregar y eliminar unidades del proyecto editando el archivo .dpr en lugar de dejar que el IDE lo haga.Esto tiende a reducir la tasa de incidencia de modificaciones falsas.