Тема: Помогите решить проблему.
Необоходимо решить данную задачу:
Требуеться чтоб autocad на клик по объекту с нажатой клавишей [shift] вызывал мою процедуру из подключенной к документу Dll.
з.ы. заранее спасибо
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Помогите решить проблему.
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Необоходимо решить данную задачу:
Требуеться чтоб autocad на клик по объекту с нажатой клавишей [shift] вызывал мою процедуру из подключенной к документу Dll.
з.ы. заранее спасибо
Попробуй такой вариант:
Private Sub AcadDocument_SelectionChanged() Dim ActiveSet As AcadSelectionSet Set ActiveSet = ThisDrawing.ActiveSelectionSet If (TypeOf ActiveSet(0) Is IAcadCircle) Then ' -например 'вызов процедуры End If End Sub
Он, правда, не лишен недостатков, но может удастся довести его до ума...
Спс за пример, но в нем я не нашел где обрабатываеться комбинация клавишь...
Как я понял это событие срабатывает на выбор объекта, но мне необходимо чтоб процедура вызывалась только если объект был выбран с клавишей [SHIFT].
Наряду с обработкой события SelectionChanged попробуйте использовать обработчики событий KeyDown, KeyUp (либо KeyPress).
А вообще-то все это должно быть описано в HELPе.
> Sigma
Все эти события существуют только для контролсов на VBA-формах. Имхо, задачу решить невозможно.
> Maxim T
Я надеялся что решить проблему можно.
Спс за ответы, тогда буду думать как сделать по другому...
> Maxim
T
Спасибо за лекбез.
Но даже если эти события существуют только для контролов на формах, то кто нам мешает создать какую-либо простенькую форму, и реалиовать обработчик указанных событий. В этих обработчиках можно, например, устанавливать / сбрасывать глобальный флаг "Shift нажата / отжата" (форму при этом можно не отображать).
Кривенько, конечно, но ИМХО, работать должно. А вообще-то это существенная "дыра" в ACADе
Все очень глубокое IMHO:
События не будут генерироваться, если форма скрыта. И вообще события в AutoCAD, если речь идет не об управлении собственно элементами формы, а о базе данных чертежа -- жутко неблагодарная вещь.
> Требуеться
чтоб autocad на клик по объекту с нажатой >клавишей [shift] вызывал мою процедуру
клик по объекту с нажатой клавишей есть отменить select
> cadhelp
В таком случае не обязательно [shift] можно другую кнопку или действие с объктом сделать. Но как результат должна вызываться процедура из подключенной dll.
> Дмитрий
Тогда обрабатывай реакторы. Там есть реактор на изменение состава текущего набора примитивов. Только проблема в том, что он у тебя будет срабатывать всегда, то есть и в нежелательных ситуациях тоже.
не обязательно [shift] можно другую кнопку или действие с объктом сделать.
Но в таком случае можно использовать комбинацию из событий
SelectionChanged и BeginRightClick
именно 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
и все дела
> cadhelp
CСпасибо за помощь, все заработало, но немного изменил твой код.
В ThisDrawing вставил
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
, а не в Dll
Ну и соответственно эвент оставил твоим.
Спасибо все работает.
з.ы. vbKeyTab - отвечает за нажатую клавишу TAB, а не HOME.
В оригинале был HOME. потом уже вспомнил, что с левой стороны остался TAB незадействованый.
Может админу пора вставить???
редактирование своих сообщений???
> cadhelp
Не пойму почему у вас в условии
GetKeyState(vbKeyTab) < 0
?
У меня
GetKeyState(vbKeyTab)
возвращает либо 0, если клавиша не нажата, либо 1, если нажата. В полном соответствии с описанием функции...
фу-я GetKeyState возвращает сишные константы
VK_KEYDOWN = -127
и
VK2_KEYDOWN = -128
у вас другие установки в VB ??
> Leonid
Посмотрите в хелпе VBA, коды клавишь и будет вам счастье
> Дмитрий
Счастье я обрел, разобравшись с отладчиком, оказывается он не успевает отловить фактическое значение функции GetKeyState(vbKeyTab) , т.е. в моей точке останова это значение уже сброшено.Протестировал по-другому и получил -127. Специфика работы и отладки API-функций?..
> cadhelp
Отличное решение!
P.S. А кстати, как поведет себя наша функция, если использовать в качестве дополнительных клавиши-переключатели: CapsLock, NumLock, ScrollLock?
Same, including F1-F12 and vbKeyEscape
search help for "Keycode Constants"
> Дмитрий
> cadhelp
Ребята (господа, товарищи), ну что вы все время про какие-то коды каких-то клавиш, а некоторые так даже по-иностранному!
Вчера у меня уже не было времени (настороя?) проверять свои предположения, а сегодня могу сказать вслух: Нет, не Same, уважаемый товарищ, а возвращает 0 или 1, как я робко намекал в посте> Leonid (2005-02-28 21:29:03). Но только для клавиш-переключателей! То есть, условие: If (GetKeyState(vbKeyTab) < 0) прекрасно работает, но имеются ограничения по его применению.
Best regards!
> Но
только для клавиш-переключателей!
в автокаде ничего другого вы нажать не можете,все остальное лезет в командную строку
GetKeyState(vbKeyTab) вернет
-127 клавиша нажата и удерживается
-128 клавиша нажата нечетный раз
0 клавиша была нажата
1 клавиша была нажата нечетный раз
То что вы видите в дебагере, не отражает реальную ситуацию.
Попробуйте протестировать GetKeyState(vbKeyF12), но при переходе в дебагер не отпускайте клавишу
> cadhelp
Мне кажется, что вы слишком расширительно толкуете определение клавиша-переключатель. На самом деле их всего три (CapsLock, NumLock, ScrollLock), и они ни при какой погоде не возвращают отрицательных значений. Но в общем и целом,
предмет обсуждения исчерпан.
И небольшой вопрос напоследок: а вы не пытались использовать функцию GetKeyboardState, которая получает текущее состояние ВСЕХ виртуальных клавиш? Я попрбовал, и мой ACAD рухнул мгновенно и без звука.
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Помогите решить проблему.
Форум работает на PunBB, при поддержке Informer Technologies, Inc