Тема: Помогите разобраться с понятиями "контекст документа" и "контекст приложения".

Правильно ли я понимаю следующее.

1. В коде моей команды я создаю немодальное диалоговое окно и вывожу его на экран.
   Команда благополучно завершается. Созданное окно остается. В отсутствие активных команд код обработчиков событий данного д/окна выполняется в контексте приложения.

2. Если активна некоторая команда, происходит интерактивный запрос к пользователю и я нажимаю кнопку моего немодального д/окна, то код обработчика по прежнему выполняется в контексте приложения.

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

4. Если третий пункт верен, то в коде обработчика получив указадель на workingDatabase я получаю указатель на базу захваченного неактивного документа, а не на базу текущего активного.

5. Если третий пункт неверен, то что означает выполняться в контексте документа?.

Re: Помогите разобраться с понятиями "контекст документа" и "контекст приложения".

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

Re: Помогите разобраться с понятиями "контекст документа" и "контекст приложения".

Пункт 3 неверен. Блокировка документа не приводит к тому, что код выполняется в контексте документа. Она лишь позволяет изменять документ (точнее соответствующий чертеж). А проверить в контексте ли приложения выполняется код ты можешь при помощи:

if (acDocManager->isApplicationContext()) {
  // Выполняемся в контексте приложения
}

В контексте документа может выполняться команда, которая зарегистрирована без флага ACRX_CMD_SESSION, или lisp-функция определенная через acedDefun().

Re: Помогите разобраться с понятиями "контекст документа" и "контекст приложения".

Так может ли код моего обработчика переключиться в контекст документа. Или понятие контекста документа применимо исключительно к двум указанным вами случаям: команда и Lisp-функция. Т.е. на самом деле - это контекст активного документа и никаких других контекстов документа не бывает.

(изменено: Александр Ривилис, 17 сентября 2009г. 14:48:25)

Re: Помогите разобраться с понятиями "контекст документа" и "контекст приложения".

Пастух пишет:

Т.е. на самом деле - это контекст активного документа и никаких других контекстов документа не бывает.

Именно так. Приложение не может переключится в "контекст документа" (обратное возможно, т.е. можно из "контекста документа" выполнить некий код в "контексте приложения" используя acDocManager->executeInApplicationContext()), но оно может запустить команду, которая будет выполнятся в контексте документа.

Re: Помогите разобраться с понятиями "контекст документа" и "контекст приложения".

Получается, если я пишу код команды, то применять проверку acDocManager->isApplicationContext() не нужно , ибо я и так в контексте документа. Если я вызываю acDocManager->executeInApplicationContext()), то я знаю что нахожусь уже в контексте приложения и проверять это с помощью acDocManager->isApplicationContext() опять же нет смысла. С другой стороны, если я пишу обработчик немодального окна, то поток не сможет переключиться в контекст документа и применять acDocManager->isApplicationContext() снова нет смысла. Тогда где же его нужно применять - этот acDocManager->isApplicationContext()?

(изменено: Николай, 17 сентября 2009г. 15:10:38)

Re: Помогите разобраться с понятиями "контекст документа" и "контекст приложения".

если команда вызывается из немодального окна, то в ней и нада перед выполнением ставить проверку на наличие открытых документов.
может быть ситуация, когда закрыты полностью все чертежи. И вот тогда акад умрет :)
а все остальное - мелочи жизни

(изменено: Александр Ривилис, 17 сентября 2009г. 15:15:41)

Re: Помогите разобраться с понятиями "контекст документа" и "контекст приложения".

Пастух пишет:

Тогда где же его нужно применять - этот acDocManager->isApplicationContext()?

А если одна и та же C++-функция у тебя использует и в команде (или lisp-функции) и в неком обработчике (контексте приложения)?

Re: Помогите разобраться с понятиями "контекст документа" и "контекст приложения".

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

Так это тоже мелочь. Ведь чертежи-то все закрыты!  :D
Да и, по правде сказать, непонятно мне, как может помочь acDocManager->isApplicationContext() проверке наличия открытых документов?

А если одна и та же C++-функция у тебя использует и в команде (или lisp-функции) и в неком обработчике (контексте приложения)?

Действительно :|

Re: Помогите разобраться с понятиями "контекст документа" и "контекст приложения".

Может ли функция, зарегистрированная через acedDefun/acedRegFunc и вызваемая из другого ARX-приложения через acedInvoke выполняться в контексте приложения? Очень хочется :)

Re: Помогите разобраться с понятиями "контекст документа" и "контекст приложения".

Не пробовал, но думаю что так работать не будет. Функции зарегистрированные через acedDefun/acedRegFunc регистрируются в конкретном документе (их следует регистрировать в каждом документе, в котором их планируешь вызывать). Следовательно acedInvoke в контексте приложения даже знать не будет о существовании таких зарегистрированных функций. Впрочем можешь поэкспериментировать.  :)