7

インクルードファイルでさまざまなDelphiバージョンを処理するためのさまざまなdefineステートメントがあります。このインクルードファイルは、ユニットに「インクルード」されます。コンパイラーはインクルードファイルで指定された定義を尊重しますが、IDEは尊重しません。これにより、すでに存在している可能性のあるuses句に特定のユニットが追加されます(DEFINEコンパイラ指令で囲まれています)。

したがって、Delphi XE3より前のバージョンで使用できないユニットが追加された場合、IDEにユニットを追加さ​​せ、そのユニットがないDelphi XE3より前のバージョンでコンパイルできないため、大きな問題が発生します。

たとえば、TActionListを含む1つのユニットを持つプロジェクト。

  1. MYINCLUDE.INC1つだけ定義する{$DEFINE DELPHIXE3}

  2. サンプルユニットは次のようになります

    unit Unit1;
    
    {$I MYINCLUDE.INC}                
    
    uses
       Winapi.Windows, 
       Winapi.Messages, 
       System.SysUtils, 
       System.Variants, 
       System.Classes, 
       Vcl.Graphics,
       Vcl.Controls, 
       Vcl.Forms, 
       Vcl.Dialogs,
       {$IFDEF DELPHIXE3} System.Actions, {$ENDIF}
       Vcl.ActnList;
      ...
    
  3. 保存後、IDEがSystem.Actions追加し、使用リストの最後を追加します。これにより、識別子が再宣言されたコンパイラエラーが発生します。削除すると、IDEは次の保存で再度追加します。

QC#111178に報告しました。

そのバグの回避策はありますか?

キリスト教徒

4

1 に答える 1

3

おそらく最も簡単な方法は、ユニットエイリアス機能を使用して支援することです。これを機能させるには、コンパイラのバージョンごとに異なるプロジェクト設定が必要です。たとえば、サポートされているコンパイラのバージョンごとに異なる.dprファイルと.dprojファイルがあります。

XE2プロジェクトでは、次のようにユニットエイリアスを定義します。

System.Actions=Vcl.ActnList

XE3プロジェクトでは、そのエイリアスを省略します。

次に、.pasファイルで、どちらのバージョンのDelphiでも問題なくSystem.Actionsを問題なく使用できます。

System.Actionsさらに簡単な解決策は、XE2ビルドのプロジェクトにのみ含めるという名前の空のユニットを作成することです。

于 2012-12-08T09:38:56.083 に答える