Здравствуйте, mitja_r, Вы писали:
_>Можно повесить обработчик на onkeydown, и там перехватывать нужные клавиши.
А как направить сообщения в ActiveX форму? Код такой:
<HTML>
<H1> C++Builder 5 ActiveX Test Page </H1><p>
You should see your C++Builder 5 forms or controls embedded in the form below.
<HR><center><P>
<OBJECT
classid="clsid:5F34CE34-982F-11D7-9505-00C12801801C"
codebase="/ActiveFormProj1.inf"
width=522
height=336
align=center
hspace=0
vspace=0
>
</OBJECT>
</HTML>
Здравствуйте, KBH, Вы писали:
KBH>Здравствуйте, mitja_r, Вы писали:
_>>Можно повесить обработчик на onkeydown, и там перехватывать нужные клавиши.
KBH>А как направить сообщения в ActiveX форму? Код такой:
KBH>
<HTML>>
<H1>> C++Builder 5 ActiveX Test Page </H1><p>
KBH>You should see your C++Builder 5 forms or controls embedded in the form below.
<HR>><center><P>
KBH><OBJECT
KBH> classid="clsid:5F34CE34-982F-11D7-9505-00C12801801C"
KBH> codebase="/ActiveFormProj1.inf"
KBH> width=522
KBH> height=336
KBH> align=center
KBH> hspace=0
KBH> vspace=0
>>
KBH></OBJECT>
KBH></HTML>
KBH>
Самое простое — сделать у этого ActiveX какой-нибудь метод, типа pressKey(key: int);
И из браузера просто вызывать этот метод с параметром нужной клавиши.
Здравствуйте, DSD, Вы писали:
DSD>Самое простое — сделать у этого ActiveX какой-нибудь метод, типа pressKey(key: int); DSD>И из браузера просто вызывать этот метод с параметром нужной клавиши.
Я не пойму, а что должно быть в этом обработчике? И как его вызывать, если не трудно, можно пример?
Здравствуйте, KBH, Вы писали:
KBH>Я не пойму, а что должно быть в этом обработчике?
Как что? Обработка клавиши, конечно. Что хотите, то и пишите.
Например, можете стандартным способом(типа SendMessage или PostMessage) передать код кнопки на "форму" самого обьекта.
Единственно — коды клавиш у браузера и у винды в целом могут не совпадать, тогда придется писать какое-нибудь преобразование из одной системы кодов в другую.
KBH>И как его вызывать, если не трудно, можно пример?
<HTML>
<H1> C++Builder 5 ActiveX Test Page </H1><p>
You should see your C++Builder 5 forms or controls embedded in the form below.
<HR><center><P>
<OBJECT id="myobj"
classid="clsid:5F34CE34-982F-11D7-9505-00C12801801C"
codebase="/ActiveFormProj1.inf"
width=522
height=336
align=center
hspace=0
vspace=0
>
</OBJECT>
<script language="javascript">
document.body.onkeydown=function() {
document.all.myobj.pressKey(event.keyCode); // вызываем метод обьекта и передаем в него код нажатой клавиши.
event.returnValue = false; // Подавляем стандартную реакцию
}
</script>
</HTML>
KBH>Дело в том, что события нажатия клавиш до формы доходят кроме: Tab, Up, Left ... KBH>А вот как сделать, чтобы все клавиши обрабатывались формой?
Ну так и сделай, как я сказал. Если клавиша из нужного тебе списка(Tab, Up, Left ...), то пересылаешь ее форме.
Здравствуйте, DSD, Вы писали:
DSD>Например, можете стандартным способом(типа SendMessage или PostMessage) передать код кнопки на "форму" самого обьекта.
Хорошо, создал я функцию, которую вызываю из обработчика события OnKeyDown:
Здравствуйте, DSD, Вы писали:
DSD>Здравствуйте, KBH, Вы писали:
DSD>Например, можете стандартным способом(типа SendMessage или PostMessage) передать код кнопки на "форму" самого обьекта.
Нужно использовать SendMessage() для посылки сообщения напрямую компоненту ActiveX.
DSD>Единственно — коды клавиш у браузера и у винды в целом могут не совпадать, тогда придется писать какое-нибудь преобразование из одной системы кодов в другую.
Я сделал так:
<HTML>
<H1> C++Builder 5 ActiveX Test Page </H1><p>
You should see your C++Builder 5 forms or controls embedded in the form below.
<script language="javascript">
function KeyDown()
{
var Key = event.keyCode;
if( Key == 9 )
event.returnValue = false; // Подавляем стандартную реакцию
document.all.XObj.KeyPress(Key);
}
</script>
<body onkeydown="javascript:KeyDown()">
<HR><center><P>
<OBJECT id = "XObj"
classid="clsid:5F34CE34-982F-11D7-9505-00C12801801C"
codebase="/ActiveFormProj1.inf"
width=522
height=336
align=center
hspace=0
vspace=0
>
</HTML>
И не надо ничего преобразовывать. Всё отлично работает!!!
Спасибо за помощь.
Здравствуйте, KBH, Вы писали:
KBH>И не надо ничего преобразовывать.
Ну, я ж сказал "могут не совпадать", сам-то я не проверял
KBH>Всё отлично работает!!! KBH>Спасибо за помощь.
Рад за тебя
Здравствуйте, PAlexander, Вы писали:
PA>Привет всем.
PA>У меня тоже получилось-. PA>Хотя тема закрыта... хотелось бы спросить кое-что.
PA>Проблема:При первом вызове метода моего ActiveX IE предупреждает, PA>что мой ActiveX опасен и спрашивает: Запустить его?
PA>Вопрос: как отключить (обойти) эту защиту? PA>Желательно из javascript
Скорее IE выкидывает предупреждение не при вызове метода обьекта, а при его создании.
обойти из JS — практически никак. Отключить эти вопросы можно в настройках безопасности.
Что это такое и как это отключить — я уже писал тут: http://www.rsdn.ru/Forum/?mid=325429
<HTML>>
<H1>> C++Builder 5 ActiveX Test Page </H1><p>
KBH>You should see your C++Builder 5 forms or controls embedded in the form below.
KBH><script language="javascript">
KBH>function KeyDown()
KBH>{
KBH> var Key = event.keyCode;
KBH> if( Key == 9 )
KBH> event.returnValue = false; // Подавляем стандартную реакцию
KBH> document.all.XObj.KeyPress(Key);
KBH>}
KBH></script>
KBH><body onkeydown="javascript:KeyDown()">
<HR>><center><P>
KBH><OBJECT id = "XObj"
KBH> classid="clsid:5F34CE34-982F-11D7-9505-00C12801801C"
KBH> codebase="/ActiveFormProj1.inf"
KBH> width=522
KBH> height=336
KBH> align=center
KBH> hspace=0
KBH> vspace=0
>>
KBH></HTML>
KBH>
Я воспользовался таким решением. И столкнулся с такой проблемой:
В ActiveX элементе расположен элемент Static на него вешается поле вода, т. е. при создание поля ввода
static указывается как его родитель. Ну так вот это решение работает пока не щелкнешь мышкой по static.
Если челкнуть, то фокус получает окно IE. В результате нажав стрелку вниз мы не смещаем карретку поля ввода,
а сколируем HTML документ.