Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Перенос курсора в конец строки поля ввода (sendkeys("{END}"). Почему не работает?

v7: Перенос курсора в конец строки поля ввода (sendkeys("{END}"). Почему не работает?
Я
   jah1111
 
13.08.20 - 22:31
Нужно, чтобы функция после каждого вводимого символа ставила курсор в конец строки (ну или после символа, еще не решил. тогда будет эмуляция не END а "стрелка вправо"). Но... не работает, курсор постоянно мигает в начале строки

Функция ПриВыбореЗначения(Об="")
    Енд = СоздатьОбъект("Wscript.Shell");
    Если
        Об  = "" Тогда
        Об = Форма.АктивныйЭлемент();
    КонецЕсли;

        Если Об="кнЙ" Тогда                // ввод бувы "Й"
        Поле=СокрЛП(Поле)+"Й";
        ПошукПоБукв();
        активизировать("Поле");
        енд.SendKeys("{END}");  
        КонецЕсли;
в чем не так?
   Злопчинский
 
1 - 13.08.20 - 23:05
ээээ...
в поле ввода принаборе значения СТРОКА - курсор сдвигается по мере набора смволов
   Злопчинский
 
2 - 13.08.20 - 23:06
сначала дождись активизации поля, а потом уже двигай в нем курсор
   jah1111
 
3 - 13.08.20 - 23:23
а как дождаться? задержку ставить?
   jah1111
 
4 - 13.08.20 - 23:24
(1) да, но форма для сенсора
   Злопчинский
 
5 - 14.08.20 - 00:12
(4) xчто значит для сенсора? железной клавы нет? если виртуальная клавиатура - и что-то не получается (хотя нихера непонятно почему) - набирай нажимаемые символы в переменную в строку и показывай ее на экране без всяких полей ввода.
   Злопчинский
 
6 - 14.08.20 - 00:14
(4) xчто значит для сенсора? железной клавы нет? если виртуальная клавиатура - и что-то не получается (хотя ничего непонятно почему) - набирай нажимаемые символы в переменную в строку и показывай ее на экране без всяких полей ввода.
   jah1111
 
7 - 14.08.20 - 00:36
(6) Есть резон в Ваших словах. но с Полем ввода можна работать двумя способами  - и виртуальной и железной клавой (на всякий случай).
   Ёпрст
 
8 - 14.08.20 - 00:42
(7) И ? поведение там одинаковое - курсор всегда в конце строки после ввода
   jah1111
 
9 - 14.08.20 - 00:53
(8) ну в моем случае курсор остается в начале строки и сендкей(енд) не помагает
реализуется клава для ввода в строку поиска на тач скрин
   Ёпрст
 
10 - 14.08.20 - 01:17
(9) ты в поле ввода сам что -ле символы затаскиваешь, перехватывая нажатия кнопок ? Или что ?
   uno-group
 
11 - 14.08.20 - 08:15
чет мне кажется что он в 1с свою виртуальную клавиатуру рисует
   HawkEye
 
12 - 14.08.20 - 08:19
(9) код покажь ))
   Калиостро
 
13 - 14.08.20 - 10:36
(0) А точно у тебя в коде:
активизировать("Поле");
а не 
активизировать(Поле);
??
   jah1111
 
14 - 14.08.20 - 13:01
(10) без перехвата. просто добавляю символ в поле ввода кодом Поле=СокрЛП(Поле)+"здесь сивол";
   jah1111
 
15 - 14.08.20 - 13:03
(11) да, именно. простенькую, под полем ввода, которое явлется строкой поиска.
   jah1111
 
16 - 14.08.20 - 13:03
(12) а код, собственно такой же:
   jah1111
 
17 - 14.08.20 - 13:12
каждой кнопке виртуальной клав. присвоена функция ПриВыбореЗначения(Об="")
Функция ПриВыбореЗначения(Об="")
    Енд = СоздатьОбъект("Wscript.Shell");//подключаем сендкейс для эмуляции клавиши END

    Если
        Об  = "" Тогда
        Об = Форма.АктивныйЭлемент();// определяем активный элемент

    КонецЕсли;

        Если Об="кнЙ" Тогда                // ввод бувы "Й" при нажатии на кнопку "кнЙ" к примеру 

        Поле=СокрЛП(Поле)+"Й";
        ПошукПоБукв();                    // процедура в модуле которая выполняет поиск в справочнике после ввода каждого символа

        активизировать("Поле");          // после справочника возвращаемся назад в поле ввода с буквой Й

        енд.SendKeys("{END}");            // эмулируем нажатие END для переноса курсора в конец строки

        КонецЕсли;
   Salimbek
 
