Тема: Помогите решить проблему.

Необоходимо решить данную задачу:
Требуеться чтоб autocad на клик по объекту с нажатой клавишей [shift] вызывал мою процедуру из подключенной к документу Dll.
з.ы. заранее спасибо

Re: Помогите решить проблему.

Попробуй такой вариант:

Private Sub AcadDocument_SelectionChanged()
         Dim ActiveSet As AcadSelectionSet
         Set ActiveSet = ThisDrawing.ActiveSelectionSet
         If (TypeOf ActiveSet(0) Is IAcadCircle) Then ' -например
              'вызов процедуры
         End If
         End Sub

Он, правда, не лишен недостатков, но может  удастся довести его до ума...

Re: Помогите решить проблему.

Спс за пример, но в нем я не нашел где обрабатываеться комбинация клавишь...
Как я понял это событие срабатывает на выбор объекта, но мне необходимо чтоб процедура вызывалась только если объект был выбран с клавишей [SHIFT].

Re: Помогите решить проблему.

Наряду с обработкой события SelectionChanged попробуйте использовать обработчики событий KeyDown, KeyUp (либо KeyPress).
А вообще-то все это должно быть описано в HELPе.

Re: Помогите решить проблему.

> Sigma
Все эти события существуют только для контролсов на VBA-формах. Имхо, задачу решить невозможно.

Re: Помогите решить проблему.

> Maxim T
Я надеялся что решить проблему можно.
Спс за ответы, тогда буду думать как сделать по другому...

Re: Помогите решить проблему.

> Maxim
T
Спасибо за лекбез.
Но даже если эти события существуют только для контролов на формах, то кто нам мешает создать какую-либо простенькую форму, и реалиовать обработчик указанных событий. В этих обработчиках можно, например, устанавливать / сбрасывать глобальный флаг "Shift нажата / отжата" (форму при этом можно не отображать).
Кривенько, конечно, но ИМХО, работать должно. А вообще-то это существенная "дыра" в ACADе

Re: Помогите решить проблему.

..... Да, наверное, глупость написал sad

Re: Помогите решить проблему.

Все очень глубокое IMHO:
События не будут генерироваться, если форма скрыта. И вообще события в AutoCAD, если речь идет не об управлении собственно элементами формы, а о базе данных чертежа -- жутко неблагодарная вещь.

Re: Помогите решить проблему.

> Требуеться
чтоб autocad на клик по объекту с нажатой >клавишей [shift] вызывал мою процедуру
клик по объекту с нажатой клавишей есть отменить  select

Re: Помогите решить проблему.

> cadhelp
В таком случае не обязательно [shift] можно другую кнопку или действие с объктом сделать. Но как результат должна вызываться процедура из подключенной dll.

Re: Помогите решить проблему.

> Дмитрий
Тогда обрабатывай реакторы. Там есть реактор на изменение состава текущего набора примитивов. Только проблема в том, что он у тебя будет срабатывать всегда, то есть и в нежелательных ситуациях тоже.

Re: Помогите решить проблему.

"Там есть реактор " Там - это в Лиспе.

Re: Помогите решить проблему.

Дмитрий пишет:

не обязательно [shift] можно другую кнопку или действие с объктом сделать.

Но в таком случае можно использовать комбинацию из событий
SelectionChanged и BeginRightClick

Re: Помогите решить проблему.

именно SelectionChanged или BeginRightClick
пихаеш' в модуль

Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer

в евнт

Private Sub AcadDocument_SelectionChanged()
    If ThisDrawing.ActiveSelectionSet.Count = 1 Then
        If (GetKeyState(vbKeyTab) < 0) Then
            MsgBox ThisDrawing.ActiveSelectionSet.Item(0).ObjectName & _
                            vbCrLf & "With HOME button presed"
        End If
    End If
End Sub

и все дела

Re: Помогите решить проблему.

> cadhelp
CСпасибо за помощь, все заработало, но немного изменил твой код.
В ThisDrawing вставил

Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer

, а не в Dll
Ну и соответственно эвент оставил твоим.
Спасибо все работает.
з.ы. vbKeyTab - отвечает за нажатую клавишу TAB, а не HOME.

Re: Помогите решить проблему.

В оригинале был HOME. потом уже вспомнил, что с левой стороны остался TAB незадействованый.
Может админу пора вставить???
редактирование своих сообщений???

Re: Помогите решить проблему.

> cadhelp
Не пойму почему у вас в условии

GetKeyState(vbKeyTab) < 0

?
У меня

GetKeyState(vbKeyTab)

возвращает либо 0, если клавиша не нажата, либо 1, если нажата. В полном соответствии с описанием функции...

Re: Помогите решить проблему.

фу-я GetKeyState возвращает сишные константы
VK_KEYDOWN = -127
и
VK2_KEYDOWN = -128
у вас другие установки в VB ??

Re: Помогите решить проблему.

> Leonid
Посмотрите в хелпе VBA, коды клавишь и будет вам счастье

Re: Помогите решить проблему.

> Дмитрий
Счастье я обрел, разобравшись с отладчиком, оказывается  он не успевает отловить фактическое значение функции GetKeyState(vbKeyTab) , т.е. в моей точке останова это значение уже сброшено.Протестировал по-другому и получил -127. Специфика работы и отладки API-функций?..

> cadhelp
Отличное решение!
P.S. А кстати, как поведет себя наша функция, если использовать в качестве дополнительных клавиши-переключатели: CapsLock, NumLock, ScrollLock?

Re: Помогите решить проблему.

Same, including F1-F12 and vbKeyEscape
search help for "Keycode Constants"

Re: Помогите решить проблему.

> Дмитрий

> cadhelp
Ребята (господа, товарищи), ну что вы все время про какие-то коды каких-то клавиш, а некоторые так даже по-иностранному!
Вчера у меня уже не было времени (настороя?) проверять свои предположения, а сегодня  могу сказать вслух: Нет, не Same, уважаемый товарищ, а возвращает 0 или 1, как я робко намекал в посте> Leonid (2005-02-28 21:29:03). Но только для клавиш-переключателей! То есть, условие: If (GetKeyState(vbKeyTab) < 0) прекрасно работает, но имеются ограничения по его применению.
Best regards!

Re: Помогите решить проблему.

> Но
только для клавиш-переключателей!
в автокаде ничего другого вы нажать не можете,все остальное лезет в командную строку
GetKeyState(vbKeyTab) вернет
-127 клавиша нажата и удерживается
-128 клавиша нажата нечетный раз
0    клавиша была нажата
1    клавиша была нажата нечетный раз
То что вы видите в дебагере, не отражает реальную ситуацию.
Попробуйте протестировать GetKeyState(vbKeyF12), но при переходе в дебагер не отпускайте клавишу

Re: Помогите решить проблему.

> cadhelp
Мне кажется, что вы слишком расширительно толкуете определение клавиша-переключатель. На самом деле их всего три (CapsLock, NumLock, ScrollLock), и они ни при какой погоде не возвращают отрицательных значений. Но в общем и целом,
предмет обсуждения исчерпан.
И небольшой вопрос напоследок: а вы не пытались использовать функцию GetKeyboardState, которая получает текущее состояние ВСЕХ виртуальных клавиш? Я попрбовал, и мой ACAD рухнул мгновенно и без звука.