Конференция "Начинающим" » Подмена char-code на KeyDown [D7, XP]
 
  • AlexC (15.10.18 16:27) [0]
    Собственно вопрос: в событии OnKeyDown можно произвести подмену char-кода нажатой клавиши? Как OnKeyDown получить char-код известно - через MapVirtualKey, а можно ли его подменить для события OnKeyPress.
    Поясню для чего это нужно: есть много полей ввода, в некоторых полях нужно вводить только по русски, в некоторых только по английски. И вот чтоб не приходилось переключать раскладку клавиатуры, допустим в поле, где нужно вводить только английские символы, нажали "д", а вывеkось "l".
  • KSergey © (15.10.18 16:45) [1]
    > а можно ли его подменить для события OnKeyPress.

    Можно

    > Как OnKeyDown получить char-код известно - через MapVirtualKey,

    А в OnKeyPress - сразу char, ничего подменять не требуется. Проверил, вот такой код вообще супер работает, осталось таблицу замен прошить - и всё

    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
     if Key = 'д' then  Key := 'l';
     if Key = 'w' then  Key := 'ц';
    end;
  • AlexC (15.10.18 16:49) [2]
    Такой вариант конечно понятен, но там все несколько сложнее, и для каждого отдельного поля прописывать в KeyPress что на что менять - явно не правильно.
    Нужно так - код 67 - в OnKeyPress должен быть код "C" в событии OnKeyPress.
  • dmk © (15.10.18 19:08) [3]
    Пойдет?
    Caption := Chr(Key) + ' (' + IntToStr(Key) + ')';
    И меняй, что хочешь на что хочешь. Хоть таблицу подстановки, хоть перекодировку и т.п.
  • AlexC (15.10.18 20:13) [4]
    У меня сейчас так примерно и сделано, но это не на 100% процентов то, что надо. Есть проблема с испанским, немецким языками и еще некоторые другие проблемы. Понятно , что сейчас они у меня решены через OnKeyPress, но это несколько громозко и приходится для каждой конкретной проблемы делать такого рода подмену. А вот если есть возможность делать подмену непосредственно в OnKeyDown, то это было бы универсальное решение.
    Перерыл кучу инфы в инете, но пока то что надо не нашел.
  • sniknik © (15.10.18 20:33) [5]
    проще на событии входа в поле переключить раскладку на нужную, при выходе восстановить сохраненную как было... проще, очевиднее, нагляднее, чем "стоит испанский, а в поле вводит какую то абракадабру" (не установлен русский шрифт к примеру, а переводишь в него например а не в английский... ну планы поменялись...).
  • dmk © (15.10.18 21:44) [6]
    >А вот если есть возможность делать подмену непосредственно в OnKeyDown,
    >то это было бы универсальное решение.
    Дык о том и пишем. Key - это переменная. Она меняется.
    Создайте массив с нужной раскладкой и меняте на здоровье.
    Хоть в OnKeyDown, хоть в OnKeyUp.
  • sniknik © (16.10.18 00:38) [7]
    > Хоть в OnKeyDown, хоть в OnKeyUp.
    там как бы код клавиши, один на клавишу, без разницы у большой буквы, маленькой, русской, английской... ну, если не обращать внимания на "модификаторы" шифт/капслок/локаль. в чем у него и "проблема" при изменении в OnKeyDown.
  • KilkennyCat © (17.10.18 00:06) [8]

    > Создайте массив с нужной раскладкой

    это совершенно лишнее, и неверный путь вообще.
  • kilkennycat © (17.10.18 00:10) [9]

    > AlexC

    GetKeyboardLayoutList  LoadKeyboardLayout и т.д.
  • _Amoeba (17.10.18 16:46) [10]

    > kilkennycat

    Абсолютно правильно! Я так и поступаю. В OnEnter преверяем текущую ракладку, и меняем ее программно, предварительно запомнив, если надо. В OnExit можно восстановить запоменную.
 
Конференция "Начинающим" » Подмена char-code на KeyDown [D7, XP]
Есть новые Нет новых   [134427   +34][b:0][p:0.001]