18 - 14.08.20 - 13:58
(8) в 7-ке при активизации поля курсор в начало строки лезет и весь текст обычно выделяется
(0) Скорее всего дело в том, что в этой процедуре ты активизируешь поле, но фактически оно активизируется только _после_ выхода из этой процедуры. Т.е. ты дал команду 1С-ке - "Активизировать", и сразу же отправил ей sendkeys, но 1С-ка сначала выполнила этот самый СендКейс, потом вышла из этой процедурки и только потом активизировала поле. После чего курсор убежал в начало.
Если я прав, то тут проще всего сделать так: делаешь "Активизировать" и сразу же подключаешь ОбработкаОжидания на минимум, и потом, в этой уже ОбработкеОжидания, отправляешь СендКейс и отключаешь эту самую Обработку ожидания.
   uno-group
 
19 - 14.08.20 - 14:21
чет как то все сложно. У меня цифровая клавиатура както так выглядит куча кнопок на них типа Цифра(1)
//-----------------------------------------------------------------------

Процедура Цифра(Режим);
    Если (Режим="+")или(Режим="-") Тогда
        Вычислить();
    КонецЕсли;
    Если Режим="С" Тогда
        ЧислоСтр="";
        Форма.Число.Заголовок(ЧислоСтр);
        Возврат;    
    КонецЕсли;
    Если СокрЛП(ЧислоСтр)="0" Тогда
        ЧислоСтр="";
    КонецЕсли;
    ЧислоСтр=ЧислоСтр+Режим;
    Форма.Число.Заголовок(ЧислоСтр);
КонецПроцедуры
//-----------------------------------------------------------------------

Процедура Дел();
    ЧислоСтр=Лев(ЧислоСтр,СтрДлина(ЧислоСтр)-1);
    Форма.Число.Заголовок(ЧислоСтр);
КонецПроцедуры
//-----------------------------------------------------------------------

Процедура Ввод();
    Вычислить();
    Форма.Параметр=ЧислоСтр;
    Форма.Закрыть();
КонецПроцедуры
   uno-group
 
20 - 14.08.20 - 14:24
А для отлова обычной клавы.
//------------------------------------------------

Процедура ПриНажатииКнопкиКлавиатуры(конт, код, _а, _ш, _к)
    Если Конт=125 Тогда
        //зеленая клавиша откроем документ

//        Сформировать();
        ВыбТребование();
    ИначеЕсли Конт=126 Тогда
        // Красная клавиша обновим список требований

        Форма.Закрыть();
    КонецЕсли;
КонецПроцедуры
//*******************************************

ЗагрузитьВнешнююКомпоненту("FormEx.dll");
Раскраска=СоздатьОбъект("Сервис");
Раскраска.ВключитьРаскраскуТаблиц();
Эдди=СоздатьОбъект("ADDY.ADD");
   jah1111
 
21 - 14.08.20 - 14:53
(18)ну если вы правы то просто надо SendKeys прописать в отдельной процедуре.
типо:

ПроцедураКурсорЕнд ()
Енд = СоздатьОбъект("Wscript.Shell");
енд.SendKeys("{END}");  
КонецПроцедуры
Функция ПриВыбореЗначения(Об="")
      Если
        Об  = "" Тогда
        Об = Форма.АктивныйЭлемент();
    КонецЕсли;

        Если Об="кнЙ" Тогда                // ввод бувы "Й"

        Поле=СокрЛП(Поле)+"Й";
        ПошукПоБукв();
        активизировать("Поле");
        ПроцедураКурсорЕнд ()
        КонецЕсли;
тогда СендКей уж точно должен после активизации выполняться или нет?
   jah1111
 
22 - 14.08.20 - 14:59
ай сори, нифига.....
   jah1111
 
23 - 14.08.20 - 15:03
разве что прописать ПроцедураКурсорЕнд () в формуле кнопки после ПриВыбореЗначения()
   Salimbek
 
24 - 14.08.20 - 15:23
(21) Конечно же нет. Ничего этого не сработает. По простой причине - есть Код, для выполнения, он вот и будет выполняться, с процедурами, вызовами и прочим. А вот когда он закончит выполняться, тогда и отработает "Сервисный" код. И вам надо вызвать свою команду _после_ этого "сервисного" кода.
Для этого и пишу вам - ОбработкаОжидания.
   Salimbek
 
25 - 14.08.20 - 15:24
(23) Это тоже не поможет
   jah1111
 
26 - 14.08.20 - 15:26
(25) почему?
я понимаю что Вы пишете, но куда эту обработкаожидания вставить мне невдомек
   Salimbek
 
