В шаблоне документа Ворда ХР (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 создана!
Если же сделать текстовую кнопку (Поле в термине ворда), то ошибки нет, функция вызывается.
Что я не так делаю?
Здравствуйте, Аноним, Вы писали:
А>В шаблоне документа Ворда ХР (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
Здравствуйте, 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
Здравствуйте, 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>
(спрашивающий анонимус это я)
опа, работает! Спасибо!
Но почему работает — не понятно совершенно.
Объясните пожалуйста, я видимо чего-то не понимаю.
Здравствуйте, 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) такого не производится.
Здравствуйте, Аноним, Вы писали:
А>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
Здравствуйте, 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, то в первый раз значение будет потеряно. Если его переприсвоить, то при последующих обращениях через меню оно уже сохраняется.
Причем если это не в шаблоне, а в обычном документе, то все нормально
И если макрос, который вызывается из меню, вынести в простой модуль шаблона, то тоже вроде будет все нормально