Я хочу реализовать сочетания клавиш в Delphi 2010 для обработки Return и Ctrl + Return в событии onkeyUp
, но кажется, что они несовместимы.
Вот что я хочу сделать с этим кодом: если вы нажмете Enter при редактировании, он добавит элемент в список, а если вы нажмете Ctrl+Enter, он должен изменить активный элемент.
Мой код таков:
procedure TForm5.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if GetKeyState(VK_RETURN) < 0 then
lb1.items[lb1.ItemIndex]:=edit1.Text;
if GetKeyState(VK_CONTROL) < 0 then
case Key of
VK_RETURN:begin
lb1.Items.Add(Edit1.text);
lb1.ItemIndex:=lb1.Items.Count-1;
label3.caption:='Nº de Registros:'+inttostr(lb1.Items.Count);
end;
и запускать, когда используются return и ctrl+return. Однако я, кажется, не знаю, что я делаю неправильно, потому что я выполнить код и при нажатии enter, а также код при нажатии Ctrl+enter.
нет . выполнить код при нажатии Enter, а также код при нажатии Ctrl+Enter
Вы, вероятно, хотите этого:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_RETURN then
begin
if ssCtrl in Shift then
ShowMessage('CONTROL: ' + Edit1.Text)
else
ShowMessage(Edit1.Text);
Key := 0;
end;
end;
(Я решил использовать OnKeyDown
вместо OnKeyUp
, потому что это нормальный выбор в подобных ситуациях, но он будет работать точно так же с OnKeyUp
.)
То есть: если клавиша Return, то действовать. И действуйте по-разному в зависимости от того, нажат ли модификатор Ctrl. Обратите внимание, что нет необходимости вызывать GetKeyState
, поскольку обработчик событий предоставляет вам эту информацию в своих аргументах.
Ваш код будет работать со сбоями, потому что его логика ошибочна.
Однако приведенный выше фрагмент не идеален, так как Windows будет издавать «звуковой сигнал неверного ввода» при нажатии (Ctrl+)Return.
Чтобы обойти это, также добавьте следующий обработчик OnKeyPress
:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key in [#13, #10] then
Key := #0;
end;
спасибо, Андреас, ваш код сослужил мне хорошую службу, как я могу добавить Ctrl+X?
@PedroRoblesRuiz: Ctrl+X уже используется самим элементом управления для операции «Вырезать». Но если вас это не волнует, вы можете просто убрать точку с запятой и добавить else if Key = ^X then...
к обработчику OnKeyPress
. (В качестве альтернативы: добавьте дело в обработчик OnKeyDown
или используйте список действий, ...)
в чем именно проблема?: Ничего не произошло? Ошибка времени компиляции? Ошибка выполнения? Какой обработчик событий элемента управления вы используете?