2014-11-24 26 views
1

首先請原諒我,如果您覺得我只是懶惰地詢問這裏有關VB6錯誤的信息,而沒有正確地研究它,沒有(也許有時),我有。VB6錯誤371指定的對象不能用作所有者

一個派發給客戶端的項目,運行時立即給出這個錯誤 - 但是應用程序在這裏運行良好。

顯然,這個錯誤只發生在MDI孩子嘗試顯示錶單時,將自己作爲其所有者傳遞。

嗯,這是一切都很好,但我們的應用程序不使用MDI表單。全部。這是代碼行生成錯誤:

Me.Show vbModal, Screen.ActiveForm 

正如我已經說過了,應用程序不使用任何形式的MDI,所以我狼狽,爲什麼被報告這個錯誤。

有沒有人有任何想法?

由於

+0

您是否嘗試添加一些日誌記錄來檢查發生錯誤時的Screen.ActiveForm。將這些表達式寫入一個文本文件:'((Screen.ActiveForm是Nothing)',並且在一個單獨的代碼行中,以防發生錯誤'Screen.ActiveForm.Name' – MarkJ 2014-11-24 16:18:35

+0

Screen.ActiveForm可能不是您認爲的那樣嗎?它運行在某種終端會話上嗎? – Rob 2014-11-24 18:03:52

回答

0

屏幕對象的屬性的ActiveForm具有類型的抽象類(「表」)的。

錯誤消息告訴你,Show方法將需要對從Form派生的具體類的實例的引用。這就像記載:

If you plan to pass Screen.ActiveForm or MDIForm.ActiveForm to a procedure, you must declare the argument in that procedure with the generic type (As Form) rather than a specific form type (As MyForm) even if ActiveForm always refers to the same type of form.

因此,解決方法是將申報所需的基於表單類型的變量,將其設置爲Screen.ActiveForm,然後用你的顯示調用對象的引用。

在這裏,我們有:

Option Explicit 
' 
'Form1 code 
' 

Private Sub Command1_Click() 
    Load Form2 'This is not the class Form2, but the predeclared instance named Form2. 
End Sub 

和:

Option Explicit 
' 
'Form2 code 
' 

Private Sub Form_Load() 
    'Use a Timer to defer the Show until after we've returned control to Form1: 
    Timer1.Enabled = True 
End Sub 

Private Sub Timer1_Timer() 
    Dim Owner As Form1 'This is the class Form1, not the predeclared instance named Form1. 

    Timer1.Enabled = True 
    Set Owner = Screen.ActiveForm 
    Show vbModal, Owner 
End Sub 

似乎只是按預期工作和記錄,但我不知道爲什麼有人會需要做到這一點。

爲什麼不直接在Form1的Form1代碼中調用Form2?

+0

@ Bob77.Thx。與我的情況併發症是,我不知道什麼形式是積極的形式 - 即。我不能說它是FormX/Y.嘗試顯示的屏幕在定時器上激活 - 事件檢查是否有任何網絡相關問題,如果是,則顯示錶單通知用戶問題並詢問是否他們希望重新連接。這是一個成熟的應用程序,這是我們第一次看到這個錯誤(371)報告,似乎只有在與MDIChild表單一起使用時纔會出現 - 我們不使用這個表單。而且,作爲一個生產應用程序,我們無法在客戶端的系統上進行調試以查看出了什麼問題 – 2014-11-26 10:46:47

相關問題