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

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

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

        Если Об="кнЙ" Тогда                // ввод бувы "Й" при нажатии на кнопку "кнЙ" к примеру
        Поле=СокрЛП(Поле)+"Й";
        ПошукПоБукв();                    // процедура в модуле которая выполняет поиск в справочнике после ввода каждого символа
        активизировать("Поле");           // после справочника возвращаемся назад в поле ввода с буквой Й
        енд.SendKeys("{END}");            // эмулируем нажатие END для переноса курсора в конец строки
        КонецЕсли;
18 Salimbek
 
14.08.20
13:58
(8) в 7-ке при активизации поля курсор в начало строки лезет и весь текст обычно выделяется
(0) Скорее всего дело в том, что в этой процедуре ты активизируешь поле, но фактически оно активизируется только _после_ выхода из этой процедуры. Т.е. ты дал команду 1С-ке - "Активизировать", и сразу же отправил ей sendkeys, но 1С-ка сначала выполнила этот самый СендКейс, потом вышла из этой процедурки и только потом активизировала поле. После чего курсор убежал в начало.
Если я прав, то тут проще всего сделать так: делаешь "Активизировать" и сразу же подключаешь ОбработкаОжидания на минимум, и потом, в этой уже ОбработкеОжидания, отправляешь СендКейс и отключаешь эту самую Обработку ожидания.
19 uno-group
 
14.08.20
14:21
чет как то все сложно. У меня цифровая клавиатура както так выглядит куча кнопок на них типа Цифра(1)
//-----------------------------------------------------------------------
Процедура Цифра(Режим);
    Если (Режим="+")или(Режим="-") Тогда
        Вычислить();
    КонецЕсли;
    Если Режим="С" Тогда
        ЧислоСтр="";
        Форма.Число.Заголовок(ЧислоСтр);
        Возврат;    
    КонецЕсли;
    Если СокрЛП(ЧислоСтр)="0" Тогда
        ЧислоСтр="";
    КонецЕсли;
    ЧислоСтр=ЧислоСтр+Режим;
    Форма.Число.Заголовок(ЧислоСтр);
КонецПроцедуры
//-----------------------------------------------------------------------
Процедура Дел();
    ЧислоСтр=Лев(ЧислоСтр,СтрДлина(ЧислоСтр)-1);
    Форма.Число.Заголовок(ЧислоСтр);
КонецПроцедуры
//-----------------------------------------------------------------------
Процедура Ввод();
    Вычислить();
    Форма.Параметр=ЧислоСтр;
    Форма.Закрыть();
КонецПроцедуры
20 uno-group
 
14.08.20
14:24
А для отлова обычной клавы.
//------------------------------------------------
Процедура ПриНажатииКнопкиКлавиатуры(конт, код, _а, _ш, _к)
    Если Конт=125 Тогда
        //зеленая клавиша откроем документ
//        Сформировать();
        ВыбТребование();
    ИначеЕсли Конт=126 Тогда
        // Красная клавиша обновим список требований
        Форма.Закрыть();
    КонецЕсли;
КонецПроцедуры
//*******************************************
ЗагрузитьВнешнююКомпоненту("FormEx.dll");
Раскраска=СоздатьОбъект("Сервис");
Раскраска.ВключитьРаскраскуТаблиц();
Эдди=СоздатьОбъект("ADDY.ADD");
21 jah1111
 
14.08.20
14:53
(18)ну если вы правы то просто надо SendKeys прописать в отдельной процедуре.
типо:

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

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

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

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

Перем Вася;

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

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

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



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

Процедура ПриЗакрытии()
   Если ПустоеЗначение(Вася)=0 Тогда
      Вася="";
      активизировать("Поле");
      ПроцедураКурсорЕнд ()
      СтатусВозврата(0);
   КонецЕсли;
КонецПроцедуры
ПроцедураКурсорЕнд ()
    Енд = СоздатьОбъект("Wscript.Shell");
    енд.SendKeys("{END}");  
КонецПроцедуры
34 jah1111
 
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);
      Возврат;
   КонецЕсли;
39 jah1111
 
14.08.20
20:30
(38) спасибо большое человеческое!
и теперь абсолютно дилетантский вопрос...
Ежели Поле=СокрЛП(Поле)+"Й"; дает нам "Й"

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

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

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

PS Ну, в принципе - понятно чем... При вводе следующего символа таким-же методом, СокрЛП уберет пробел...
Ну, тогда запоминайте пробел(точнее его наличие и количество в конце строки), в отдельной переменной, и при вводе следующего символа добавляйте перед ним пробелы в количестве, равном этой переменной. После ввода очередного символа, отличного от пробела, переменную обнуляйте... Немного через жо... Но, что делать.
42 acht
 
14.08.20
21:05
(39) Начать вспоминать, зачем ты написал СокрЛП, не вспомнить и стереть его нахрен.
43 jah1111
 
14.08.20
21:10
(42) сначала надо чтоб он ввелся, експерементально доказано что он нифига не появляется в строке
44 jah1111
 
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
48 jah1111
 
14.08.20
22:05
49 Злопчинский
 
14.08.20
22:14
(48) угу, примерно так.
правдв непонятно почему при наборе "гра" в таблице видно "апельсин"
50 jah1111
 
14.08.20
22:20
(49) видно апельсин, но фокус на "Гранат"
51 Злопчинский
 
14.08.20
22:21
(50) а зачем апельчин если пользюк ищет чтото с "гра"..?
52 Злопчинский
 
