1

別のユニットで TForm を拡張しました...

TForm = class(Forms.TForm)
protected
{ convenient extensions }
public
{ more extensions }
end;

そして、このユニット (拡張された TForm を使用) は、これらの拡張機能を適用したいフォームのすべてのユニットで宣言されています...

ただし、これらのユニットの一部には、次のコード スニペットがあります。

Initialization
  RegisterClass(TFormN);

Finalization
  UnRegisterClass(TFormN);

しかし、この方法では [EFilerError] 「TForm という名前のクラスは既に存在します」というメッセージが表示されます。

ここ数日、この競合を解決/回避する方法を探していましたが、成功しませんでした...

誰もこれを経験したことがありますか...?または、この問題の理由を明らかにすることはできますか?


問題は、このユニットを拡張形式で 2 つのプロジェクトに既に実装していることです。

ちょうど今、3 番目のプロジェクトでは、インスタンス化されずにフォーム クラスが呼び出されます...そして、拡張クラス フォームを次のように変更することはできません。

TForm = クラス(Forms.TForm)

に:

TStyleForm = クラス(Forms.TForm)

...


私が必要とするのは次のようなものです:

TFormStyle = class(Forms.TForm)
public
  constructor Create(AOwner: TComponent); override;
end;

TForm = ^TFormStyle;

しかし、ユニットでは次のような宣言を行うことはできません:

TMyForm = class(TForm)
  { something... } 
end;

今はポインタです...

4

1 に答える 1

0

プログラムには 2 つの異なる型があり、どちらも という名前TFormです。VCL で宣言されたものは、名前で登録されTFormます。TFormVCL バージョンと同じ名前を使用してグローバル レジストリに登録しようとしているため、登録は当然失敗します。

いくつかの可能な方法:

  1. 衝突を避けるためにフォームの名前を変更します。
  2. クラスをまったく登録しないでください。フォームはストリーミング フレームワークによってインスタンス化されないため、フォームを登録する必要はありません。メタ クラスを提供することによってそれらをインスタンス化します。へApplication.CreateForm、または標準コンストラクターによってTForm.Create。uses 句でTFormafterを宣言したユニットを常にリストしていることを確認する必要があります。Formsまたは、 のような完全にスコープ化された型を使用しMyForms.TFormます。
  3. 新しいバージョンの Delphi を使用している場合は、クラス ヘルパーを使用して拡張機能を追加できます。

個人的には、上記の 1 と 2 の両方を行う傾向があります。

あなたの意図は、あなたTFormのすべてのフォームではなくForms.TForm.

于 2013-06-05T12:13:08.780 に答える