0

Delphi 2010 を使用しています

次のエラーが表示されます: E2506 インターフェイス セクションで宣言されたパラメーター化された型のメソッドは、ローカル シンボルを使用してはなりません。

このタスクを達成する方法はありますか?

unit Unit1;

interface

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

type

  MyFormType<T: TForm> = class
    class procedure SpecialOpen(var FormVar: T; Params: array of TValue);
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure ShowForm<T1: TForm>(var aForm: T1);
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.ShowForm<T1>(var aForm: T1);
begin
  if aForm = nil then
    MyFormType<T1>.SpecialOpen(aForm, [Self])    // <-- Error
  else
    aForm.Show;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowForm<TForm2>(Form2)
end;

{ MyFormType<T> }

class procedure MyFormType<T>.SpecialOpen(var FormVar: T; Params: array of TValue);
var lRttiContext: TRttiContext;
begin
  FormVar := lRttiContext.GetType(TClass(T)).GetMethod('Create').Invoke(TClass(T), Params).AsType<T>;
  FormVar.Show;
end;

end.

タンクと私の英語でごめんなさい。

4

1 に答える 1

2

これは、Delphi 2010 の非常に多くのジェネリック バグの 1 つです。コードは XE2 でコンパイルされます。選択肢は、2010 年に機能する回避策を探すか、アップグレードすることです。Delphi XE および XE2 には、ジェネリック コンパイラのバグに対する非常に多くの修正が含まれているため、ジェネリックの使用を真剣に考えている場合、Delphi 2010 は最適な選択ではありません。

于 2012-08-03T10:26:00.687 に答える