Глобальность переменной
От: Аноним  
Дата: 22.03.05 12:24
Оценка:
В шаблоне документа Ворда ХР (2002 то есть) есть текст (в разделе Microsoft Word Objects -> ThisDocument)

Dim dllobj As mydll.Iinterf

Public Sub Document_Open()
Set dllobj = New mydll.Class1
End Sub

Public Sub temp_macro()
dllobj.Func
End Sub

ДЛЛ написана на Сшарпе, подключается соответственно через КОМ.
Процедуру temp_macro() я навешиваю на новую кнопочку в разделе Files (точнее пункт меню).
На это ворд откликается "Object variable or With block variable not set".
Но ведь dllobj создана!
Если же сделать текстовую кнопку (Поле в термине ворда), то ошибки нет, функция вызывается.
Что я не так делаю?
Re: Глобальность переменной
От: Elena_ Россия  
Дата: 22.03.05 15:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В шаблоне документа Ворда ХР (2002 то есть) есть текст (в разделе Microsoft Word Objects -> ThisDocument)


А>Dim dllobj As mydll.Iinterf


А>Public Sub Document_Open()

А>Set dllobj = New mydll.Class1
А>End Sub

А>Public Sub temp_macro()

А>dllobj.Func
А>End Sub

А>ДЛЛ написана на Сшарпе, подключается соответственно через КОМ.

А>Процедуру temp_macro() я навешиваю на новую кнопочку в разделе Files (точнее пункт меню).
А>На это ворд откликается "Object variable or With block variable not set".

А>Но ведь dllobj создана!


Скорее всего, нет. Попробуйте вставить в код
А>Public Sub Document_Open()
   MsgBox "Document_Open"
А>Set dllobj = New mydll.Class1
А>End Sub


Дело в том, что для шаблонов, которые открываются не как документы, а именно подгружаются как шаблоны, эти события не работают (по дизайну), при загрузке шаблона вызывается макро AutoExec, при выгрузке AutoExit — они должны быть в обычных модулях, не в ThisDocument
Пользователь — друг программиста!
Re: Глобальность переменной
От: Vi2 Удмуртия http://www.adem.ru
Дата: 23.03.05 04:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Что я не так делаю?


А если сделать так:
Dim dllobj As New mydll.Class1

Public Sub temp_macro()
  Dim dllobjItf As mydll.Iinterf
  Set dllobjItf = dllobj
  dllobjItf.Func
End Sub
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Глобальность переменной
От: Аноним  
Дата: 23.03.05 11:29
Оценка:
Здравствуйте, Elena_, Вы писали:

E_>Здравствуйте, Аноним, Вы писали:


А>>В шаблоне документа Ворда ХР (2002 то есть) есть текст (в разделе Microsoft Word Objects -> ThisDocument)


А>>Dim dllobj As mydll.Iinterf


А>>Public Sub Document_Open()

А>>Set dllobj = New mydll.Class1
А>>End Sub

А>>Public Sub temp_macro()

А>>dllobj.Func
А>>End Sub

А>>ДЛЛ написана на Сшарпе, подключается соответственно через КОМ.

А>>Процедуру temp_macro() я навешиваю на новую кнопочку в разделе Files (точнее пункт меню).
А>>На это ворд откликается "Object variable or With block variable not set".

А>>Но ведь dllobj создана!


E_>Скорее всего, нет. Попробуйте вставить в код

E_>
А>>Public Sub Document_Open()
E_>   MsgBox "Document_Open"
А>>Set dllobj = New mydll.Class1
А>>End Sub
E_>


E_>Дело в том, что для шаблонов, которые открываются не как документы, а именно подгружаются как шаблоны, эти события не работают (по дизайну), при загрузке шаблона вызывается макро AutoExec, при выгрузке AutoExit — они должны быть в обычных модулях, не в ThisDocument



1. Да, процедура эта вызывается, значит объект создается. Наверное, я не договорил что работаю я с документом, который наследуется от этого шаблона. Но редактирую только шаблон, в документе нет никаких макросов
Ощущение — как будто видимость dllobj ограничена вызовом макросов из полей (которые в тексте слова, на которые двойной клик надо сделать). Потому что из процедуры-обработчика этого поля dllobj виден, а из процедуры-обработчика новой кнопки меню — не виден.
Почему и как это исправить, подскажите пожалуйста.

2. Если написать в модуле NewMacros (Project -> My_template -> Modules -> NewMacros)
Public Sub AutoExec()
MsgBox ("AutoExec()")
End Sub

