Хотелка: РасширениеФормы.АктивныйАтрибут()

Автор Пиит, 01 апреля 2024, 20:37

« назад - далее »

Пиит

Есть одно фундаментальное препятствие для использования перехвата клавиатуры и мыши в полях многострочной части - невозможно определить, находится ли многострочная часть в режиме редактирования, или нет.
Аналога Форма.АктивныйЭлемент() в формексе нету, а он жизненно необходим, причем чтобы работал этот метод для МногострочнойЧасти так: в случае, если она находится в режиме редактирования, возвращал атрибут ТекущаяКолонка, а если нет - собственно МногострочнаяЧасть.

Пиит

Я таки немного разверну тему.
Как обычно, портянка с историческим экскурсом.
Делал я в начале века БыстрыйПоискВПолеВвода. Позже это стали называть - "как в восьмерке".
Даже могу утверждать, что был первым, кто реализовал такую игрушку, по крайней мере на проклабе.
Аж на трёх компонентах, потому как тогда формекс еще не умел эмулировать нажатия и еще чего-то не хватало, уже не помню. Потом не раз переделывал, остался только формекс, сейчас это уже супер-пупер МгновенныйПоискВПолеВводаПоСловарю (только формекс и свои таблицы).
Но за всё это время я так и не смог прикрутить это поиск, как и другие игрушки, к полям многострочной части документа. И вот почему - когда юзер нажимает клавишу в таком поле, или делает правый клик, если оно не редактируется в этот момент, должны запускаться штатные механизмы, как то поиск в многострочной части, или контекстное меню этого контрола. Соответсвенно, программный поиск должен стартовать только в случае, если поле в режиме редактирования.
АЛьф, такая хотелка в принципе реализуема?
Может, есть другие подходы к это проблеме?

АЛьФ

Это продолжение вопроса, который ты мне задавал по электронке в прошлом году?
По идее 1С при редактировании создает обычный реквизит формы. И оно должен видится, как тот же реквизит на форме, когда многострочная часть в режиме редактирования. Видать где-то в перехвате клавиатуры и мыши стоит заглушка, чтобы для реквизитов многострочной части всегда сама МЧ возвращалась.
Надо бы глянуть...   

АЛьФ

Чета тупанул. У меня же реквизит в перехвате не определяется совсем.

Пиит

Цитата: АЛьФ от 07 апреля 2024, 10:23Это продолжение вопроса, который ты мне задавал по электронке в прошлом году?

Так точно, это тот самый вопрос.
Прошу заметить, я за всю жизнь тогда первый и последний раз набрался наглости написать Вам хотелку.
Зря Вы запустили форум, теперь покоя еще долго не будет.
Разве что запустите блоги. )

АЛьФ

Цитата: item от 07 апреля 2024, 10:56Зря Вы запустили форум, теперь покоя еще долго не будет.
Наоборот. Я теперь хотя бы четко вижу, что для кого-то делаю нужные вещи, а не в пустоту что-то ковыряю.

sau

#6
Цитата: 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?
Где курить мануалы?

sau

Цитата: 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)

Это оно?

Круто, что могу сказать.
До такого уровня я еще не дорос, и врядли получится.
А за науку спасибо, законспектировал.

Arbuz

Цитата

Это оно?

Цитата
Распространяется с согласия автора абсолютно бесплатно.

Лицензия: freeware.

А может кто-нибудь вытащить это с инфосрарта? Нету стартманей у мну.

Злоп



Arbuz

Цитата: Злоп от 10 апреля 2024, 19:03...

Дяденька, мне бы под фряху под 32 бита... ага, спасибо всем, оказалось всё это не просто у меня есть, а ещё и применяется. Точнее применялось. Почему то я подумал, что это что-то другое.