27 - 14.08.20 - 15:38
(26) В твоем коде последним пишешь:
Форма.ОбработкаОжидания("ПроцедураКурсорЕнд",1);

в этой самой ПроцедураКурсорЕнд - отправляешь свой СендКейс и отключаешь (чтобы оно каждую секунду не слало нажатие), 

Форма.ОбработкаОжидания("ПроцедураКурсорЕнд",0);
   Ёпрст
 
28 - 14.08.20 - 16:48
В ложном закрытии формы двигай свой курсор
   Ёпрст
 
29 - 14.08.20 - 16:49
И..не помню, в какой то вк был вообще метод управления курсором, вспоминать лень
   jah1111
 
30 - 14.08.20 - 19:06
(29) вспомните - отпишитесь
 
 Рекламное место пустует
   jah1111
 
31 - 14.08.20 - 19:06
(27) не пашет....
   jah1111
 
32 - 14.08.20 - 19:28
(28) в двух словах, если можно...
   Ёпрст
 
33 - 14.08.20 - 19:33
Перем Вася;

Функция ПриВыбореЗначения(Об="")
    Если
        Об  = "" Тогда
        Об = Форма.АктивныйЭлемент();
    КонецЕсли;

    Если Об="кнЙ" Тогда                // ввод бувы "Й"


        Поле=СокрЛП(Поле)+"Й";
        ПошукПоБукв();



        Вася=Об;
        Форма.Закрыть(0);
    КонецЕсли;
   ......

Процедура ПриЗакрытии()
   Если ПустоеЗначение(Вася)=0 Тогда
      Вася="";
      активизировать("Поле");
      ПроцедураКурсорЕнд ()
      СтатусВозврата(0);
   КонецЕсли;
КонецПроцедуры
ПроцедураКурсорЕнд ()
    Енд = СоздатьОбъект("Wscript.Shell");
    енд.SendKeys("{END}");  
КонецПроцедуры

   jah1111
 
34 - 14.08.20 - 19:46
(33) Работает!!!! но слетели все примочки фрмекс из формы, шрифты.... это наверно потому что у меня при закрытии глСервис.УдалитьШрифт
   Злопчинский
 
35 - 14.08.20 - 19:50
(34) При закрытии - да, шрифт удалить
Если у тебя ложное закрытие - то зачем ты удаляешь шрифт?
   Злопчинский
 
36 - 14.08.20 - 19:51
капец сколько ТС нагородил...
   Ёпрст
 
37 - 14.08.20 - 20:10
(34) Возврат поставь в код
   Ёпрст
 
38 - 14.08.20 - 20:11
Если ПустоеЗначение(Вася)=0 Тогда
      Вася="";
      активизировать("Поле");
      ПроцедураКурсорЕнд ()
      СтатусВозврата(0);
      Возврат;
   КонецЕсли;
   jah1111
 
39 - 14.08.20 - 20:30
(38) спасибо большое человеческое!
и теперь абсолютно дилетантский вопрос...
Ежели Поле=СокрЛП(Поле)+"Й"; дает нам "Й"

то как правильно написать "пробел"?
   Ёпрст
 
40 - 14.08.20 - 20:53
(39) Поле = Поле+" ";
   MWWRuza
 
41 - 14.08.20 - 20:59
Ээээ... Или я вопрос не понял? А так:

Поле=СокрЛП(Поле)+" ";

чем не устраивает?

PS Ну, в принципе - понятно чем... При вводе следующего символа таким-же методом, СокрЛП уберет пробел...
Ну, тогда запоминайте пробел(точнее его наличие и количество в конце строки), в отдельной переменной, и при вводе следующего символа добавляйте перед ним пробелы в количестве, равном этой переменной. После ввода очередного символа, отличного от пробела, переменную обнуляйте... Немного через жо... Но, что делать.
   acht
 
42 - 14.08.20 - 21:05
(39) Начать вспоминать, зачем ты написал СокрЛП, не вспомнить и стереть его нахрен.
   jah1111
 
43 - 14.08.20 - 21:10
(42) сначала надо чтоб он ввелся, експерементально доказано что он нифига не появляется в строке
   jah1111
 
44 - 14.08.20 - 21:11
(40) записано правильно, пробел в поле ввода не появляется...
   Ёпрст
 
45 - 14.08.20 - 21:38
(44) храни строку в переменной, потом выводи в своё поле на форме
   Ёпрст
 
46 - 14.08.20 - 21:38
Тогда не надо быдет сокрЛП пихать в код
   Злопчинский
 