то окошко с "AutoExec()" не появляется
Почему?
Re[2]: Глобальность переменной
От: Kostinus  
Дата: 23.03.05 11:43
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, Аноним, Вы писали:


А>>Что я не так делаю?


Vi2>А если сделать так:

Vi2>
Vi2>Dim dllobj As New mydll.Class1

Vi2>Public Sub temp_macro()
Vi2>  Dim dllobjItf As mydll.Iinterf
Vi2>  Set dllobjItf = dllobj
Vi2>  dllobjItf.Func
Vi2>End Sub
Vi2>


(спрашивающий анонимус это я)
опа, работает! Спасибо!
Но почему работает — не понятно совершенно.
Объясните пожалуйста, я видимо чего-то не понимаю.
Re[3]: Глобальность переменной
От: Vi2 Удмуртия http://www.adem.ru
Дата: 23.03.05 12:16
Оценка:
Здравствуйте, Kostinus, Вы писали:

K>Но почему работает — не понятно совершенно.

K>Объясните пожалуйста, я видимо чего-то не понимаю.

1) Dim dllobj As mydll.Class1
2) Dim dllobj As New mydll.Class1

Это объявления одинаковых переменных в модуле, при загрузке модуля эти переменные получат одинаковые значение Nothing, т.к. это объекты. Однако далее они отличаются. При любом обращении к переменной по объявлению 2) VB проверяет его значение и, если оно равно Nothing, производит создание объекта так, как будто в этом месте проверки стоит оператор Set dllobj = New mydll.Class1. При обращении к переменной по объявлению 1) такого не производится.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[3]: Глобальность переменной
От: Elena_ Россия  
Дата: 23.03.05 23:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>1. Да, процедура эта вызывается, значит объект создается. Наверное, я не договорил что работаю я с документом, который наследуется от этого шаблона. Но редактирую только шаблон, в документе нет никаких макросов

А>Ощущение — как будто видимость dllobj ограничена вызовом макросов из полей (которые в тексте слова, на которые двойной клик надо сделать). Потому что из процедуры-обработчика этого поля dllobj виден, а из процедуры-обработчика новой кнопки меню — не виден.
А>Почему и как это исправить, подскажите пожалуйста.

А>2. Если написать в модуле NewMacros (Project -> My_template -> Modules -> NewMacros)

А>Public Sub AutoExec()
А>MsgBox ("AutoExec()")
А>End Sub

А>то окошко с "AutoExec()" не появляется

А>Почему?

Это я неправильно поняла, какой шаблон — если это шаблон, который открывается вместе с созданным на его основе документом, то работает именно Document_Open, а AutoExec — если шаблон подгружается как global из специальной папки

Можно попробовать вытащить описание в общий модуль, а может быть, описание и саму функцию, которая вызывается из меню, но скорее достаточно описание
'  В общий модуль
Public dllobj As mydll.Iinterf

'---- Может быть и это
Public Sub temp_macro()
dllobj.Func
End Sub
Пользователь — друг программиста!
Re[4]: Глобальность переменной
От: Elena_ Россия  
Дата: 24.03.05 09:43
Оценка:
Здравствуйте, Elena_, Вы писали:

E_>Можно попробовать вытащить описание в общий модуль, а может быть, описание и саму функцию, которая вызывается из меню, но скорее достаточно описание

E_>
E_>'  В общий модуль
E_>Public dllobj As mydll.Iinterf

E_>'---- Может быть и это
E_>Public Sub temp_macro()
E_>dllobj.Func
E_>End Sub
E_>


Да, получается, что если из меню вызывается макрос, который находится в ThisDocument шаблона, прикрепленного к документу, то первый раз происходит сброс. Просто если взять целую переменную в ThisDocument, в Open_document присвоить ей значение, и посмотреть его в макросе, вызываемом через меню и расположенном в ThisDocument, то в первый раз значение будет потеряно. Если его переприсвоить, то при последующих обращениях через меню оно уже сохраняется.

Причем если это не в шаблоне, а в обычном документе, то все нормально

И если макрос, который вызывается из меню, вынести в простой модуль шаблона, то тоже вроде будет все нормально

Похоже на баг?
Пользователь — друг программиста!
Re[5]: Глобальность переменной
От: Kostinus  
Дата: 24.03.05 12:28
Оценка:
Описал боссу ситуацию, он сказал что это баг
Вот так.
Спасибо тебе за ответы, ты помогла прояснить ситуацию!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.