11

XE7 でコンパイルするように Delphi 2010 コードを変更しようとしています (2010 でコンパイルする機能を保持したいと考えています)。そのため、メインフォームを収容するユニットに、条件付きディレクティブを追加しました。以下は2010年に正常に動作します

uses 
  {$IF CompilerVersion >= 24}System.Actions, {$ELSE}Actnlist,{$IFEND}
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,  Dialogs;

しかし、XE7 は自動的にSystem.Actions末尾に を追加して uses 句を作成し、System.Actions が 2 回宣言され (以下を参照)、エラー メッセージが表示されます[dcc32 Error] MyForm.pas(10): E2004 Identifier redeclared: 'System.Actions'。XE7 が条件付きディレクティブ内からユニットを受け入れないのはなぜですか?

uses 
  {$IF CompilerVersion >= 24}System.Actions, {$ELSE}Actnlist,{$IFEND}
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,  Dialogs,
  System.Actions; // <- automatically added
4

4 に答える 4

14

Ken が言うように、interface uses 句は IDE によって変更され、これを達成するためのプロセスは洗練されていません (ご存じのとおり)。同じ問題がプロジェクトの uses 句に影響します。残念ながら、Form/DataModule uses 句の場合、これを回避するのははるかに困難です。

ユニット エイリアスを使用することもできますが(David Heffernan の回答を参照)、IDE が追加したいユニットのエイリアスを作成した場合でも、IDE は必要なユニットを認識しないため、必要なユニットへの参照を追加することに注意する必要があります。その必要なユニットを識別するエイリアス。Systemユニットへのエイリアスは、すべてのユニットですでに (暗黙的に) 使用されているため、これを回避します。

もう 1 つの方法は、このような条件を uses リストからすべて削除し、代わりに必要に応じてプレースホルダー ユニットを作成して、プロジェクトで使用するさまざまなコンパイラが、各 IDE が要求するリストから結合された単一の uses リストによってそれぞれ満たされるようにすることです。が必要です (IDE は未使用のユニットを uses リストから削除しません。これは多くの場合不満ですが、この場合は実際に問題の解決に役立ちます)。

この場合、Delphi 2010 プロジェクトで空のアクションユニットを作成します。

 unit Actions;
 interface
 implementation
 end.

もちろん、このユニットがXE7 バージョンのプロジェクトのプロジェクト パスに含まれていないことを確認する必要があります。

これを実現する 1 つの方法は、空のActions.pasユニットが DPR uses リストに明示的にリストされていないことを確認することですが、プロジェクト ソースのサブフォルダー (「プレースホルダー」など) に配置されます。次に、このサブフォルダを Delphi 2010 バージョンのプロジェクト検索パスに追加できますが、XE7 バージョンには追加できません。

 \Project Folder

     project2010.dpr
     project2010.dproj
     projectXE7.dpr
     projectXE7.dproj

     \placeholders
          Actions.pas

異なるバージョンごとにプレースホルダーが必要な場合は、個別のプレースホルダー フォルダーが必要になります。さらにバージョン固有のサブフォルダーを作成することもできます。たとえば、次のようになります。

     \placeholders
          \2010
               Actions.pas
          \XE7
               D2010UnitNotPresentInXE7.pas

この種の構造は、自動/自己文書化組織を作成するという観点から単純に推奨される場合があります。

これは、フォーム(またはフレームなど)のインターフェイスセクションのuses句でユニット参照を処理する場合にのみ必要であることに注意してください。非ビジュアル ユニットまたは実装セクションでは、IDE は干渉しないため、条件付きコンパイル ディレクティブはそこで問題を示さないはずです。

于 2014-10-02T00:25:34.833 に答える
1

何か問題があるのだろうか

{$IF CompilerVersion < 24}Actnlist,{$IFEND}

それともこれは学術的な議論ですか?

補遺...

System.Actions.dcu次に、何も含まないダミーを 2010 コンパイル パスに追加します。

私は、IDEが挿入を主張しuses ... System.Actions、2010には必要なものがあり、XE7には必要なものがあると理論付けています。

しかし、私は XE7 を持っていないので、テストできません。

于 2014-10-02T00:40:04.257 に答える