47 - 14.08.20 - 21:45
я так и не понял нахрена эти все извращения...
1. обычное поле ввода.
2. топчут клавой железной или виртуальной
3. ПриНажатииКлавиши (или ПриОтжатии...) - скулайтом получаем нужное множество
4. нужное множество из п.3 показываем на форме В ТЗ. (ТЗ - недоступная, на форме всего один активный элемент - ПОЛЕ ВВОДА, листание ТЗ - перехватом кнопок курсора, хоуменд пейджап/даун)
5. пользюк быстрее из ТЗ выберет если надо или продолжит по пп.2-5
   jah1111
 
48 - 14.08.20 - 22:05
   Злопчинский
 
49 - 14.08.20 - 22:14
(48) угу, примерно так.
правдв непонятно почему при наборе "гра" в таблице видно "апельсин"
   jah1111
 
50 - 14.08.20 - 22:20
(49) видно апельсин, но фокус на "Гранат"
   Злопчинский
 
51 - 14.08.20 - 22:21
(50) а зачем апельчин если пользюк ищет чтото с "гра"..?
   Злопчинский
 
52 - 14.08.20 - 22:22
(50) на таких фейсах принцип простой - не показывать и не давать пользюку лишнего. они И БЕЗ ЭТОГО КОСЯЧАТ будь здоров. а если им еще и помогать в этом...
   jah1111
 
53 - 14.08.20 - 22:25
(51) ищет и находит.  я не делал выборку, подбор идет в стандартной таблице справочника, точно так как обычной клавой жмякать по елементам
   jah1111
 
54 - 14.08.20 - 22:28
(52) в общем вы правы, а я - ленив...  и второй месяц как одинЭсю :) надо писать процедуру выборки из справочника всего что с "гра"
   Ёпрст
 
55 - 15.08.20 - 00:00
(48)

Повыкидывай везде СокрЛП, тип реквизита на форме - строка неогр длины, на кнопку пробела повесь Симв(160) потом в коде подменяй на Симв(32) через СтрЗаменить при поиске и усё. Курсорчик будет ка надо
   Ёпрст
 
56 - 15.08.20 - 00:04
Ну и проще надо код писать..
В формулах кнопок пишешь типа

КнопкаНажатие("а")

....

КнопкаНажатие(Симв(160))//это для пробела


...
Процедура КнопкаНажатие(Кнопка) 
   Если Кнопка = "BcSpase" Тогда
     ...
   Иначе
      ПолеПоиска= ПолеПоиска+Кнопка;
   КонецЕсли;
  //далее ложное закрытие и че там те надо  

   Ёпрст
 
57 - 15.08.20 - 00:04
ну и там, можешь хоть CapsLock через переменную, и т.д..
   Ёпрст
 
58 - 15.08.20 - 00:05
Но..если надо красиво, чтоб еще и положение курсора отслеживалось, то тут только активикс на форме, штатный контрол этого не умеет
   Ёпрст
 
59 - 15.08.20 - 00:05
какой нить текстбокс или ричтекст на форме
   Злопчинский
 
60 - 15.08.20 - 00:11
(59) ага, к таврии прилепить сидушки от мерса и мигалку от полиции.
 
 Рекламное место пустует
   jah1111
 
61 - 16.08.20 - 15:14
Хлопцы, я так понимаю в 7.7 размеры формы програмно не меняются?
   Salimbek
 
62 - 16.08.20 - 19:58
(61) Меняются через FormEX.
   jah1111
 
63 - 26.09.20 - 08:51
почему  такой код работает

ИначеЕсли Об="кнЙ" Тогда                // Й

        Поле=СокрЛП(Поле)+"Й";



а такой нет:
ИначеЕсли Об="кнЙ" Тогда                // Й

        Поле=Поле+"Й";

напомню: Поле - поле поиска, пишется простенькая виртуальная клава для поиска в справочниках. СокрЛП стирает пробелы между словами, а иногда в запросе нужен пробел
   jah1111
 
64 - 26.09.20 - 09:27
(56) Процедура Пробел()
    
    Поле = Поле+Симв(160);
    КонецПроцедуры


не знаю. не взлетает. как этот пробел реализовать?
   trdm
 
65 - 26.09.20 - 12:09
А FormEx не умет SendMessage или PostMessage?
   jah1111
 
66 - 26.09.20 - 16:05
(65) впервые слышу и документации не нашел.

просто нужен пробел в рамках такого кода. или кода предложеного Йпрст
   jah1111
 
67 - 26.09.20 - 16:08
А вообще, кто может подсказать простенький алгоритм написания (или код) цифровой виртуальной клавы? как у калькулятора. Нужна такая клава для удобного ввода  в поля типа "число", особенно если точность числа>0.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.