Полноценные шорткаты

Опубликовал Павел Егоров (SatanClaws) в раздел Программирование - Теория программирования

Никогда не возникало желания в 1С8 повесить какое-либо действие на шорткат Shift+Enter, или Ctrl+PgDn?

А так же еще немного из личного опыта с осьмеркой...

1. Итак, шорткаты.

В общем-то, ничего сложного там нет - ЗначениеВСтрокуВнутр() и вдумчивое покурить результат минут 10.

Лучше я сразу напишу, как его создать - произвольный шорткат

Модификатор = 0;
Если Альт Тогда Модификатор = Модификатор + 16; КонецЕсли;
Если Ктрл Тогда Модификатор = Модификатор + 8; КонецЕсли;
Если Шифт Тогда Модификатор = Модификатор + 4; КонецЕсли;

стрВнутр = "{""#"",69cf4251-8759-11d5-bf7e-0050bae2bc79,1," + Символы.ПС + "{0," + КодКлавиши + "," + Модификатор + "}" + Символы.ПС + "}";

//Символы.ПС, кстати говоря, кажется и не нужны даже - вроде и без них должно работать.


Шорткат = ЗначениеИзСтрокиВнутр(стрВнутр);


Дальше остается только пояснить про КодыКлавиш - и полученный результат можно скармливать Кнопка.СочетаниеКлавиш

Но там тоже ничего сложного - Enter=13,  Esc=27 и так далее.

Кстати, можно повесит шорткат даже, например, на Alt+Shift - только нужно и в модификаторы прописать 20 и в КодКлавиши прописать, 18(это Alt) или 16(это Shift).

Единственное - стоит помнить, что сначала шорткаты перехватывает Винда. Так что на Альт-Ф4 ничего повесить не получится.

 

2. Если у вас есть форма, размер которой рассчитывается каждый раз после ее открытия, то наверняка замечали, что 1Ска запоминает размер формы от прошлого открытия и в качестве базового берет именно его. Что просто жутко мешается.

Первое, что приходит в голову - в ПередОткрытием() написать что-то вроде ЭтаФорма.ИмяСохраняемогоОкна = Новый УникальныйИдентификатор;

Однако, есть способ проще - достаточно до показа формы обратиться на запись к ее реквизиту Высота или Ширина.

Т.е. пишем в ПередОткрытием()/ПриОткрытии() Форма.Высота = Форма.Высота - и все работает как надо.

PS но отсутствие штатного события ПослеОткрытия() несколько... удручает :-/

 

Upd по пункту 1:

BackSpase 8
Tab 9
Enter 13
Shift 16
Ctrl 17
Alt 18
CapsLock 20
Esc 27
Space 32
PgUp 33
PgDn 34
End 35
Home 36
Left 37
Up 38
Right 39
Down 40
Ins 45
Del 46
LWinKey 91
RWinKey 92
AppKey 93
Num0 96
Num1 97
Num2 98
Num3 99
Num4 100
Num5 101
Num6 102
Num7 103
Num8 104
Num9 105
NumMultiply 106
NumAdd 107
NumSubtract 109
NumDecimal 110
NumDivide 111
F1 112
F2 113
F3 114
F4 115
F5 116
F6 117
F7 118
F8 119
F9 120
F10 121
F11 122
F12 123
ScrlLock 145
NumLock 144
Semi 186
Add 187
Comma 188
Minus 189
Dot 190
Slash 191
Tilde 192
LSqrBrckt 219
Backslash 220
RSqrBrckt 221
Apostrophe 222

См. также

Комментарии
1. Сергей Троицкий (tsd) 147 08.09.09 18:04 Сейчас в теме
А зачем оно, штатное событий ПослеОткрытия()? чего хорошего может дать?
2. Павел Егоров (SatanClaws) 106 08.09.09 19:13 Сейчас в теме
(1) Например, создание элементов формы до ее открытия ведет себя достаточно глючно в случаях, когда необходимо исходную форму увеличить по высоте/ширине.

Конечно, как вариант: сделать исходную форму максимальных размеров и потом только уменьшать ее - но это не выход, на мой взгляд.
3. Serj (Serj1C) 460 09.09.09 06:51 Сейчас в теме
4. Артур Аюханов (artbear) 850 09.09.09 08:27 Сейчас в теме
(0) В описании/названии отдельно выдели, что для 8 или 8.1
Сразу и не поймешь, для какой платформы
5. Евгений Люлюк (Evg-Lylyk) 1993 09.09.09 12:37 Сейчас в теме
А где коды посмотреть для стрелок (left, right и т.д.) например?
6. Альтаир (Altair777) 633 09.09.09 12:57 Сейчас в теме
(5) В Гугле :-) Строка поиска
коды клавиш клавиатуры

