Немного разьяснений по поводу работы с памятью.
В TechnologiCS АПИ есть три области хранения:
локальная
глобальная
автоматическая.
В локальной все объекты работают в рамках области видимости переменной, и уничтожаются вместе с ней (либо при приcвоении всем ссылкам на этот модуль Nothing).
Если это не глобальная переменная, то как правило никаких действий не требуется (не надо всем объектам присваивать Nothing).
Большинство объектов живут именно так.
В автоматической объекты уничтожатся сами, по требования системы. Как например ссылки на свойства уничтожаются вместе с модулем которому они принадлежат. При попытке работать с ними после вы получите ошибку Object is no longer valid
В глобальной объекты создаются и существуют все время во время работы программы.
Это можно проверить таким образом. Запустим такой код
if theApp.FileTypes.ShowModal( "Test" )>0 Then
End If
Запустите, в окне как то настройте модуль (перейдите на определенную запись например, выделите записи, фильтр используйте). При следующем запуске модуль останется в том же состоянии.
Это делается для того, чтобы не читать при каждом запуске все справочники, не хранить постоянно все переменные для работы и таскать их с собой (на каждый справочник свою), сохранять последний выбор и настройки.
Как правило так работают все объекты взятые от Application.
К сожалению, при активном использовании в работе объектов типа SingleDoc (которые работают в глобальной области), создается куча объектов и расходуются ресурсы компьютера (часто совершенно излишне).
Для уничтожения таких объектов предназначены методы:
UserModuleName (дать модулю глобальное имя и перевести в глобальную область),
DeleteModuleByUserModuleName (перевести модуль в локальную область/в старых версияю удалить модуль),
ModuleByUserModuleName (получить модуль из глобальной области по имени).
Эти методы могут перевести объект в глобальную область, перевести в локальную область, сделать несколько копий глобальных объектов (с разными настройками например).
Пример иллюстрирующий работу всех областей хранения объектов.
Sub TestObjectScope
'Dim ft as IFileTypeCommands
'Dim ftCmd as IFileTypeCommands
'Create named global module
Set ft = Nothing
Set ftCmd = Nothing
On Error Resume Next
Set ft = theApp.ModuleByUserModuleName( "MyFileTypes" )
Set ftCmd = theApp.ModuleByUserModuleName( "MyFileTypeCommands" )
On error goto 0
if ft is Nothing then
Set ft = theApp.FileTypes
ft.UserModuleName = "MyFileTypes"
End If
Set ft = Nothing
'Показать глобальную область
if theApp.FileTypes.ShowModal( "Настройте глобальный модуль <ТИПЫ ФАЙЛОВ> (выделите записи, фильтр и пр.)" )>0 then
End If
if theApp.FileTypes.ShowModal( "При последующих обращениях <ТИПЫ ФАЙЛОВ> настройки остались!" )>0 then
End If
Set Ch = theApp.FileTypes.Properties( "COMMANDS" ).AsIDispatch
'Показать локальную область
if Ch.ShowModal( "Настройте локальный модуль <КОМАНДЫ> (выделите записи, фильтр и пр.)" )>0 then
End If
if ftCmd is Nothing then
Set ftCmd = Ch
ftCmd.UserModuleName = "MyFileTypeCommands"
End If
Set Ch = theApp.FileTypes.Properties( "COMMANDS" ).AsIDispatch
if Ch.ShowModal( "При последующих обращениях <КОМАНДЫ> настройки сбросились (так как модуль уничтожен)!" )>0 then
End If
Set P = ch.Properties("ID")
Call theApp.ShowMessageBox( "Показ автоматического удаления 1", "Значение свойства ID=" & P.AsSafeInteger )
''Удалиим локальный модуль сами
Set Ch = Nothing
On Error Resume Next
Err.Clear
Call theApp.ShowMessageBox( "Показ автоматического удаления 2", "Значение свойства ID=" & P.AsSafeInteger ) 'Этот код никогда не сработает из за ошибки
if Err Then
Call theApp.ShowDetailedMessage( "Показ автоматического удаления 3", "А объекта уже нет!", Err.Description )
End if
On Error Goto 0
Set ft = theApp.ModuleByUserModuleName( "MyFileTypes" )
'Покажем глобальный модуль с именем (копия глобального)
if ft.ShowModal( "Настройте именованный глобальный модуль <ТИПЫ ФАЙЛОВ> по другому (выделите записи, фильтр и пр.)" )>0 then
End If
if theApp.FileTypes.ShowModal( "Это глобальный модуль <ТИПЫ ФАЙЛОВ> (все настройки остались!" )>0 then
End If
if ft.ShowModal( "Это именованный глобальный модуль <ТИПЫ ФАЙЛОВ> (все свои настройки остались!" )>0 then
End If
'Покажем глобальный модуль с именем (сделанный из локального)
if ftCmd.ShowModal( "Это именованный локальный модуль <КОМАНДЫ>, котороый мы сделали глобальным. Он не уничтожен и все настройки сохранились!" )>0 then
End If
'Удалим все глобальные модули если нужно
if theApp.MessageBoxAskYesNo( "Подтвердите действие", "Удалить все глобальные объекты в этом примере?", False, 2, True )=1 then
Call theApp.DeleteModuleByUserModuleName( "MyFileTypes" )
Call theApp.DeleteModuleByUserModuleName( "MyFileTypeCommands" )
theApp.FileTypes.UserModuleName = theApp.UniqueUserModuleName
Call theApp.DeleteModuleByUserModuleName( theApp.FileTypes.UserModuleName )
End If
End Sub
Спасибо сказали: Дмитрий Гамий1