0

次のような新しいフォーム インスタンスを作成しました。

var
  ClassToUse: TFormClass;

begin  
  ClassToUse := TfrmMyForm; //CREATED AT DESIGN TIME
.
.
  NewForm := ClassTouse.Create(NewTab); //NewTab is an instance of a tab
.
end;

上記のコードは正常に動作します。

しかし今、そのフォームを作成するプロシージャにフォームを文字列として送信したいと考えています。したがって、コードを次のように変更しました。

次のような新しいフォーム インスタンスを作成しました。

var
  ClassToUse: TFormClass;

begin  
  ClassToUse := GetClass(pFormName); //pFormName is a string -- ERROR IS HERE!!
.
.
  NewForm := ClassTouse.Create(NewTab);  
.
end;

これにより、次のエラーが発生します。

Error: Incompatible types: got "TPersistentClass" expected "TFormClass"

おそらく私は間違ったページにいます...これを実装する正しい方法は何ですか?

ありがとう!

4

1 に答える 1

3

GetClass関数はを返しますTPersistentClass。それらの1つをに割り当てることはできませんTFormClassTPersistent参照を参照に割り当てることができないのとまったく同じ理由でTForm

次のようにコードを変更できます。

var
  RegisteredClass: TPersistentClass;
begin  
  RegisteredClass := GetClass(pFormName);
  if RegisteredClass=nil then
    raise ESomeException.Create(...);
  if not RegisteredClass.InheritsFrom(TForm) then
    raise ESomeException.Create(...);
  NewForm := TFormClass(RegisteredClass).Create(NewTab);  
end;
于 2012-12-18T12:42:01.070 に答える