7

VB6 アプリケーションをコンパイルしようとしていますが、「実行時エラー '91': オブジェクト変数またはブロック変数が設定されていません」というエラーで失敗します。コンパイル中にユーザー コントロールの Resize イベントが発生し、まだインスタンス化されていないオブジェクトにアクセスしようとするコードが呼び出されることが判明しました。

コンパイル中にイベントが発生するのはなぜですか?それを停止する方法はありますか?


編集:ここにいくつかのコードがありましたが、関係ありません。この問題は、UserControl コード (つまり、Initialize、ReadProperties、Resize、および WriteProperties イベント) が予期しない時間に実行される可能性があるという事実から発生します。これらのイベントのコードが他のコードに依存してデータ構造を初期化する場合、その初期化コードが実行されていない可能性があるため、失敗する可能性が高くなります。特に何も実行されていないはずのコンパイル中に!私はこれをバグと呼んでいますが、マイクロソフトは何らかの方法でそれを合理化できると確信しています。

4

2 に答える 2

7

これは、ユーザー コントロール イベントのライフサイクルに関する優れた記事です。

コントロールの有効期間とキー イベントについて

ここに1つのスニペットがあります

プロジェクトのコンパイル

プロジェクトがアプリケーションまたはコンポーネントにコンパイルされると、Visual Basic は、フォーム ファイルに含まれる情報をコンパイル済みファイルに書き込むために、すべてのフォーム ファイルを次々と非表示に読み込みます。コントロール インスタンスは、Initialize、ReadProperties、および WriteProperties イベントを取得します。コントロールのプロパティ設定は、完成した実行可能ファイルにコンパイルされます。

サイズ変更については言及されていません(実行時または設計時にコンテナーのユーザーコントロールのサイズを物理的に変更するときに発生します)。Initialize イベントがユーザー コントロールのサイズを変更している可能性がありますか?

エラーを回避するには、何かを行う前に、問題のあるオブジェクトが作成されているかどうかを確認できます。

If Not Object Is Nothing then
  do something
于 2009-09-08T19:04:37.620 に答える
1

ユーザー コントロールの一部のイベントは、少なくとも一貫した方法でレンダリングする目的で、設計時に実行されると思います。

于 2009-09-08T18:30:15.990 に答える