Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2011年09月23日] [更新 2013年04月11日] Delphi 一般・その他
Delphi XE2 のユニットスコープと uses 部
動作確認等 Windows 7 U64 + Delphi 2010 Pro
Windows 7 U64 + Delphi XE2 Pro VCL-32, VCL-64
[整理番号 - 0930]







01_ユニットスコープと uses 部


Delphi XE2 では、ユニット名にプリフィクスが付くようになりました。これをユニットスコープ、つまり、ユニットスコープ名といいます。DEKO さんのサイトに詳しい説明があります。オンライン・ヘルプへのリンクもありますので、そちらを参考にしてください。


リスト1
Delphi XE2 で [VCL フォームアプリケーション] を新規作成した場合の uses 部
ユニットスコープ名が付くようになっている
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, 
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.




02_前のバージョンのプロジェクトを XE2 以降で使用する場合


Delphi XE2 よりも前の Delphi で作成した uses 部には、ユニットスコープ名は付いていませんが、Delphi XE2 でもそのままコンパイルして実行できます。
サンプルプログラム集のプロジェクトの場合、そのままでは、Win32 アプリ、Win64 アプリ用の別々のフォルダは作成されません。プロジェクトのフォルダに EXE が作成されます。
必要であれば、プロジェクトのオプションから、[Delphi コンパイラ] [出力ディレクトリ] の設定を行います。ただし、その設定を行うと Delphi XE2 よりも前のバージョンではプロジェクトを正常に起動することはできなくなります。

前のバージョンのプロジェクトのフォルダ構成のまま使用する場合、ターゲットプラットフォーム(Win32 または Win64) を変更した時に、プロジェクトの再構築が必要です。


リスト2
Delphi 2010 で [VCL フォームアプリケーション] を新規作成した場合の uses 部
ユニットスコープ名はないが、Delpih XE2 でもそのままコンパイル可能
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.




03_前のバージョンとプロジェクトを共有する場合の条件分岐


もし、Delphi XE2 用にユニットスコープ名を付けたい場合は、コンパイルの条件分岐を行うことになります。この際、ユニットスコープ名が付いた uses 群を先に書きます。逆にすると、リスト4 のように、Delphi XE2 よりも前のバージョンで保存する際に余分なユニット名が追加されてしまうことがあります。当然そのままコンパイルするとエラーとなります。


リスト3
コンパイルの条件分岐は、ユニットスコープ付きの、Delphi XE2 用を先頭に書く
unit Unit1;

interface

uses
  {$IF CompilerVersion > 22.9}
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
  {$ELSE}
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
  {$IFEND}

type
  TForm1 = class(TForm)
    Button1: TButton;
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.


リスト4
適切でないコンパイル条件分岐
uses に余分なユニット名が追加されてしまう
このコードでは、保存時に Classes, Controls が重複して追加されている
unit Unit1;

interface

uses
  {$IF CompilerVersion < 23.0}
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
  {$ELSE}
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Classes, Controls,
  StdCtrls;
  {$IFEND}

type
  TForm1 = class(TForm)
    Button1: TButton;
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.




04_Delphi XE2 以降のプロジェクトを Delphi XE2 より前で使用


Delphi XE2 で新規プロジェクトを作成してコンパイルすると、設定に応じて、Win32 アプリ、Win64 アプリ、Debug、Release 用の各々のフォルダができますが、ここで説明する作業を行うと、これらのフォルダ構成は無効となります。実行ファイルである EXE ファイルは、プロジェクトのフォルダに作成されます。これは前項の説明と同じ状態です。手順は、
  • 前項までの説明にも基づいて、ユニットスコープ名部分を削除するか、条件分岐にする
  • プロジェクトのソースコードの uses 部も同様に修正する
  • [別バージョンで...] の説明のように、必要最小限のファイルだけにする
  • 対象バージョンの Delphi でプロジェクトを起動する

となります。このプロジェクトは Delphi XE2 とそれより前の Delphi で共通に使用可能です。



DMFコンバータ 図1
Delphi XE2 のプロジェクトフォルダ構成
  • [TEST] がプロジェクトフォルダ
  • これはデフォルトの設定の場合
  • Win32 アプリを作成すると [Win32] ができる
  • Win64 アプリを作成すると [Win64] ができる
  • EXE とコンパイルしたファイルは各々の該当フォルダにできる

リスト5
プロジェクトのソースコードの uses 部も、ユニットスコープ名部分を削除するか、条件分岐する
program Project1;

uses
  Vcl.Forms,  //Vcl.を削除して、Formsだけにする
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


下図は必要最小限のファイルにした場合です。
必要最小限のファイルだけにするにすると、Delphi のバージョンによっては [ランタイムテーマを有効にする] の設定が無効になります。再設定が必要になることがあります。また、リソースは失われますので、改めてリソースを追加します。


DMFコンバータ 図2
必要最小限のファイルだけにする
  • uses 部を修正して保存
  • 必要最小限のファイルを残して後は削除
  • [Win32] 等も使用しないので削除
  • 拡張子が rc のファイルは削除しない
  • rc ファイル等で追加したリソースは失われるので、後でプロジェクトへの追加が必要
DMFコンバータ 図3
コンパイルした結果
  • dpr ファイルを開いてコンパイル
  • EXE とコンパイルしたファイルがここに出来ている

上の図のように、EXE を含むコンパイル済のファイルを、プロジェクトの他のファイルと同じフォルダ内に作成した場合、[プロジェクトオプション] [出力ディレクトリ] 関係の設定は、下図のように空となります。



図4




05_ターゲットプラットフォーム ( Win32 と Win64 ) の切換え


前項の作業で、プロジェクトフォルダの構成を、複数のバージョンの Delphi で共有して使用する状態にした場合、ターゲットプラットフォームを変更した時は、プロジェクトのビルド (再構築) が必要です。アプリケーションで使用するユニットファイル、リソースファイル等は、上の図で示すファイルだけとは限りません。したがって、実際には前項のような構成にしなくても、ターゲットプラットフォームを変更した場合は、多くの場合、ビルド (再構築) が必要です。

Delphi XE2 のデフォルトのフォルダ構成であれば、ターゲットプラットフォーム毎の情報がプロジェクト関係ファイルに格納されますが、前項のような共有使用の状態にすると、現在のターゲットプラットフォームの情報だけしかプロジェクト関係ファイルに格納されません。