2012-02-29 8 views
1

私はレジスタといくつかのサブフォームを持つメインフォームを持っています。私はクラスモジュールを使用しており、フォームへのアクセスを容易にするために、フォームモジュールの名前を保存します。クラスにアクセスするための対応する変数がモジュールに保存され、フォーム(clsMod)でon_load(new)が設定されます。最初のアクセスの前に、私のメインフォームはクラスモジュール(initial_form)の値を '初期化'してアクセス可能にする関数を呼び出します。それはこれまでの魅力のように機能します。クラスを介してコントロール/フォームオブジェクトにアクセスすると再初期化されます

しかし、今私は値にアクセスしようとすると、f.e. clsMod.detailsControlまたはclsMod.detailsControl!fieldXyクラスモジュールが再び初期化されます。したがって、すべてのバインドされたオブジェクトが失われます。私はそれのようなコントロール/フォームを使用することを許可されていないと思いますか?後に発生するコース変数 'Object variable'または 'block variable not set'を除いて、エラーはありません。

Private m_ctldetailsControl As control 

Public Sub initial_form() 
    Set detailsControl = Forms!mainForm_ufoMainForm 
End Sub 

Public Property Get detailsControl() As control 
    Set detailsControl = m_ctldetailsControl 
End Property 

Public Property Set detailsControl(ctlDetailsControl As control) 
    Set m_ctldetailsControl = ctlDetailsControl 
End Property 

私はクラスモジュールは、ちょうど私が(私はに、Class_Initialize(にタイムスタンプを入れて)「外」からコントロール・オブジェクトにアクセスすると、再び初期化されるとする場合が見ることができるという事実にそれを絞り込みます新しい初期化です)、なぜか分かりません。 Control-Objectsの代わりにForm-Objectsを使うと同じことが起こります。

myコードを削除すると、クラスモジュールがリセットされます。これは、ロードプロセス中に一度だけ設定されるためです(clsMod = new clsModificationを設定します)。そのクラス内の他のものはすべて正常に動作します。クラスを再初期化せずにクラス内からプロパティにアクセスできます。

その他の詳細については、このトピックに関するお読みください。

いくつかの追加:

  • クラス変数はモジュール
  • に「clsModuleXyなどの公共clsMod」として配置されて、それが私のフォームのonLoadのイベントに設定されます(clsMod =新しいclsModuleXyを設定)
  • (上記descripedとして)
  • セットプロパティが正常に動作
  • (上記descripedとして)プロパティは、クラスモジュール内の正常に動作します
  • 私は新しいinstantiatioクラスモジュールの外のプロパティを取得使用(私はそのプロパティにローカルコントロール/フォームを設定したり、フィールドにアクセスしたい場合)は、n私は犯人は、あなたがこのクラスモジュールAs Newのインスタンスを宣言しているということであると推測している
+0

私は正直に覚えていないことができます、そのように学んだ。コントロールの代わりに 'フォーム'を使用しても、何も変わりません。 – Christian

答えて

2

起こります。私は明らかにあなたのコードの残りの部分がどのようなものかわからないが、私は、全体のプロセスは、このような何か作業していると想像:

  1. このオブジェクトのインスタンスがAs New(すなわち、Dim clsMod As New initial_form)宣言されています。
  2. Class_Initialize()プロシージャは、新しいインスタンス(clsMod)が作成されたときに実行されます。
  3. オブジェクトのこのインスタンス(clsMod)が範囲外になる原因となります。
  4. VBAガベージコレクタは、現在使用されていないこのオブジェクトインスタンス(clsMod)をクリーンアップします。
  5. Class_Terminate()プロシージャは、インスタンス(clsMod)がクリーンアップされたときに実行されます。
  6. clsModにアクセスしようとしています。この変数は、GCがクリーンアップしたため、Nothingです。しかし、As Newと宣言されており、initial_formという新しいインスタンスが作成され、オブジェクト変数clsModに割り当てられます。
  7. この新しいインスタンスに対してClass_Initialize()プロシージャが再度実行されます。

コードの残りの部分を見ることなく、これが問題であることを確かめることはできません。しかし、あなたが投稿した症状に基づいて、これは行動を説明するでしょう。

+0

問題は、そのように使用されているコントロール/フォームオブジェクトとは何の関係もありません。知っておいてよかった。私はちょうどチェックした、class_terminateは呼ばれていない、instatiationはそれなしで起こる。クラス変数は、モジュール内で "public clsMod As New initial_form"として宣言され、フォームのonloadイベントで 'new'として設定されます。 clsMod.detailsControl!fieldXyにアクセスしようとすると、すぐにその旨がわかります。 – Christian

+1

'Class_Terminate()'(あなたがクラスモジュールに含まれていれば)は、オブジェクトのインスタンス化時に呼び出されません。名前が示すように、インスタンス化されたオブジェクトが存在しなくなったときにスコープから外れたか、または明示的に 'Nothing'に設定されているため、オブジェクトは呼び出されます。 – mwolfe02

+0

それは私が言及していたものです。私は、ガベージコレクタがこのインスタンスをクリーンアップしていないことを示す、呼び出されないことを意味しました。私のコメントをもう一度読んだ後、私は本当にそれを明確にしていないことがわかりました。 – Christian

関連する問題