2017-02-03 2 views
-1

Создание VCL Forms приложений и в OnMouseDown событий обработчика записи главной формы:Значение сдвига при нажатии только клавиши CTRL?

procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
    if Shift = [ssCtrl] then 
    ShowMessage('CTRL pressed'); 
end; 

Затем запустите приложение, нажмите и удерживайте клавишу CTRL вниз, без других модифицирующих клавиш, а затем нажмите кнопку на форме. Сообщение не отображается. Почему сейчас?

Значения Shift имеют в этом случае, когда нажата клавиша CTRL?

+2

Почему вы не ответили на это самостоятельно, оценив «Shift» в отладчике? Он сразу сказал бы вам, что содержимое «Shift» не просто [ssCtrl], даже если нажата только одна из клавиш Ctrl. – MartynA

ответ

5

Тип TShiftState определяется следующим образом:

type 
    TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble, 
    ssTouch, ssPen, ssCommand, ssHorizontal); 

Как вы можете видеть, это содержит гораздо больше информации, чем просто ключевой состояния модификаторов.

Когда вы удерживаете CTRL ключ и нажмите на форму, Shift имеет это значение: [ssCtrl,ssLeft]. Это говорит о том, что клавиша CTRL не работает, а левая кнопка мыши не работает. Обратите внимание, что эту информацию легко получить с помощью отладчика. Изучение того, как использовать отладку для проверки состояния вашей программы во время выполнения, является очень важным навыком.

Если вы хотите проверить состояние клавиш-модификаторов, вам нужно замаскировать все, что не является ключом-модификатором. Сделайте это с помощью оператора *, который является установленным пересечением. Это позволяет вам сократить информацию до нужных значений перечисления.

if Shift*[ssShift, ssAlt, ssCtrl] = [ssCtrl] then 
    .... 
+0

Блестящий! Ответ от Джерри Доджа является правильным и хорошим, но это более элегантно. – user1580348

+0

Нет, ответ Джерри ошибочен. –

+0

Почему он не прав? – user1580348

1

TShiftState - это перечисление, означающее, что может быть более одного значения. Когда вы делаете if Shift = [ssCtrl], вы проверяете, соответствует ли это точно. Но могут быть и другие ценности.

Так вместо этого, сделайте следующее:

if ssCtrl in Shift then 
    ... 
+0

Это также «Истина», когда я удерживаю клавиши «Ctrl» и «Shift». Но вопрос был: «Итак, какое значение имеет Shift в этом случае, когда нажата клавиша CTRL?» – user1580348

+0

@ user1580348 У вас уже было все правильно. Проблема заключалась в том, как вы делали чек. –

+0

@user - Конечно, это ssCtrl. Но в вопросе, который вы заявляете, вы нажимаете на форму, это не более * только * контрольный ключ. Ваш вопрос непоследовательный. –

Смежные вопросы