2013-07-15 3 views
5

Условные определения в Delphi ограничены 255 символами. Это означает, что если у вас более 255 символов заданий, они игнорируются. Например.Как преодолеть ограничение на 255 условных обозначений?

enter image description here

Таким образом, набор условных устанавливает:

Win32API;AlarmServerEngineVersion27;ImNotUsingOlderSimpleThread;EnableJclExceptionTracking;SaveExceptionsToDatabase;ShowExceptionForm;SNAPIN_NEEDS_NODE_DESCRIPTOR;VIRTUAL_TREES_MOUSE_DOWN_FOCUS_LAST;UseSQLServerLocking;SnapInFactoryFormClassIsOptional;Strict;SIFFCIO;Sqm 

Последние 3 определяет, игнорируются.

Что мне нужно, так это определить условные определения в проекте, не ограничиваясь 255 символами.

я думал, что, может быть, перемещение условных Определяет в исходный файл проекта, может быть включен в счет включают файл:

program ConsotoManager; 

{$R *.RES} 
{$R '..\Resource\Wumpa.res' '..\Resource\Wumpa.rc'} 
{$DEFINE Win32API} 
... 
{$DEFINE Sqm} 
{$DEFINE Strict} 

uses 
    FastMM4, 
    Windows, 
    SysUtils, 

К сожалению, оно не»работы. Причина, по которой он не работает, заключается в том, что вы не можете подменить определения для условных определений; определяет только последний до конца файла.

Итак, как я могу преодолеть ограничение на 255 символов на Условные значения в Delphi?


Проблема, конечно, состоит в том, чтобы иметь проект уровень определяет, в то время как у общий файлы исходного кода (общие файлы находятся в их собственных каталогах, вне папки проекта).

ответ

0

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

{$IF Defined(Win32API) 
    AND Defined(AlarmServerEngineVersion27) 
    AND Defined(ImNotUsingOlderSimpleThread) 
    AND Defined(EnableJclExceptionTracking) 
    AND Defined(SaveExceptionsToDatabase) 
    AND Defined(ShowExceptionForm) 
    AND Defined(SNAPIN_NEEDS_NODE_DESCRIPTOR) 
    AND Defined(VIRTUAL_TREES_MOUSE_DOWN_FOCUS_LAST) 
    AND Defined(UseSQLServerLocking) 
    AND Defined(SnapInFactoryFormClassIsOptional) 
    AND Defined(Strict) 
    AND Defined(SIFFCIO) 
    AND Defined(Sqm) 
} 
{$DEFINE I_AM_TOTALLY_READY} 
{$IFEND} 
9

Вы почти там с определениями, содержащимися в файле проекта, но помните, что Delphi не C - компилятор не читает каждый упомянутый блок в последовательности каждый раз, когда он компилирует ничего, как будто все файлы были вставлены вместе по тексту, поэтому в файле проекта не будут видны вещи, определенные в файле проекта.

Однако Delphi является как C в том, что он поддерживает директиву под названием include что делает потому что перечитывать упомянутый файл на каждой компиляции. Давайте использовать это.

Сначала вставьте все свои определения в отдельный текстовый файл. Назовем это Defines.inc.

{$DEFINE Win32API} 
... 
{$DEFINE Sqm} 
{$DEFINE Strict} 

Затем включите этот файл в все исходные файлы, которые нуждаются в какой-либо из этих определений.

program ConsotoManager; 

{$R *.RES} 
{$R '..\Resource\Wumpa.res' '..\Resource\Wumpa.rc'} 
{$INCLUDE Defines.inc} 

uses 
    FastMM4, 
    Windows, 

Теперь вы можете очистить список в своих вариантах проекта и вместо этого добавить все определения, которые вам нужны для этого файла. Когда вы меняете этот файл, вам может потребоваться выполнить полную сборку (а не просто компиляцию), чтобы изменения вступили в силу.

Кроме того, рассмотрите, действительно ли вам нужно столько переменных компиляции. Возможно, некоторые из них: всегда определены, поэтому нет смысла проверять их во время компиляции. Возможно, некоторые из них являются излишними.

+1

+1 для U + 2014: EM DASH! –

+1

Проблема - это общие файлы. Они имеют 15 лет новых функций и обратную совместимость, которые либо выбраны, либо вышли из одного проекта. Если я добавлю '{$ INCLUDE Defines.inc}' в начало 'VirtualTrees.pas', он не будет работать, потому что он не сможет найти' Defines.inc' (поскольку 'Defines.inc' сидит в исходной папке моего проекта. И даже если бы это сработало, я бы ввел перерыв в библиотеке, так как ни один из других проектов не будет иметь этот файл 'Defines.inc'. –

+0

Я начал задавать определение' Strict' разрешить другое определение. Таким образом, вы можете определить 'Strict', который автоматически включит некоторые из других определений. Я также дал определение' inuost' включить определение 'ImNotUsingOlderSimpleThread', как способ сохранить драгоценные символы. место в проекте, чтобы установить * «условное определение» *, которое работает над всеми скомпилированными единицами, а не только до конца единицы, в которой они определены. –

Смежные вопросы