Первая ссылка
7. Павел Егоров (SatanClaws) 106 09.09.09 13:42 Сейчас в теме
8. Олег Молочников (milkers) 1576 10.09.09 13:45 Сейчас в теме
Каким образом ты фиксируешь нажатие ALT? Привел бы ты кусочек кода.
9. Павел Егоров (SatanClaws) 106 10.09.09 18:15 Сейчас в теме
(8) "Кстати, можно повесит шорткат даже, например, на Alt+Shift - только нужно и в модификаторы прописать 20 и в КодКлавиши прописать, 18(это Alt) или 16(это Shift)."

на пальцах - Альт должен участвовать и как модификатор и как код клавиши.
Причем, в цитируемом примере 2 шортката (по коду клавиши Альта и по коду клавиши Контрола) будут вести себя немного по разному - в одном случае для его срабатывания будет необходимо нажать сначала Альт, затем Ктрл; во втором - в обратной последовательности.
10. Prom_ (PRoman) 13.09.09 14:40 Сейчас в теме
как-то сумбурно. Ничё не понял.
11. Константин (aquakosh) 16.09.09 10:28 Сейчас в теме
> но отсутствие штатного события ПослеОткрытия() несколько... удручает :-/
Уже проходили. См. ОбновлениеОтображения().
12. Павел Егоров (SatanClaws) 106 16.09.09 11:05 Сейчас в теме
(11) только ОбновлениеОтображения() отрабатывает весьма и весьма часто.
Т.е. делаем флаг "ПервоеОткрытие", который будет изменен при первом обновлении отображения и т.д. - но принципиально метод не лучше, чем
ПодключитьОбработчикОжидания("ПослеОткрытия", 0.1, Истина);
13. Serj (Serj1C) 460 10.09.11 17:49 Сейчас в теме
хочу добавить:

Функция БыстрыйВызов(Код, Alt=0, Control=0, Shift=0) Экспорт 
   Возврат ЗначениеИзСтрокиВнутр("{""#"",69cf4251-8759-11d5-bf7e-0050bae2bc79,1, 
      |{0,"+ Формат(Код, "ЧН=0; ЧГ=0") +","+ Формат(Alt*16+Control*8+Shift*4, "ЧН=0; ЧГ=0") +"} 
      |}"); 
КонецФункции 
...Показать Скрыть
14. Андрей Акулов (DrAku1a) 1188 24.12.12 02:26 Сейчас в теме
А событие "ПриОткрытии" разве происходет не по факту открытия формы?..
15. Павел Егоров (SatanClaws) 106 24.12.12 19:27 Сейчас в теме
(14) DrAku1a,
честно, в осьмерке плотно не программировал уже давно - основной код сейчас идет на 7.7++

Но если сравнивать с 7.7, то ПриОткрытии() отрабатывает даже раньше, чем форма физически создается (под нее выделяется место в памяти и на ней создаются контроллы). Собственно, ради чего в FormEx-е есть события ПослеСозданияФормы() и ПослеОткрытия(). Первое отрабатывает, когда в памяти уже существуют все, что нужно; второе - уже после первичной отрисовки формы.

Раз во времена исследования всех этих вещей я решил какую-то проблему - видимо, проблема все-таки имеет место быть.
Скорее всего, в снеговике ПередОткрытием() - аналог ПриОткрытии() из 7.7, а ПриОткрытии() - ПослеСозданияФормы() формекса.
16. Сергей Лесовой (Synoecium) 91 16.10.14 06:18 Сейчас в теме
Шикарно (имею ввиду возможность назначить любые сочетания клавиш).
17. Андрей Лукин (frkbvfnjh) 200 24.04.15 16:13 Сейчас в теме
Красавчег, статья зачетная!
18. shard (shard) 242 30.08.15 18:02 Сейчас в теме
Спасибо тебе, добрый человек!
19. Сергей Шутов (Shootoff) 16.10.15 10:22 Сейчас в теме
В 8.3 комбинация с Enter уже не работает.
Flashill; SamNeSvoy; +2 Ответить 2
20. Кузьмич (Кузьмич) 188 12.09.16 10:43 Сейчас в теме
(19) Работает.
БыстрыйВызов(13,,1);
21. A G (grachev1c) 17.02.17 17:04 Сейчас в теме
(19) Версия 8.3.8.2197
комбинация с Enter уже снова работает :)