3

Я создаю приложение для Windows, которое имеет конфигурацию для его компиляции в качестве основного приложения Windows. Основной файл проекта для exe включает в себя условные выражения, которые определяют, скомпилирован ли проект в качестве приложения-службы или как приложение форм Windows.Использование условных выражений в основном блоке проекта - IDE уничтожает код

Проблема в том, что когда я делаю что-то, что меняет код проекта, код разрушается и прерывается. Например, строка, которая указывает 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. 
+0

Хотя я думаю, что знаю, в чем ваш вопрос, я не вижу нигде, где вы прямо задаете вопрос. –

+0

Немного странно, что вы переключаетесь между сервисом и графическим интерфейсом с условным. Переключение между сервисом и скрытым стандартным приложением будет иметь больше смысла. И в этом случае коммутатор будет лучше в качестве аргумента командной строки. Является ли приложение GUI интерфейсом к вашему сервису? Если это так, то отдельный проект будет казаться более естественным. –

+0

Существует как форма VCL, так и модуль служебных данных. В зависимости от конфигурации сборки (у меня есть 3) одна конфигурация объявит «TestApp», где я могу, в свою очередь, использовать условные выражения, чтобы определить, следует ли ее компилировать как службу или приложение VCL. Они не используют друг друга вообще. 'TJDRMSvr' - это модуль служебных данных, а' TJDRMSvrTest' - это форма приложения. Приложение разработано с некоторыми возможностями запуска/остановки и ведения журнала, поэтому я могу просматривать журналы в режиме реального времени, а не открывать/обновлять файл журнала, и я могу начать/остановить рабочий поток (отдельный) по мере необходимости. –

ответ

5

Как говорит Дэвид, вы застряли в IDE, полагая, что dpr - это собственный частный двор. Самое простое решение - просто иметь все в отдельном блоке и удалять условные выражения из предложения использования dpr. FastMM пригодится как в вашей версии сервиса, так и в тестовом приложении, и различие между vcl.forms и vcl.svcMgr может быть выполнено в этом отдельном блоке.

ДПР будет снижено до:

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; 

И ваш блок главного приложения будет взять остальную часть кода из ДПР:

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. 
+0

+1 Если вы можете сделать это так, то это решение, но есть моменты, когда вы не можете. Например, если вы хотите переключить менеджеров памяти на условное. –

+0

@DavidHeffernan: да, диспетчер памяти или любой другой блок «Я должен быть первым», который должен быть включен условно, действительно означал бы, что вам нужно будет полагаться на свой исходный элемент управления, чтобы ваш dpr «нормальный». –

+0

Я не знаю, что случилось - как день или два назад я поддержал, принял и прокомментировал этот ответ. Теперь, как будто я никогда ничего не делал. Re-accepted: D –

2

Да, IDE делает это и всегда делал. Не существует известного способа остановить это поведение. Тебе просто придется втянуть его.

У меня есть аналогичные условия и то, как я с ними справляюсь, это использовать мою систему контроля версий, чтобы помочь мне в момент фиксации отменить изменения, которые делает IDE. Поэтому всякий раз, когда я проверяю файл .dpr, я просматриваю различия и возвращаю фиктивные.

Я также пытаюсь добавить и удалить единицы из проекта, отредактировав файл .dpr, а не позволяя IDE делать это. Это, как правило, снижает частоту появления фальшивых мод.

3

Простого ответ просто создать другой проект и использовать это как автономную версию. Это то, что я делаю с моими услугами, и это означает, что вы можете использовать другие условные обозначения для каждого режима.

+0

+1 Да, это работает и то, что я делал изначально тоже, но это тоже стало проблемой, потому что каждое изменение, которое я делал, пришлось делать в двух разных файлах проекта (добавление/удаление единиц и т. д.). Я также намерен добавить больше кода в файл проекта, то есть код, который нужно будет дублировать. –

+0

Это только дублируется, если вы не можете переместить дублирующий код в отдельный блок, где он может быть вызван двумя файлами .dpr. –