4

Delphi XE2 ではコンパイルできますが、XE3 ではコンパイルできない簡単なコードがありますが、その理由はわかりません。問題のあるコードを少し減らしました。Delphi の意見で何が問題なのか知りたいです。Delphi XE 2 でこのユニットを含むプロジェクトをコンパイルしようとすると正常に動作しますが、Delphi XE3 (試用版) では、「[dcc32 エラー] AffineTransform.pas(26): E2382 インスタンス変数を使用してコンストラクターを呼び出すことはできません」というメッセージが表示されます。ここで私が知っている唯一の「変わった」ことは、古い学校の「オブジェクト」型の使用です。この場合、コンストラクターは実際のオブジェクト (TObject ベースのクラス インスタンス) とまったく同じではありません。

このオブジェクトの「コンストラクター」という単語を「プロシージャー」に置き換えると、問題なくコンパイルされますが、これはなぜでしょうか。これは私のコードで行う変更で問題ないのでしょうか。機能?

unit AffineTransform;

interface

type
  { Rectangular area. }
  TCoordRect = object
  public
    Left, Top, Right, Bottom: Real;
    constructor CreatePos(ALeft, ATop, ARight, ABottom: Real);
    procedure   Include(AX, AY: Real);
  end;

implementation

constructor TCoordRect.CreatePos(ALeft, ATop, ARight, ABottom: Real);
begin
  Left := ALeft;
  Top := ATop;
  Right := ARight;
  Bottom := ABottom;
end;

procedure TCoordRect.Include(AX, AY: Real);
begin
  CreatePos(AX, AY, AX, AY)
end;

end.
4

2 に答える 2

7

このレガシーTurboPascalスタイルobjectの場合、キーワードには実際には意味がありませんconstructor。コンストラクターには特別な扱いがありますが、objectここではその必要はまったくありません。ここにあるのはrecord、いくつかの方法を使用した場合にすぎません。

SelfXE3コンパイラが変更され、インスタンスメソッド内でコンストラクタを呼び出すことができなくなりました。これは、との両方に当てはまりclassますobject。この変更が行われた理由に関するドキュメントは見たことがありません。やがてそれが浸透することは間違いありません。

あなたの当面の解決策は、に置き換えることconstructorですprocedure。長期的には、これをrecordではなくに変換することは理にかなっていobjectます。


また、メソッドの名前をに変更するように相談しInitializeます。一部のライブラリ設計者は、レコードCreateでメソッドを使用することを選択しているようです。Freeこれにより、膨大な量のコードが次のように記述されていました。

ctx := TRttiContext.Create;
try
  ....
finally
  ctx.Free;
end;

実際、そのコードはすべて偽物であり、簡単に削除できます。TRttiContext変数は自動的に初期化されます。

この種の設計は、を使用することを好むDelphiコーダーのその派閥に巨大なHeffalumpTrapFreeAndNilを設定します。にレコードを渡すFreeAndNilと、面白い花火につながります!

于 2012-10-18T14:08:24.627 に答える
6

Delphi XE2 ではコンパイルできますが、XE3 ではコンパイルできない簡単なコードがありますが、その理由はわかりません。

すでにインスタンス化および初期化されているインスタンスのメソッド内でコンストラクターを呼び出そうとしています。コンパイラはそれを許可しなくなりました。より具体的には、このコード:

procedure TCoordRect.Include(AX, AY: Real); 
begin 
  CreatePos(AX, AY, AX, AY) 
end; 

次のコードと同じです:

procedure TCoordRect.Include(AX, AY: Real); 
begin 
  Self.CreatePos(AX, AY, AX, AY) 
end; 

Selfまた、変数に対してコンストラクターを呼び出すことはできなくなりました。なんで?IIRC によると、これは、モバイル開発のサポートへのコンパイラーの進行中の移行に関係しています。

于 2012-10-18T17:28:08.220 に答える