在项目主单元中使用条件 - IDE会破坏代码

Jer*_*dge 3 delphi conditional-compilation project-files delphi-xe2

我正在构建一个Windows服务应用程序,它具有将其编译为基本Windows应用程序的配置.exe的主项目文件包括条件,用于确定项目是作为服务应用程序还是作为Windows窗体应用程序编译.

问题是,当我做一些使项目代码发生变化的事情时,代码就会被破坏和破坏.例如,一行表示Application.Initialize;变为AppliApplication.Initialize;和已{$R *.RES}减少的行S},并且我的大部分条件都被删除.

我想知道是否有办法克服这个问题,如果有任何技巧,或者我是否只需要笑着忍受它?

这是下面的文件,因为我希望它留下来......

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.
Run Code Online (Sandbox Code Playgroud)

Mar*_*ema 5

正如大卫所说,你坚持认为dpr是自己的私人后院.最简单的解决方案是将所有内容放在一个单独的单元中,并从dpr的uses子句中删除条件.无论如何,FastMM将在您的服务版本和测试应用程序中派上用场,并且vcl.forms和vcl.svcMgr之间的区别可以在该单独的单元中进行.

dpr将减少为:

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;
Run Code Online (Sandbox Code Playgroud)

并且您的主应用程序单元将从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.
Run Code Online (Sandbox Code Playgroud)