Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.139.90.172] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте. Я создаю динамически документ ворд через приложение vba excel, далее заполняю его данными. Подскажите нужно ли удалять объекты, через которые я
создаю документ word, такие как oWord, oDocument, docActive в моей программе. Будет ли утечка памяти, если не удалить эти объекты. Если нужно их удалять, то подскажите как это сделать. Dim oWord As Object Dim oDocument As Object Sub Add_Doc_Zadvizhek() Dim Mytime, myTimeSokr As String 'Переменная для текущего времени Dim MyDate As String 'Переменная текущей даты Dim TimeDate As String 'Переменная содержащая дату и время Dim NameWihtoutDate, SaveFileName As String 'NameWihtoutDate - Имя файла без даты, FileName - имя файлы с датой Dim Dlina_Mytime As Integer 'длина строки Dim Putfile As String Dim tableNew As Object Dim docActive As Object Dim i, j As Integer Dim myRange As Object Dim nach_poz As Integer Dim kon_poz As Integer Dim kol_zadv As Integer Dim provKoncStran As Integer Dim NomNachStrShkaf, NomKonStrShkaf, NomTekStroki, KolZadvShkafa As Integer Dim nextPage As Integer 'Индикатор следующей страницы, перешла ли строка таблицы на следующую страницу Dim tekStrDokum, RowPredStolb As Integer Dim NazvShkProdolj As String 'Даём этому экземпляру имя "oWord". Через это имя 'будем обращаться к программе Word. Set oWord = CreateObject("Word.Application") 'Делаем программу "Word" видимой. oWord.Visible = True 'Создаём в программе Word документ и обращаемся к этому 'документу как "oDocument". Set oDocument = oWord.Documents.Add 'Присваиваем объекту docActive активный документ приложения oWord Set docActive = oWord.ActiveDocument Далее идет заполнение документа большим объемом данных... |
Сообщ.
#2
,
|
|
|
Поскольку переменные определены на уровне модуля (почему, кстати?), а инициализируются в процедуре - да, нужно чистить (не забыть предварительно закрыть методами Close/Exit/Quit/etc.) присвоением Nothing. Впрочем, это не гарантирует выгрузки хост-процесса объекта Word.Application, так что если под утечкой памяти понимать в т.ч. и появление нескольких копий такого хост-процесса - то подобное вполне может быть.
|
Сообщ.
#3
,
|
|
|
Цитата Akina @ Поскольку переменные определены на уровне модуля (почему, кстати?), а инициализируются в процедуре - да, нужно чистить (не забыть предварительно закрыть методами Close/Exit/Quit/etc.) присвоением Nothing. Впрочем, это не гарантирует выгрузки хост-процесса объекта Word.Application. А если переменные определять на уровне процедуры, то можно не очищать память? Скажите а что может гарантировать выгрузку хост-процесса объекта Word.Application? Вы не можете показать как очищать память в моем примере? |
Сообщ.
#4
,
|
|
|
Цитата Fellinggood @ А если переменные определять на уровне процедуры, то можно не очищать память? Не очищать - можно (хотя и в этом случае не рекомендуется). Не закрывать (Document.Close, Application.Quit) - нельзя. Цитата Fellinggood @ что может гарантировать выгрузку хост-процесса объекта Word.Application? Я не видел примеров кода, гарантирующих завершение хост-процесса. Равно как не видел примеров его принудительного снятия без возможного завершения других (открытых параллельно) экземпляров Ворда. |
Сообщ.
#5
,
|
|
|
Цитата Akina @ Не очищать - можно (хотя и в этом случае не рекомендуется). Не закрывать (Document.Close, Application.Quit) - нельзя. А если мне нужно чтобы документ был открытым и чтобы пользователь когда ему нужно сам закрывал документ, эти процессы могут быть обработаны самостоятельно Document.Close, Application.Quit Добавлено И еще вопрос: покажите пожалуйста, как очищать память для этих объектов Set oWord = CreateObject("Word.Application") Set oDocument = oWord.Documents.Add И в каком порядке закрывать объекты: Document.Close, Application.Quit |
Сообщ.
#6
,
|
|
|
Цитата Fellinggood @ в каком порядке закрывать объекты В порядке, строго обратном открытию. После чего выполнять освобождение переменных. Т.е. в показанном случае Set oWord = CreateObject("Word.Application") Set oDocument = oWord.Documents.Add ' Необходимые действия с объектами ' ... ' Закрытие ресурсов oDocument.Close ' или даже ForEach oDoc In oWord.Documents : oDoc.Close : Next oWord.Quit ' Освобождение переменных Set oDocument = Nothing Set oWord = Nothing Цитата Fellinggood @ мне нужно чтобы документ был открытым и чтобы пользователь когда ему нужно сам закрывал документ Тогда только освобождение переменных. |
Сообщ.
#7
,
|
|
|
Цитата Akina @ Цитата Fellinggood @ мне нужно чтобы документ был открытым и чтобы пользователь когда ему нужно сам закрывал документ Тогда только освобождение переменных. спасибо! Добавлено Цитата Akina @ В порядке, строго обратном открытию. После чего выполнять освобождение переменных. Т.е. в показанном случае ' Закрытие ресурсов oDocument.Close ' или даже ForEach oDoc In oWord.Documents : oDoc.Close : Next oWord.Quit ' Освобождение переменных Set oDocument = Nothing Set oWord = Nothing[/CODE] Цитата Fellinggood @ мне нужно чтобы документ был открытым и чтобы пользователь когда ему нужно сам закрывал документ Тогда только освобождение переменных. А переменную Set docActive = oWord.ActiveDocument нужно освобождать? А то мне на другом форуме подсказали, что она ссылается на тот же объект, что и oDocument? |
Сообщ.
#8
,
|
|
|
Цитата Fellinggood @ А переменную Set docActive = oWord.ActiveDocument нужно освобождать? Да, конечно. |
Сообщ.
#9
,
|
|
|
Цитата Akina @ Цитата Fellinggood @ А переменную Set docActive = oWord.ActiveDocument нужно освобождать? Да, конечно. А что раньше oDocument или docActive удалять? В обратном порядке как они появлялись? |
Сообщ.
#10
,
|
|
|
Да.
|