-2

Delphi 2006などのDelphiバージョンでコンパイルしたいユニットが1つあります。

コンパイルに問題がある次のコードがあります。

uses
  graphics; // for previous versions can not be compiled on Delphi XE

uses
  vcl.graphics; // compiled on Delphi XE but can not compile on previous version

また、関数 StrLen、StrCopy は「非推奨です。AnsiString に移動しました」という警告を生成します。

質問: どうすればすべてを整理できますか? グラフィックが vcl.graphics になり、StrLen が AnsiStrings に移行したコンパイラのバージョンはどれですか? 次のコードを作成するには:

uses
  {$if CompilerVersion < ??}graphics{$ifelse}vcl.graphics{$ifend};
4

1 に答える 1

2

ユニット スコープ名が最初に導入されたとき、ユニットは XE2 で に名前がGraphics変更されました。Vcl.Graphics

Delphi および C++Builder XE2 の新機能

重要な新しい要件: VCL-FMX-RTL のユニット スコープ名

重要: VCL-FMX-RTL ユニットは、 や などのドット接頭辞の命名規則を使用するようにSystem.TypesなりVcl.Stylesました。修飾識別子 ( などTypes.IStream) を使用する既存のコードがある場合は、コンパイルするためにコードの変更が必要になる場合があります。

{$IF}クロスバージョン VCL コードを記述するためにステートメントを使用する必要はありません。句では、ユニット名を単独usesで引き続き使用できます。Graphics

uses
  Graphics;

XE2+ プロジェクトの [プロジェクト オプション] の [ユニット スコープ名] リストにVclが含まれていることを確認してください (デフォルトで含まれているはずです)。

これは文書化されています (実際、文書ではGraphics例としてユニットを使用しています):

Delphi コンパイラ プロジェクト オプション | Delphi コンパイラ

Delphi のドット付き名前空間のユニット スコープ名(接頭辞)を指定して、コードおよびuses節 orで部分修飾名を使用できるようにします#include

Delphi ユニットのユニット スコープ名を追加するには、次の 2 つの方法があります。

  • uses 句で完全にユニット スコープの名前を指定します。例えば:

    uses Vcl.Graphics;
    
  • Vclユニット スコープ名 ( ) を [ユニット スコープ名]フィールドに追加します。次に、ユニット スコープ名Vclは、そのユニット スコープに属するユニット名に自動的に適用されます。次のように簡単に指定できます。

    uses Graphics; 
    

省略記号ポップアップ ボタンをクリックすると、プロジェクト オプション ページの共通項目および順序付きリスト ダイアログ ボックスで説明されているように、ユニット スコープ名を選択および追加するためのダイアログ ボックスが開きます。

ステートメントを使用する場合{$IF}、正しい構文は次のとおりです。

uses
  {$IF RTLVersion >= 23}Vcl.{$IFEND}Graphics;

または:

uses
  {$IF RTLVersion >= 23}Vcl.Graphics{$ELSE}Graphics{$IFEND};

およびのPAnsiCharバージョンに関しては、非推奨となり、XE4 のユニットに移動されました ( )。例えば:SysUtils.StrLen()SysUtils.StrCopy()System.AnsiStringsRTLVersion=25.0

uses
  ...
  {$IF RTLVersion >= 25}, AnsiStrings{$IFEND}
  ;

var
  Src, Dest: PAnsiChar;
  Len: Integer;
begin
  Src := ...;
  Len := {$IF RTLVersion >= 25}AnsiStrings.{$IFEND}StrLen(Src);
  GetMem(Dest, Len * SizeOf(AnsiChar));
  {$IF RTLVersion >= 25}AnsiStrings.{$IFEND}StrCopy(Dest, Src);
  ...
end;

最後に、{$IF}これは Delphi 6 で導入されたため、Delphi 5 以前をサポートする必要がある場合は、{$IF}ステートメントを{$IFDEF CONDITIONALEXPRESSIONS}ブロックでラップする必要があることに注意してください。

于 2015-09-02T22:05:41.977 に答える