2017-11-24 7 views
0

Iこれはコンパイルが、私は、次のヒントVCLプロジェクトには同じクラス名で異なる名前空間を持つ2つのフォームがありますか?

[DCC32ヒント] H2161警告得る2つの異なる名前空間で同じクラス名で

FirstNameSpace.ExampleFormName.TExampleFormName 
SecondNameSpace.ExampleFormName.TExampleFormName 

2つのフォームを作成しようとした:重複リソース:タイプ10 (RCDATA)、ID TEXAMPLEFORMNAME;ファイル FirstNameSpace.ExampleFormName.TExampleFormName.DFMリソースが保持されます。 ファイルSecondNameSpace.ExampleFormName.TExampleFormName.dfmリソース が破棄されました。

TExampleFormNameを参照するとプログラムがクラッシュします。

リンカが正常に動作するのに十分な情報がないようです。

この方法を使用する方法はありますか?

+0

2番目の 'TExampleFormName'を' TExampleFormName2'に変更してリソースの競合を止め、 'type TExampleFormName = class(TExampleFormName2);を追加しても動作しますか? –

+0

私が提案したようにキャストを試みました。 プログラムはヒントなしでコンパイルされます。 しかし、実行時の動作は非常に奇妙です。 ExampleFormName1とExampleFormName2に同じ名前のコンポーネントが含まれていると、プログラムがEComponentError例外でクラッシュする - whateverという名前のコンポーネントが既に存在する。 ExampleFormName1とExampleFormName2に同じ名前のコンポーネントが含まれていない場合:BOTH dfmsのコンポーネントが単一のフォームに表示されます。 –

+0

競合の問題は、DelphiよりもWindowsと関連しています。その背後では、アプリケーションはWindowsにフォームを登録し、WindowsはDelphiのような名前空間を認識しません。 – Dsm

答えて

2

いいえエラーの性質と内容に示されているように、関連付けられたフォームファイル(.dfm)内のクラス名の参照は、名前空間で修飾されておらず、いずれも対応するリソースIDではありません。

フォームのクラス名は、アプリケーション内/アプリケーション内で一意である必要があります。

同様に、DFMで参照されるコンポーネント(フォームに配置されたコントロールを含む)のクラス名も、名前空間で修飾されていないため、一意である必要があります。

ユニークなコンポーネント/制御クラス名を促進/確保するために、プレフィックスシステムがベンダーおよびコンポーネント開発者によって採用されました。つまり、ベンダーやコンポーネント群などで作成されたすべてのクラスは、通常の名前に加えて共通の接頭辞を共有します。 ACMEという会社が強化され、標準のUIコントロールのライブラリを提供した場合

例えば、彼らはそれを名前を付けます:

TAcmeEdit 
TAcmeButton 
TAcmeListbox 
etc 

標準と区別するためにはVCL(非は、接頭辞)コントロールまたは他のベンダーコントロール(別のプレフィックスを使用)から取得します。

The Delphi Prefix Registryは、これらのプレフィックスの一覧を保持しています(これらのプレフィックスは、まだ使用されていないプレフィックスを確実に選択するために、コントロール/コンポーネントライブラリの開発者にはほとんど使用されています)。

FMXアプリケーションリソースの処理方法がわかりません。この場合、mayとなる可能性があります。しかし、ちょうど私がそれを知らないのでの仕事はそれを意味しないそれはを意味しません。

+1

そして私は*なぜ*疑問に思う?異なるフォームクラスに異なる名前を付けるのは難しいことではありません。なぜ彼らは同じ名前を持つべきですか? –

+0

@RudyVelthuis - おそらくVCL /リソースリンク機構が考案されたときに名前空間が存在しなかったので、これは問題ではなかったでしょう。これはDelphi 7でネームスペース(または少なくとも単なる点線のユニット名)が導入されたときは決して修正されませんでした。この問題は、フォーム上のコンポーネント/コントロールのクラス名に拡張されました。 、およびDelphiプレフィックスレジストリです。これを修正することは、既存のコードを定義するのに役立たず、VCL/Windowsはそれ以上セクシーではありません。 Android/iOSで問題ない場合は問題ありません。 :shrug: – Deltics

+0

それは私が尋ねたものではありません。あなたのフォームに異なる名前を付けると、DFMファイルに名前空間は必要ありません。私はコンポーネント名については言及していない。 –

関連する問題