5

Delphi の条件定義は 255 文字に制限されています。つまり、255 文字を超える定義がある場合、それらは無視されます。例えば

ここに画像の説明を入力

したがって、一連の条件は次のように定義されます。

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,

残念ながら、それは機能しません。これが機能しない理由は、条件定義の代わりに定義を使用できないためです。ファイルの最後までしか定義しません。

では、 Delphiの条件付き定義の 255 文字の制限を克服するにはどうすればよいでしょうか。


もちろん、問題は、ソース コード ファイルを共有しながら、プロジェクトレベルの定義を作成する方法です (共有ファイルは、プロジェクト フォルダーの外の独自のディレクトリにあります)。

4

2 に答える 2

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,

これで、プロジェクト オプションのリストをクリアし、代わりに必要な定義をそのファイルに追加できます。そのファイルを変更する場合、変更を有効にするために (単純なコンパイルではなく) 完全なビルドを実行する必要がある場合があります。

また、それほど多くのコンパイル変数が本当に必要かどうかを検討してください。それらのいくつかは常に定義されている可能性があるため、コンパイル時にそれらをチェックしても意味がありません。多分それらのいくつかは冗長です。

于 2013-07-15T18:11:02.953 に答える
0

私の Delphi は少しさびていますが、他のすべての定義も同様に定義されていることを表す定義を作成できるので、1 つの条件をチェックするだけで済みます。

{$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}
于 2013-07-15T17:48:36.960 に答える