Есть одно фундаментальное препятствие для использования перехвата клавиатуры и мыши в полях многострочной части - невозможно определить, находится ли многострочная часть в режиме редактирования, или нет.
Аналога Форма.АктивныйЭлемент() в формексе нету, а он жизненно необходим, причем чтобы работал этот метод для МногострочнойЧасти так: в случае, если она находится в режиме редактирования, возвращал атрибут ТекущаяКолонка, а если нет - собственно МногострочнаяЧасть.
Я таки немного разверну тему.
Как обычно, портянка с историческим экскурсом.
Делал я в начале века БыстрыйПоискВПолеВвода. Позже это стали называть - "как в восьмерке".
Даже могу утверждать, что был первым, кто реализовал такую игрушку, по крайней мере на проклабе.
Аж на трёх компонентах, потому как тогда формекс еще не умел эмулировать нажатия и еще чего-то не хватало, уже не помню. Потом не раз переделывал, остался только формекс, сейчас это уже супер-пупер МгновенныйПоискВПолеВводаПоСловарю (только формекс и свои таблицы).
Но за всё это время я так и не смог прикрутить это поиск, как и другие игрушки, к полям многострочной части документа. И вот почему - когда юзер нажимает клавишу в таком поле, или делает правый клик, если оно не редактируется в этот момент, должны запускаться штатные механизмы, как то поиск в многострочной части, или контекстное меню этого контрола. Соответсвенно, программный поиск должен стартовать только в случае, если поле в режиме редактирования.
АЛьф, такая хотелка в принципе реализуема?
Может, есть другие подходы к это проблеме?
Это продолжение вопроса, который ты мне задавал по электронке в прошлом году?
По идее 1С при редактировании создает обычный реквизит формы. И оно должен видится, как тот же реквизит на форме, когда многострочная часть в режиме редактирования. Видать где-то в перехвате клавиатуры и мыши стоит заглушка, чтобы для реквизитов многострочной части всегда сама МЧ возвращалась.
Надо бы глянуть...
Чета тупанул. У меня же реквизит в перехвате не определяется совсем.
Цитата: АЛьФ от 07 апреля 2024, 10:23Это продолжение вопроса, который ты мне задавал по электронке в прошлом году?
Так точно, это тот самый вопрос.
Прошу заметить, я за всю жизнь тогда первый и последний раз набрался наглости написать Вам хотелку.
Зря Вы запустили форум, теперь покоя еще долго не будет.
Разве что запустите блоги. )
Цитата: item от 07 апреля 2024, 10:56Зря Вы запустили форум, теперь покоя еще долго не будет.
Наоборот. Я теперь хотя бы четко вижу, что для кого-то делаю нужные вещи, а не в пустоту что-то ковыряю.
Цитата: item от 07 апреля 2024, 09:21Я таки немного разверну тему.
Как обычно, портянка с историческим экскурсом.
Делал я в начале века БыстрыйПоискВПолеВвода. Позже это стали называть - "как в восьмерке".
Даже могу утверждать, что был первым, кто реализовал такую игрушку, по крайней мере на проклабе.
Аж на трёх компонентах, потому как тогда формекс еще не умел эмулировать нажатия и еще чего-то не хватало, уже не помню. Потом не раз переделывал, остался только формекс, сейчас это уже супер-пупер МгновенныйПоискВПолеВводаПоСловарю (только формекс и свои таблицы).
Но за всё это время я так и не смог прикрутить это поиск, как и другие игрушки, к полям многострочной части документа. И вот почему - когда юзер нажимает клавишу в таком поле, или делает правый клик, если оно не редактируется в этот момент, должны запускаться штатные механизмы, как то поиск в многострочной части, или контекстное меню этого контрола. Соответсвенно, программный поиск должен стартовать только в случае, если поле в режиме редактирования.
АЛьф, такая хотелка в принципе реализуема?
Может, есть другие подходы к это проблеме?
Если интересно, то делаю так и в многострочной части. Если надо, чтобы работало в типизированном поле, то его делаю неопределенного типа и переключаю тип
Из интересного здесь "GetFocus" и "SetFocus" - работа с Handle окна (контрола) редактирования, "177" - перейти в конец строки, "ПолучитьТекст" - получение текста контрола редактирования, важно, чтобы "ПриНажатииКнопкиКлавиатуры" было в глобальном модуле, иначе не ловит нажатия в открывшемся списке выбора :
Процедура ПриНажатииКнопкиКлавиатуры(Конт,КодКлавиши,Alt,Shift,Ctrl,Символ,ФСО)
Если ФОС<>0 Тогда
Если СписокПоиска<>0 Тогда
Если ТипЗначенияСтр(СписокПоиска)="СписокЗначений" Тогда
Если (((КодКлавиши>=48) и (КодКлавиши<=57))
или ((КодКлавиши>=64) и (КодКлавиши<=90))
или ((КодКлавиши>=96) и (КодКлавиши<=122))
или ((КодКлавиши>=165) и (КодКлавиши<=255))
или (КодКлавиши=46) или (КодКлавиши=8) или (КодКлавиши=32)
или (КодКлавиши=37) или (КодКлавиши=39))
и (Alt=0) и (Ctrl=0)
Тогда
Если Wrap.GetFocus()<>ФОС Тогда
ФСО=0;
Сервис.ЭмулироватьКлавиатуру("{ESC}",0,2);
Wrap.SetFocus(ФОС);
Если КодКлавиши=8 Тогда
Стр=ДляТекста.ПолучитьТекст(ФОС);
Стр=Лев(Стр,СтрДлина(Стр)-1);
Иначе
Стр=ДляТекста.ПолучитьТекст(ФОС)+?((КодКлавиши=46) или (КодКлавиши=8),"",Символ);
КонецЕсли;
Wrap.SetWindowTextA(ФОС,Стр);
Wrap.SendMessage(ФОС,177,СтрДлина(Стр),СтрДлина(Стр));
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПриОтжатииКнопкиКлавиатуры(КодКлавиши,Alt,Shift,Ctrl,Символ,ФСО)
Если Форма.АктивныйЭлемент()="ТМЦСтрока" Тогда
Если (((КодКлавиши>=48) и (КодКлавиши<=57))
или ((КодКлавиши>=64) и (КодКлавиши<=90))
или ((КодКлавиши>=96) и (КодКлавиши<=122))
или ((КодКлавиши>=165) и (КодКлавиши<=255))
или (КодКлавиши=46) или (КодКлавиши=8) или (КодКлавиши=32) или (КодКлавиши=40))
и (Alt=0) и (Ctrl=0)
Тогда
Если КодКлавиши=40 Тогда
ФСО=0;
КонецЕсли;
КонтрольПоиска=ДляТекста.ПолучитьТекст(Wrap.GetFocus());
Если СокрЛП(КонтрольПоиска)<>"" Тогда
Форма.ОбработкаОжидания("Перерисовка",1);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура Перерисовка()
Форма.ОбработкаОжидания("",1);
СтрокаП=ДляТекста.ПолучитьТекст(Wrap.GetFocus());
Если СтрДлина(СтрокаП)>3 Тогда
Если (КонтрольПоиска=СтрокаП) и (СокрЛП(СтрокаП)<>"") Тогда
СчЭ=0;
СписокТМЦ=СоздатьОбъект("СписокЗначений");
//Какой то подбор и заполнение списка
ФОС=Wrap.GetFocus();
Зн=0;
СписокПоиска=СписокТМЦ;
Если СписокТМЦ.ВыбратьЗначение(Зн,,,,2)=1 Тогда
Ф=0;
ФОС=0;
Если ТипЗначенияСтр(Зн)="Справочник" Тогда
Если ПустоеЗначение(ТМЦ)=0 Тогда
Ф=1;
КонецЕсли;
ТМЦ=Зн;
КонецЕсли;
ТМЦСтрока="";
Форма.Обновить();
Если ТипЗначенияСтр(Зн)="Справочник" Тогда
Сервис.ЭмулироватьКлавиатуру("{ENTER}",0,2);
КонецЕсли;
Если Ф=1 Тогда
Сервис.ВнешнееСобытие("ТМЦСтрока","Активизировать","ТМЦ");
КонецЕсли;
КонецЕсли;
СписокПоиска=0;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Цитата: sau от 07 апреля 2024, 11:59Если интересно, то делаю так и в многострочной части.
Интересно, буду разбираться.
Без обид, не "цитируйте" целиком посты, в смартфоне палец болит крутить.
Цитата: sau от 07 апреля 2024, 11:59Из интересного здесь "GetFocus" и "SetFocus"...
Что за фрукт этот Wrap?
Где курить мануалы?
Цитата: item от 07 апреля 2024, 13:01Цитата: sau от 07 апреля 2024, 11:59Из интересного здесь "GetFocus" и "SetFocus"...
Что за фрукт этот Wrap?
Где курить мануалы?
dynwrapx - вызов WinApi (dll)
Wrap=СоздатьОбъект("DynamicWrapperX");
Wrap.Register("user32.dll","GetFocus","i=","r=h");
Wrap.Register("user32.dll","SetFocus","i=h","r=h");
Wrap.Register("user32.dll","SetWindowTextA","i=hs","r=b");
Wrap.Register("user32.dll","EnableWindow","i=hb","r=b");
Wrap.Register("user32.dll","IsWindowEnabled","i=h","r=b");
Wrap.Register("user32.dll","SendMessage","i=huhh","r=p");
Цитата: sau от 07 апреля 2024, 13:16dynwrapx - вызов WinApi (dll)
Это оно? (https://infostart.ru/1c/tools/267819/?ysclid=luqjpjx67e929438656)
Круто, что могу сказать.
До такого уровня я еще не дорос, и врядли получится.
А за науку спасибо, законспектировал.
Это оно? (https://infostart.ru/1c/tools/267819/?ysclid=luqjpjx67e929438656)
Распространяется с согласия автора абсолютно бесплатно.
Лицензия: freeware.
А может кто-нибудь вытащить это с инфосрарта? Нету стартманей у мну.
https://wdfiles.ru/3uxdf
https://wdfiles.ru/3uxdg
https://dynwrapx.script-coding.com/dwx/pages/dynwrapx.php
Цитата: Злоп от 10 апреля 2024, 19:03...
Дяденька, мне бы под фряху под 32 бита... ага, спасибо всем, оказалось всё это не просто у меня есть, а ещё и применяется. Точнее применялось. Почему то я подумал, что это что-то другое.
Цитата: Пиит от 01 апреля 2024, 20:37Есть одно фундаментальное препятствие для использования перехвата клавиатуры и мыши в полях многострочной части - невозможно определить, находится ли многострочная часть в режиме редактирования, или нет.
Сделал, проверяя Дескриптор (HWND, Handle), т.е. если в режиме редактирования, то Дескриптор атрибута равен декскриптору активного окна (можно получить, например, через GetFocus)
Wrap=СоздатьОбъект("DynamicWrapperX");
Wrap.Register("user32.dll","GetFocus","i=","r=h");
Кстати, если не в режиме редактирование, то через Атрибут Дескриптор возвращается нулевой, тоже можно использовать.