Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ? / 25 сообщений из 26, страница 1 из 2
29.11.2004, 10:14:05
    #32803256
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
Я оформил кое-какие необходимые функции в отдельный класс. В приложении есть startup форма, она же, по совместительству, форма-заставка. При ее загрузке выполняются необходимые действия по инициализации приложения. Потом она делается невидимой, но остается загруженной на все время работы приложения. Благодаря этому при попытке закрыть приложение вызывается ее событите Unload. В нем тоже выполняется код по подчистке хвостов после работы.

Пробема состоит в следующем. У меня есть некий класс, ссылка на который объявленая на уровне формы frmStartup.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Public cls as CustomClass

Private Sub Form_Load()

Set cls = New CustomClass
...
...
End Sub

Все замечательно. НО! При активизации формы каким-то образом экземпляр класса уничтожается. в его Terminate вставлен MsgBox, а в отладчике видно, что cls становится Nothing.

Как продлить жизнь экземпляру класса ? При запуске приложения в нем накапливается информация, нужная для корректного завершения, то есть он должен дожить до этого момента. frmStartup благополучно доживает в невидимом состоянии. А класс - нет. Как быть ?

Пытался выносить ссылку на класс в отдельный модуль (не класса, обычный) - та же петрушка. Создается, а потом благополучно уничтожается.
...
Рейтинг: 0 / 0
29.11.2004, 10:32:20
    #32803301
Dats
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
А так на уровне General Declarations пробовал

Public cls as Object
Set cls = New ...
...
Рейтинг: 0 / 0
29.11.2004, 10:37:43
    #32803318
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
если идет сброс переменных в результате правки кода в режиме остановки
и прочих гадостей публиные объекты тоже упадут.

кто -то предлагал выносить переменные в библиотечные файлы
(codeproject)
...
Рейтинг: 0 / 0
29.11.2004, 10:39:35
    #32803324
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
авторПри активизации формы каким-то образом экземпляр класса уничтожается. в его Terminate вставлен MsgBox, а в отладчике видно, что cls становится Nothing.

при активизации - это в Form_Load?

если да, то у тебя в Form_Load где-то сидит локальное объявление

Dim cls as CustomClass
которое перекрывает cls уровня модуля.
...
Рейтинг: 0 / 0
29.11.2004, 10:51:02
    #32803351
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
Спасибо за советы, но увы...

Уничтожение столь нужного мне экземпляра проверется MsgBox'ом в его Terminate именно для того, что бы не вносить погрешности от процесса отладки. Приложение запускается без какой-либо правки кода, так что по этой причине сброса быть не может.

Пробовал и как Object в самом верху модуля формы. Не помогло :(

Дублирующего локального объявления абослютно точно нет.

Ошибка осталась...
...
Рейтинг: 0 / 0
29.11.2004, 10:54:08
    #32803367
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
начнем с предположения АлексейК

1) проект полностью компилируется?
2) Class_Initialize есть?


(с выражением лица)
...
Рейтинг: 0 / 0
29.11.2004, 10:57:04
    #32803372
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
Компилируется полностью.

Инитиалайз есть.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Sub Class_Initialize()

    MsgBox "Class_Initialize"

End Sub
Private Sub Class_Terminate()

    MsgBox "Class_Terminate"

End Sub
...
Рейтинг: 0 / 0
29.11.2004, 10:58:57
    #32803376
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
на всякий случай - компиляцию проводить с проставленным Option Explicit
на уровне всех модулей, так или иначе имеющих отношение к больному классу
и затрагиваемых в нем, включая "скрытую форму"

(с выражением лица)
...
Рейтинг: 0 / 0
29.11.2004, 11:00:49
    #32803381
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
Option Explicit стоит.

Глобальную переменную в неклассовый модуль выносил - с тем же эффектом.
...
Рейтинг: 0 / 0
29.11.2004, 11:04:16
    #32803394
