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

时间:2012-02-17 18:55:49

标签: delphi delphi-xe2 conditional-compilation project-files

我正在构建一个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.

3 个答案:

答案 0 :(得分:5)

正如大卫所说,你坚持让IDE相信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;

您的主应用程序单元将从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.

答案 1 :(得分:3)

简单的答案是创建一个不同的项目并将其用作独立版本。这就是我对我的服务所做的事情,这意味着你可以使用其他条件来适应每种模式。

答案 2 :(得分:2)

是的,IDE会这样做并且始终如此。没有已知的方法来阻止它表现得那样。你只需要搞砸它。

我有类似的条件,我处理它们的方式是使用我的修订控制系统来帮助我在提交时撤消IDE所做的更改。因此,每当我签入.dpr文件时,我都会检查这些差异并恢复虚假的文件。

我还尝试通过编辑.dpr文件来添加和删除项目中的单元,而不是让IDE执行此操作。这往往会降低虚假模式的发生率。