3

ランタイム パッケージ、dll、または外部リソース (つまり、単一の実行可能ファイル) なしでビルドされた Delphi 5 アプリケーションがあります。クライアント PC にインストールすると、次のエラー メッセージが表示されます。

クラス TListView が見つかりません

また

クラス TImage が見つかりません

これまで何十台もの PC に問題なくインストールしてきましたが、今回の最新のインストールには問題があります。

ターゲット PC は、他のソフトウェアがインストールされていない Windows XP (Service Pack 3) の新規インストールです。

すべてのクラスについて文句を言うわけではありませんが、1つまたは2つだけです。たとえば、TPanel/TForm/TEdit はすべて問題ありません。

誰がこれを引き起こしているのか考えられますか?

編集

新しい PC の exe は、Windows XP Sp1、2、3、Windows Vista、および Windows embedded に至るまで、私が知っている 30 ほどの他の PC にあります。古い PC と新しい PC の両方に古いバージョンがインストールされ、その後、最新バージョンに更新されました。唯一の違いは、最新のインストールではバージョン ジャンプが高かったことです。

4

7 に答える 7

10

これは通常、.DFMのストリーミング中のエラーです。通常、このエラーはTLabelコンポーネントで発生します。これは、多くの人がフォームまたはフレームからTLabelフィールドを削除して、混乱を減らし、フォームのインスタンスサイズを縮小するためです。ただし、彼らが犯す一般的で紛らわしい間違いは、彼らの熱心さの中で、すべてのTLabel参照を削除することです。それは悪いことが起こり始める時です。ストリーミングシステムがコンポーネントのクラスを見つける方法を簡単に説明します。

.DFMのクラス参照は単なる文字列であることに注意してください。ストリーミングシステムは、この文字列をクラス参照(TComponentClass)に変換する必要があります。ストリーミングシステムがこれを行うために使用する2つのメカニズムがあります。最初のものは非常に単純で、クラス参照のグローバルリストが含まれます。RegisterClassまたはRegisterClassesを呼び出して、ストリーミングシステムに明示的に認識させることができます。2つ目ははるかに微妙で、あまり知られていません。実際、それはすべてDelphiの「魔法」の一部です:-)。コンパイラがフォームを作成すると、フォーム上のコンポーネントを表すすべてのフィールドが処理され、フォーム/フレーム/データモジュール自体のRTTIまたはメタデータの一部として内部テーブルが作成されます。この表には、コンポーネントフィールドで表されるすべての個々のコンポーネントタイプへの参照のリストが含まれています。したがって、コンポーネントがそうでなくてもグローバルリストでは、このコンパイラで生成されたテーブルをスキャンすることで見つけることができます。これが、Classes.TReader.GetFieldClass()メソッドが行うことです。

TLabelの例に戻ると、この問題は、特定のコンポーネントタイプの少なくとも1つにフィールドがあることを確認するだけで簡単に修正できます。少なくともタイプTLabelのフィールドがある限り、他のすべてのTLabelは問題なくロードされます。したがって、あなたの場合、TListViewまたはTImageフィールドが削除されていないことを確認してください。

于 2009-02-23T18:31:58.080 に答える
4

レスレス、

アプリケーションのすべてのフォームを開いたり閉じたりしてから、新しいビルドを行うことをお勧めします。メモリがうまく機能する場合は、同様の問題が発生したときの解決策でした。

また、すべての dfm を自動的に開いたり閉じたりするDFM Checkと、uses 句をクリーンアップするのに役立つCnPackを確認することもできます。

よろしく、
リーベン

于 2009-02-23T09:13:04.727 に答える
1

Lieven は間違いなく正しい方向に進んでいると思います。単純な基本クラスが実行時に見つからないのは、Delphi (リンカー) の問題です。この例外は、オペレーティング システムが原因ではありません。

同様の問題に関する私の経験:リンカーは、ユニットが間違って配置されたプロジェクトを生成します。
例: フォーム ユニットがベース ユニットの前にリンクされています。プロジェクト自体を完全に再コンパイル/再リンクするように強制すると、この例外がなくなります。

単純な [Rebuild All] ではおそらく十分ではありません。最適化せずに再コンパイルしようとするかもしれません。

このエラーを再現しようとしましたが、再現できませんでした。Delphi コンパイラ/リンカーは、コンパイルの速度/コンパイル済みの exe の速度の点で最高の 1 つですが、このバグは間違いなくショー ストッパーです。

注: このエラーは D5 でしか経験していません。他の Delphi バージョンでこのエラーを経験した人はいますか?

于 2009-02-23T14:34:37.807 に答える
0

ファイル コピー エラーによる同様の問題を見たことがあります。さらに混乱を招くのは、障害が中間メディア デバイスにあったことです。この問題は、既存のリリース ビルドからファイルを再コピーするだけで解決されました。

現在確認することはおそらく不可能ですが、問題が「解決」された可能性は十分にあります。不必要な uses 句項目が削除されたためではなく、実行可能ファイルの新しいコピーも含まれていたためです。

于 2011-04-25T18:10:21.073 に答える
0

このタイプの「Class XXX not found」のすべてのエラーの解決策は簡単です。フォームの DFM ファイルをテキスト エディタで開き、XXX オブジェクトの定義を手動で削除します。

于 2014-02-11T07:58:16.053 に答える