3

Form1 と Form2 という名前の 2 つのフォームがあるとします。Form1 から Form2 の関数 abc() を呼び出したいとします。どちらが優れているのか、その理由は?

方法 1:

 'In Form1
  Form2.abc()

方法 2:

 'In Form1
  Dim oFrm As New Form2
  oFrm.abc()
4

5 に答える 5

5

VB6 では、プログラムの実行時にフォーム名を介してフォームを参照するとすぐに、VB6 はそのフォームのインスタンスを作成します。そのインスタンスも Forms コレクションに追加されます。

このコードまたはその適切なバリエーションを使用して、どのフォームがインスタンス化されたかを確認できます。

Dim frmCurrent As Form
Dim output As String
For Each frmCurrent In Forms
    output = output & frmCurrent.Name & vbCrLf
Next
MsgBox output

したがって、Form2.abc() を呼び出すと、Form2 フォームの新しく作成されたインスタンスで abc プロシージャが呼び出されます (理解に役立つ場合は、フォームをクラスという単語に置き換えることができます)。

プログラムを終了する時が来ると、プログラムがメモリ内でぶらぶらしているが、表示されているフォームをすべて閉じているが、 のような呼び出しによってインスタンス化されたフォームを閉じていないため、画面に表示されないというタイプのエラーが発生する可能性がありますForm2.abc。これにより、人気のある「すべてのフォームを閉じる」コードが、多くの VB6 プログラムの終了手順に追加されます。

Private Sub cmdExit_Click()
   Dim current As Form
   Dim output As String
   For Each current In Forms
      Unload current
   Next
End Sub

変数をディメンション化し、それに Form2 の新しいインスタンスを割り当てると、変数に従ってスコープを持つ新しいフォームが作成されます。インスタンスはForms コレクションに追加されません:

Dim frmNew As New frmTest
frmNew.abc

Dim frmCurrent As Form
Dim output As String
For Each frmCurrent In Forms
    output = output & frmCurrent.Name & vbCrLf
Next
MsgBox output 'Does not include frmNew aka frmTest

したがって、Forms コレクションに Form2 のインスタンスを作成したり、予期しない結果をもたらす可能性のある既存のインスタンスを再利用したりしないため、2 番目の方法が一般的に優れています。

于 2013-02-25T09:49:42.407 に答える
1

Form2 のインスタンスが 1 つしかない場合は、方法 1 を使用してください。

複数のインスタンスが必要な場合、または複数のインスタンスが必要になることが予想される場合は、方法 2 を使用します。

于 2013-02-22T21:38:13.947 に答える
0

この質問をしているので、form2がすでにロードされていると想定しているので、関数を直接呼び出します(オプション1)

それはあなたの関数の性質にも依存します..それはform2に干渉しますか?form2のデータを使用していますか?....もしそうなら、私は関数を直接呼び出すでしょう

それがグローバル関数の場合、私はそれをform2ではなく、モジュールに入れます

form2の新しいインスタンスをロードし、ユーザーにそれを操作してもらいたい場合は、オプション2を使用します。

于 2013-02-23T12:41:56.383 に答える
0

Form2 が既に読み込まれており、FunctionName() を任意のコンテキストでグローバルに呼び出すことができることがわかっている場合は、最初の方法が適しています。2 番目の方法は、まだロードされていない Form2 の特定の関数のみを実行する必要がある場合に最適です。ただし、メモリ リークに注意する必要があります。


Form2usingから関数を呼び出すForm2.FunctionName()と、次のことが行われます。

1-Form2がロードされているか確認してください。そうでない場合は、最初にロードされます。2-FunctionName()実行されます 3-Form2具体的にアンロードされるまでメモリに残ります。

Form2 を手動でアンロードして、クリーンアップする必要があります。

Unload Form2

それ以外の場合は、プログラムを 閉じて終了したと思ったときに、が既に読み込まれており、実行可能ファイルのプロセスがタスク マネージャーに既に存在します。Form1Form2


FunctionName()を使用して呼び出す

Dim oFrm as New Form2
oFrm.FunctionName()

Form2 のインスタンスを (コードのローカル コンテキストで) 確実にロードしてから関数を実行しますが、完了したら次の方法でアンロードする必要があります。

Unload oFrm

そうしないと、最初のケースと同様に、プログラムでメモリ リークが発生します。

于 2013-02-25T09:04:17.110 に答える