14.08.20
22:22
(50) на таких фейсах принцип простой - не показывать и не давать пользюку лишнего. они И БЕЗ ЭТОГО КОСЯЧАТ будь здоров. а если им еще и помогать в этом...
53 jah1111
 
14.08.20
22:25
(51) ищет и находит.  я не делал выборку, подбор идет в стандартной таблице справочника, точно так как обычной клавой жмякать по елементам
54 jah1111
 
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) ага, к таврии прилепить сидушки от мерса и мигалку от полиции.
61 jah1111
 
16.08.20
15:14
Хлопцы, я так понимаю в 7.7 размеры формы програмно не меняются?
62 Salimbek
 
16.08.20
19:58
(61) Меняются через FormEX.
63 jah1111
 
26.09.20
08:51
почему  такой код работает

ИначеЕсли Об="кнЙ" Тогда                // Й
        Поле=СокрЛП(Поле)+"Й";



а такой нет:

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

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


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

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

https://ibb.co/k2gVxJ6
69 Злопчинский
 
27.09.20
22:40
70 Злопчинский
 
27.09.20
22:42
(67) в поле для ввода числа с педалькой нажим Ф4
71 Злопчинский
 
27.09.20
23:00
(68) это что?
поле на форме примет значение после отработки кода.
если ты к полю длиной 30 символов прибавишь еще символ - поле останется всего 30 символов, 31 пойдет в пешее эротическое.
вроде уже писали выше сто раз всё...
?
72 Злопчинский
 
27.09.20
23:01
(70) если хоочешь чтобы встроенный калбкулятор было большой - формексом на поле ввода с педалькой назначь большой шрифт
73 alyuev
 
28.09.20
12:20
(66) Версия FormEx 147. Объект "Окна".

ОтправитьКоманду(<?>)
Синтаксис:
ОтправитьКоманду(<wParam>,<lParam>)
Назначение:
Метод отсылает главному окну сообщение WM_COMMAND с заданными параметрами через функцию SendMessage().
Параметры:
<wParam>, <lParam> - Параметры отправляемого окну сообщения.

ПослатьКоманду(<?>)
Синтаксис:
ПослатьКоманду(<wParam>,<lParam>)
Назначение:
Метод отсылает главному окну сообщение WM_COMMAND с заданными параметрами через функцию PostMessage().
Параметры:
<wParam>, <lParam> - Параметры отправляемого окну сообщения.
74 jah1111
 
28.09.20
12:54
(69) ага, типа так. Хочу свою обработку с цифровой вирт клавой. но чтобы умела в поле ввода типа "число" цифры после запятой и бекспейс"
Вариант "по педальке" не очень нравится, потому что там надо нажать сначала "ок", тогда значение попадает в поле ввода, а потом еще раз ок, чтоб сохранить и закрыть обработку.
хочу чтобы такая обработка работала в определенном порядке, типа:
заголовок "введите брутто" - вводим "450" - ок // брутто присваивается  знач 450 и сразу:
заголовок "введите кол. ящ." - вводим 43 - ок // кол. ящиков = 43 и т.д.
когда последний параметр заполнен, последние ок закрывает форму обработки.
75 jah1111
 
28.09.20
12:57
(71) может тысячу раз я тупой но как надо написать то? меня и так все этой самописной клаве устраивает, но иногда очень нужен пробел, а я не знаю как его реализовать в рамках моего алгоритма клавы.
76 Злопчинский
 
28.09.20
13:43
пробел и пробел, чего его реализовывать?
РеквизитПолеВводаСтрокаНаФорме = СокрЛП(РеквизитПолеВводаСтрокаНаФорме)+ЧтоТо;
ЧтоТо - символ(ы), которые добавляешь в поле.
Если надо именно пробел добавить то добавляешь Симв(160), потом для обработки подменяешь на пробел.
или добавляешь спробел с постфиксными символами если сразу понятно
77 trdm
 
28.09.20
14:02
(73) Ну так то главному окну. А можно было и активному послать.
78 trdm
 
28.09.20
14:02
вернее нужно.
79 jah1111
 
28.09.20
14:09
(76) спасибо
ребят, кому не жалко поделится цифровой клавой, напишите.
моя, с простым добавление символом в строку не очень подходит.
я так мыслю, нужен какойто математический алгоритм ввода в числовое поле
80 jah1111
 
28.09.20
18:37
покумекав, соорудил такое:

Функция ПриВыбореЗначения(Об="")
     Если
        Об  = "" Тогда
        Об = Форма.АктивныйЭлемент();
     КонецЕсли;
           //Клавиатура
Если (СтрДлина(Об)=3)и(Найти("0123456789",Сред(Об,3,1))>0) Тогда // (0..9)
        КолЦифр = СтрДлина(Формат(Число(Поле), "ЧГ="));
            Если Поле < 0
             Тогда КолЦифр = КолЦифр -1;
        КонецЕсли;  
        Если Поле = 0 тогда
        Поле=Поле+Сред(Об,3,1);
        ИначеЕсли Поле > 0 тогда
        Поле = Поле*10+ Сред(Об,3,1);
        Активизировать("Поле");
        КонецЕсли;
ИначеЕсли Об="кнЗабой" Тогда            // BackSpace
    Поле = Число(Лев(Поле, СтрДлина(Поле)-1));                                                
КонецЕсли;    
      
КонецФункции


поделитесь мыслями, как замутить ввод после запятой (дробное число) и ввод отрицательных чисел.
81 Злопчинский
 
28.09.20
22:17
ввод отрицательных - клавиша смены знака.
ввод после запятой - определяешь что введена запятая, вводишь число символов после запятой - проблема в чем?