Dats
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
А как и где производятся обращения к экземпляру класса?
Если я не ошибаюсь, то реальное создание экземпляра класса производится при первом обращении к нему.
...
Рейтинг: 0 / 0
29.11.2004, 11:04:24
    #32803395
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
текст формы и класа давай, с указанием строки, на которой происходит уничтожение класса.

укажи версию акцесс.

ЗЫ
в конструкторе класса msgbox - не шибко здорово. Debug.print - спокойнее.

(с выражением лица)
...
Рейтинг: 0 / 0
29.11.2004, 11:19:23
    #32803445
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
Даю код...

Элементарный класс, хранящий данные о ссылке для ее прилинковке при старте приложения (будет выполняться перебор от MaxVersion до MinVersion, например 3.1, 3.0 ... 2.7:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Option Compare Database
Option Explicit

Public Name As String
Public Guid As String
Public MaxVersion As Double
Public MinVersion As Double
Public Reference As Reference

Public Sub Initialize( _
    sName As String, sGuid As String, _
    dbMaxVersion As Double, dbMinVersion As Double)

    Name = sName
    Guid = sGuid
    MaxVersion = dbMaxVersion
    MinVersion = dbMinVersion
    
End Sub

Класс-контейнер, проверяющий ссылки, прилинковывающий их и который ДОЛЖЕН при выходе из приложения отключить те, которые были на его совести:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
Option Compare Database
Option Explicit

'Name:         ADODB
'BuiltIn       False
'IsBroken      False
'FullPath:     C:\Program Files\Common Files\System\ado\msado25.tlb
'Version:      2.5
'GUID:         {00000205-0000-0010-8000-00AA006D2EA4}

'Name:         ADOX
'BuiltIn       False
'IsBroken      False
'FullPath:     C:\Program Files\Common Files\System\ado\msadox.dll
'Version:      2.7
'GUID:         {00000600-0000-0010-8000-00AA006D2EA4}

'ADODB  2  8  {2A75196C-D9EB-4129-B803-931327F72D5C}    C:\Program Files\Common Files\System\ado\msado15.dll
'ADODB  2  7  {EF53050B-882E-4776-B643-EDA472E8E3F2}    C:\Program Files\Common Files\System\ado\msado27.tlb
'ADODB  2  6  {00000206-0000-0010-8000-00AA006D2EA4}    C:\Program Files\Common Files\System\ado\msado26.tlb
'ADODB  2  5  {00000205-0000-0010-8000-00AA006D2EA4}    C:\Program Files\Common Files\System\ado\msado25.tlb
'ADODB  2  1  {00000201-0000-0010-8000-00AA006D2EA4}    C:\Program Files\Common Files\System\ado\msado21.tlb
'ADODB  2  0  {00000200-0000-0010-8000-00AA006D2EA4}    C:\Program Files\Common Files\System\ado\msado20.tlb

'ADOX   2  8  {00000600-0000-0010-8000-00AA006D2EA4}    C:\Program Files\Common Files\System\ado\msADOX.dll
'ADOX   2  7  {00000600-0000-0010-8000-00AA006D2EA4}    C:\Program Files\Common Files\System\ado\msADOX.dll

Public WithEvents ResidentForm As Form
Public ReferenceCollection As Collection

Private Sub Class_Initialize()

    MsgBox "Class_Initialize"
    Set ReferenceCollection = New Collection

End Sub

Private Sub Class_Terminate()

    MsgBox "Class_Terminate"
    Dim i As Integer, ref As LinkReference
    For i = ReferenceCollection.Count To  1  Step - 1 
        Set ref = ReferenceCollection.Item(i)
        Set ref.Reference = Nothing
        ReferenceCollection.Remove (i)
    Next i
    Set ReferenceCollection = Nothing

End Sub

Private Sub ResidentForm_Close()

    'MsgBox "ResidentForm_Close"

End Sub

Private Sub ResidentForm_Deactivate()

    'MsgBox "ResidentForm_Deactivate"

End Sub

Public Sub BindToForm(frm As Form)

    Set ResidentForm = frm
    ResidentForm.OnClose = "[Event Procedure]"
    ResidentForm.OnDeactivate = "[Event Procedure]"
    
    Open Application.CurrentProject.Path & "\\" & "Application.Log" For Output As # 1 
    Print # 1 , "Starting Application", Now
    Print # 1 , ""
    Close # 1 

End Sub

Public Function CheckReference( _
    sName As String, Optional iMajor As Integer, Optional iMinor As Integer, _
    Optional sGuid As String, Optional sFullPath As String) As Boolean

    Open Application.CurrentProject.Path & "\\" & "Application.Log" For Append As # 1 
    
    Dim ref As Reference
    For Each ref In Application.References
        If Not ref.IsBroken Then
            If ref.Name = sName Then
                iMajor = ref.Major
                iMinor = ref.Minor
                sGuid = ref.Guid
                sFullPath = ref.FullPath
                Print # 1 , "CheckReference", _
                    ref.Name, ref.Major, ref.Minor, ref.Guid, ref.FullPath
                Print # 1 , "": Close # 1 
                CheckReference = True
                Exit Function
            End If
        End If
    Next ref
    
    CheckReference = False
    Print # 1 , "CheckReference Failed", sName
    Print # 1 , "": Close # 1 
    Exit Function

End Function

Public Function CheckReferences()

    CheckReferences = True
    Open Application.CurrentProject.Path & "\\" & "Application.Log" For Append As # 1 
    
    Dim ref As Reference
    For Each ref In Application.References
        If Not ref.IsBroken Then
            Print # 1 , ref.Name, ref.Major, ref.Minor, ref.Guid, ref.FullPath
        Else
            Print # 1 , "<Broken reference>", ref.Major, ref.Minor, ref.Guid, ""
            CheckReferences = False
        End If
    Next ref
    
    Print # 1 , ""
    Close # 1 

End Function

Public Function LinkReference( _
    sName As String, sGuid As String, _
    dbMaxVersion As Double, Optional dbMinVersion As Double =  0 #) As Double
    
    
    On Error Resume Next
    
    Dim lnkReference As LinkReference
    Set lnkReference = New LinkReference
    lnkReference.Initialize sName, sGuid, dbMaxVersion, dbMinVersion
    
    Open Application.CurrentProject.Path & "\\" & "Application.Log" For Append As # 1 
    Print # 1 , "LinkReference", lnkReference.Name, lnkReference.Guid, "from", dbMaxVersion, "to", dbMinVersion
    
    Dim version As Double, iMajor As Integer, iMinor As Integer
    If dbMinVersion =  0 # Then dbMinVersion = dbMaxVersion
    For version = dbMaxVersion To dbMinVersion Step - 0 . 1 
        iMajor = Int(version)
        iMinor = Int((version - iMajor) *  10  +  0 . 01 )
        Application.References.AddFromGuid lnkReference.Guid, iMajor, iMinor
        DoEvents
        If Err.Number <>  0  Then
            'MsgBox _
                "AddFromGuid" & " " & lnkReference.Name & " " & lnkReference.Guid & _
                " " & iMajor & " " & iMinor & " " & _
                "Error" & " " & Err.Number & " " & Err.Description
            Print # 1 , "AddFromGuid", _
                lnkReference.Name, lnkReference.Guid, _
                iMajor, iMinor, _
                "Error", Err.Number, Err.Description
            Err.Clear
        Else
            Set lnkReference.Reference = Application.References.Item(Application.References.Count)
            ReferenceCollection.Add lnkReference, sName
            'MsgBox _
                "AddFromGuid" & " " & lnkReference.Reference.Name & " " & lnkReference.Reference.Guid & " " & _
                lnkReference.Reference.Major & " " & lnkReference.Reference.Minor & " " & _
                lnkReference.Reference.FullPath
            Print # 1 , "AddFromGuid", _
                lnkReference.Reference.Name, lnkReference.Reference.Guid, _
                lnkReference.Reference.Major, lnkReference.Reference.Minor, _
                lnkReference.Reference.FullPath
            Print # 1 , ""
            Close # 1 
            LinkReference = version
            Exit Function
        End If
    Next version

    'MsgBox _
        "LinkReference Failed" & " " & lnkReference.Name & " " & lnkReference.Guid & " " & _
        lnkReference.MaxVersion & " " & lnkReference.MinVersion
    Print # 1 , "LinkReference Failed"
    Print # 1 , ""
    Close # 1 
    LinkReference = version
    Exit Function

End Function
    
Public Function LinkADODB() As Double

    Dim Name As String, Major As Integer, Minor As Integer, Guid As String, FullPath As String
    Name = "ADODB"
    If CheckReference(Name, Major, Minor, Guid, FullPath) Then
        LinkADODB = Major + Minor /  10 
    Else
        LinkADODB = _
            LinkReference("ADODB", "{2A75196C-D9EB-4129-B803-931327F72D5C}",  3 #,  2 . 8 )
        If LinkADODB =  0 # Then LinkADODB = _
            LinkReference("ADODB", "{EF53050B-882E-4776-B643-EDA472E8E3F2}",  2 . 7 )
        If LinkADODB =  0 # Then LinkADODB = _
            LinkReference("ADODB", "{00000206-0000-0010-8000-00AA006D2EA4}",  2 . 6 ,  2 #)
    End If
    
End Function

Public Function LinkADOX() As Double

    Dim Name As String, Major As Integer, Minor As Integer, Guid As String, FullPath As String
    Name = "ADOX"
    If CheckReference(Name, Major, Minor, Guid, FullPath) Then
        LinkADOX = Major + Minor /  10 
    Else
        LinkADOX = _
            LinkReference("ADOX", "{00000600-0000-0010-8000-00AA006D2EA4}",  3 #,  2 #)
    End If
    
End Function

Ну, и наконец, форма dlgStartup, в которой все это крутится:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
Option Compare Database
Option Explicit

Public bLinkDataOK As Integer
Dim iTimer As Integer
Dim bCanClose As Boolean

Private Sub Form_Load()

    iTimer =  0 
    bCanClose = False
    Me.btnClose.Visible = True
    Me.btnClose.Enabled = False
    Me.lblReference.ForeColor =  0 
    Me.lblProcess.ForeColor = Me.Section( 0 ).BackColor
    Me.lblReference.Caption = "Âûïîëíÿåòñÿ ïðîâåðêà ñèñòåìíûõ áèáëèîòåê . . ."
    Me.lblProcess.Caption = "Âûïîëíÿåòñÿ ïðîâåðêà òàáëèö äàííûõ . . ."
    
    Set LinkReferencesInstance.lnkRef = New LinkReferences
    lnkRef.BindToForm Me
    
End Sub

Private Sub Form_Timer()
On Error GoTo Err_Label

    Me.TimerInterval =  0 
    Me.lblProcess.ForeColor =  0 
    Me.lblReference.ForeColor =  0 
    Me.lblReference.Caption = "Âûïîëíÿåòñÿ ïðîâåðêà ñèñòåìíûõ áèáëèîòåê . . ."
    Me.Repaint
    
   ' Работает хорошо, но как выйдем из Sub - кирдык экземпляру
    With lnkRef
        .CheckReferences
        .LinkADODB
        .LinkADOX
        .CheckReferences
    End With
    
    Me.lblReference.Caption = "Âûïîëíÿåòñÿ ïðîâåðêà ñèñòåìíûõ áèáëèîòåê. Âûïîëíåíî."
    Me.lblProcess.ForeColor =  0 
    Me.lblProcess.Caption = "Âûïîëíÿåòñÿ ïðîâåðêà òàáëèö äàííûõ . . ."
    If Not CheckLinkTables Then
        Me.btnClose.Enabled = True
        Me.btnClose.Visible = True
        Me.Visible = False
        DoCmd.OpenForm "dlgLinkData", acNormal, , , acFormEdit, acDialog
    Else
        Me.lblProcess.Caption = "Âûïîëíÿåòñÿ ïðîâåðêà òàáëèö äàííûõ. Âûïîëíåíî."
        Me.btnClose.Enabled = True
        Me.btnClose.Visible = True
    End If
    
MsgBox lnkRef.ReferenceCollection.Count
    
    Exit Sub
    
Err_Label:
    If Err.Number <>  2467  Then
        'Ââåäåííîå âûðàæåíèå ñîäåðæèò ññûëêó íà îáúåêò,
        'êîòîðûé çàêðûò èëè íå ñóùåñòâóåò.
        MsgBox Err.Description
    End If
    Resume Next

End Sub

Private Sub btnClose_Click()
On Error GoTo Err_Label

MsgBox "btnClose"
If lnkRef Is Nothing Then
    MsgBox "Nothing"
Else
    MsgBox lnkRef.ReferenceCollection.Count
End If
    
    If bCanClose Then
        DoCmd.Close acForm, Me.Name
    Else
        Me.Visible = False
    End If

EXIT_LABEL:
    Exit Sub

Err_Label:
    MsgBox Err.Description
    Resume EXIT_LABEL
    
End Sub

Private Sub Form_Unload(Cancel As Integer)

MsgBox "dlgStartup Unload"
If lnkRef Is Nothing Then
    MsgBox "Nothing"
Else
    MsgBox lnkRef.ReferenceCollection.Count
End If
    
    If Not bCanClose Then
        Cancel = True
        bCanClose = True
        Beep
        Me.lblReference.Caption = "Äî ñêîðîãî ñâèäàíèÿ !"
        Me.lblProcess.Caption = ""
        Me.btnClose.Caption = "Çàêîí÷èòü ðàáîòó ñ ñèñòåìîé"
        Me.Visible = True
        Exit Sub
    End If
    
    bCanClose = True
    Cancel = False
    
If lnkRef Is Nothing Then
    MsgBox "Nothing"
Else
    lnkRef.CheckReferences
End If

    'Вот это место не могу переделать на использование класса, так как к этому моменту он уже Nothing
    Open Application.CurrentProject.Path & "\\" & "Application.Log.Close" For Output As # 1 
    Print # 1 , "Exiting Application", Now
    Print # 1 , ""
    Dim ref As Reference
    For Each ref In Application.References
        If Not ref.IsBroken Then
            Print # 1 , ref.Name, ref.Major, ref.Minor, ref.Guid, ref.FullPath
        Else
            Print # 1 , "<Broken reference>", ref.Major, ref.Minor, ref.Guid, ""
        End If
    Next ref
    
    Print # 1 , ""
    Print # 1 , "Removing", Application.References!ADODB.Name, Application.References!ADODB.Guid
    Print # 1 , "Removing", Application.References!ADOX.Name, Application.References!ADOX.Guid
    
    Beep
    Application.References.Remove Application.References!ADODB
    DoEvents
    Beep
    Application.References.Remove Application.References!ADOX
    DoEvents
    Beep
    
    Print # 1 , ""
    For Each ref In Application.References
        If Not ref.IsBroken Then
            Print # 1 , ref.Name, ref.Major, ref.Minor, ref.Guid, ref.FullPath
        Else
            Print # 1 , "<Broken reference>", ref.Major, ref.Minor, ref.Guid, ""
        End If
    Next ref
    Close # 1 
    
    'Application.Quit

End Sub

Модуль LinkReferencesInstance:

Код: plaintext
1.
2.
3.
4.
5.
Option Compare Database
Option Explicit

Public lnkRef As LinkReferences

...
Рейтинг: 0 / 0
29.11.2004, 11:47:19
    #32803548
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
Неужели придется обходить проблему (записывать действия в специальные таблицы, с тем, чтобы в любой момент восстановить состояние процесса) ?
...
Рейтинг: 0 / 0
29.11.2004, 11:48:27
    #32803551
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
в данном случае (дерганье за ссылки ) - вообще никто ничего не обещал.
Скажи спасибо, что не отсылает сообщений по известному адресу.

нет уверенности, что оно должно работать - тут я не знаю, требуются доп. усилия с моей стороны.

С первого взгляда, проблема где-то внутри Public Function LinkReference


я бы в "линейный" код все это преобразовал. Класс здесь точно не нужен.


(с выражением лица)
...
Рейтинг: 0 / 0
29.11.2004, 11:58:27
    #32803587
Rivkin Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
Закомментируй для отладки почти весь код класса кроме инициализации, например, и постепенно открывай код, каждый раз производя проверки при запуске формы. Так локализуешь проблему. Я попробовал на пустышке - даже без обращения к классу, только создание его уже не возвращает Nothing на созданный класс. Так что ошибка где-то в коде.
...
Рейтинг: 0 / 0
29.11.2004, 12:03:50
    #32803615
Dats
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
Ошибка внутри цикла процедуры LinkReference.
Экземпляр класса Reference надо создавать внутри цикла, а не снаружи.
Т.е. внутри цикла разместить
Dim lnkReference as New Reference

For version = dbMaxVersion To dbMinVersion Step -0.1
iMajor = Int(version)
iMinor = Int((version - iMajor) * 10 + 0.01)
Application.References.AddFromGuid lnkReference.Guid, iMajor, iMinor
DoEvents
If Err.Number <> 0 Then
'MsgBox _
"AddFromGuid" & " " & lnkReference.Name & " " & lnkReference.Guid & _
" " & iMajor & " " & iMinor & " " & _
"Error" & " " & Err.Number & " " & Err.Description
Print #1, "AddFromGuid", _
lnkReference.Name, lnkReference.Guid, _
iMajor, iMinor, _
"Error", Err.Number, Err.Description
Err.Clear
Else
Set lnkReference.Reference = Application.References.Item(Application.References.Count)
ReferenceCollection.Add lnkReference, sName
'MsgBox _
"AddFromGuid" & " " & lnkReference.Reference.Name & " " & lnkReference.Reference.Guid & " " & _
lnkReference.Reference.Major & " " & lnkReference.Reference.Minor & " " & _
lnkReference.Reference.FullPath
Print #1, "AddFromGuid", _
lnkReference.Reference.Name, lnkReference.Reference.Guid, _
lnkReference.Reference.Major, lnkReference.Reference.Minor, _
lnkReference.Reference.FullPath
Print #1, ""
Close #1
LinkReference = version
Exit Function
End If
Next version
...
Рейтинг: 0 / 0
29.11.2004, 12:41:04
    #32803737
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
Внутри размещать, наверное, нельзя.

Тут такая логика:

Создаем объект LinkReference.

В цикле подбираем для него конкретные значения Major и Minor. Когда нашли, то в его поле Reference записываем стандартную VBA-шную ссылку, чтобы были доступны ее свойства.

Жалко в VBA каждую строчку приходится комментировать...
...
Рейтинг: 0 / 0
29.11.2004, 13:01:08
    #32803815
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
Программист-любительЖалко в VBA каждую строчку приходится комментировать...

В VBA-редакторе существуют команды Comment Block и Uncomment Block, и я ими активно пользуюсь.

К сожалению, их обнаружить не так легко: в меню они отсутствуют, а панель, на которой находятся соответствующие кнопки, не показывается по умолчанию. Самый простой способ "достать" эти функции - это "включить" панель инструментов Edit (удобно расположить её по правой границе окна). Можно также "кастомизировать" меню или панель инструментов Standard, добавив туда эти команды.
...
Рейтинг: 0 / 0
29.11.2004, 13:02:47
    #32803821
Dats
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
Программист-ЛюбительВнутри размещать, наверное, нельзя.

Тут такая логика:

Создаем объект LinkReference.

В цикле подбираем для него конкретные значения Major и Minor. Когда нашли, то в его поле Reference записываем стандартную VBA-шную ссылку, чтобы были доступны ее свойства.

Жалко в VBA каждую строчку приходится комментировать...

А почему применяется стандартный VBA-шный объект Reference? По-моему, он имеет какое-то отношение к COM. Это своего рода счетчик. Если количество ссылок на объект с этим счетчиком 0 - то объект уничтожается. Соответственно вызывается Деструктор базового класса. И наверное, по-этому MsBox в твоем деструкторе не отрабатывает.

Попробуй написать свой подобный класс.
...
Рейтинг: 0 / 0
29.11.2004, 13:12:09
    #32803850
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
2 Dats

проект все равно сбросится, если произойдет реальное изменение в наборе ссылок.



(с выражением лица)
...
Рейтинг: 0 / 0
29.11.2004, 15:06:35
    #32804181
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
Спасибо за Comment Block !!!

Проект при переустановке ссылок на объектные библиотеки работает.

Цель всего этого ковыряния - запуск приложения на разных версиях Office, с разными версиями библиотек ADODB и ADOX. То есть это те ссылки, которые в ручном режиме цепляются через Tools|References меню VBA.

В линейном коде вообще все работает, но я хотел при старте запомнить свежеподключенные ссылки в коллекции, чтобы при выходе их отключить.

Как показали эксперименты, если при старте приложения ссылок на ADODB воовсе нет, то ее можно нормально подключить. Но если не отключать при выходе, то при следующем запуске на машине с другой конфигурацией она окажется "broken". Вот такая у меня никак не отключалась. Поэтому я и решил отключать проблемные ссылки (внешние и зависящие от версии MDAC/Office/Windows отключать).

При подключении действует простой механизм перебора от высших номеров версии к низшим.

Проблема ТОЛЬКО в уничтожении объекта класса за время жизни формы. О чем и вопию...
...
Рейтинг: 0 / 0
29.11.2004, 15:15:47
    #32804203
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
авторВ линейном коде вообще все работает, но я хотел при старте запомнить свежеподключенные ссылки в коллекции, чтобы при выходе их отключить.

я не буду спрашивать, зачем тебе их отключать...

сделай макрос автозапуска.
свой код по проверке ссылок запускай до старта скрытой формы.
Если нужно, результат - сохраняй в таблице.

Кешировать в собственных переменных коллекцию ссылок во время исполнения - совсем не надо.

При выходе, если очень надо, сравнивай guid ссылки с ожидаемым значением,
и отключай на здоровье.

ЗЫ

вот тебе аналогия. Пишешь класс, поднимаешь экземпляр, потом через vbe дописываешь метод и хочешь обратиться к поднятому экземпляру ( типа по таймеру) - свежедописанный метод подергать...
Как думаешь, что получится?
...
Рейтинг: 0 / 0
29.11.2004, 15:20:33
    #32804217
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
Пождалуй в таком направлении и переделаю.
...
Рейтинг: 0 / 0
29.11.2004, 16:48:01
    #32804433
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
Я не понял, а зачем ты версии перебираешь?

Или я не понял сути задачи

Я просто делал (подключал) референсы с номером версии 0.0, а Акс сам подхватывал существующую на компутере (или не подхватывал - если ее не было :( )
...
Рейтинг: 0 / 0
29.11.2004, 16:55:09
    #32804460
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ?
То есть при старте достаточно делать AddFromGUID с правильным GUIDом и фиктивными номерами 0, 0 ?
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Уничтожается ссылка на класс. Как сделать экземпляр долгоживущим глобальным ? / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]