Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Скрытый MouseMove у всех sCheckBox и привязка к клавише

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Ugnetatel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте, задача следующая:
 
Есть 20 sCheckBos(AlphaControls) у каждого есть событие MouseMove.
Как скрыть MouseMove у sPanel.sCheckBos(1, 2, 3, .. 20) MouseMove  в Falce.
Как сделать чтобы MouseMove было изначально в состоянии falce,
а активировалось бы только при удержании кнопки на клавиатуре скажем Ctrl.
Т.е. привязка  MouseMove у sPanel.sCheckBos к клавише на клавиатуре Ctrl в состоянии True.
 
Я новичок, задачу эту решить не смог, мне она показалась слишком сложной
Заранее благодарен за подсказки.

Всего записей: 31 | Зарегистр. 06-01-2014 | Отправлено: 21:51 16-02-2014 | Исправлено: Ugnetatel, 23:28 16-02-2014
IJCuper



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Не очень понятно что именно нужно сделать..
Полагаю, чтобы некий код выполнялся, когда курсор наводится на объект sCheckBox1 (или 2 или 3...), но при условии удерживаемой клавиши Ctrl?  
 
Тогда для CheckBox1MouseMove код будет выглядеть примерно так:

Код:
 
procedure TForm1.CheckBox1MouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);
begin
  if (ssCtrl in Shift) then begin
    // Здесь будет ваш код
  end;
end;
 

 
Можно даже всем sCheckBox-ам назначить один и тот же обработчик на событие MouseMove, а внутри него уже различать источник события. Например так:

Код:
 
procedure TForm2.CheckBoxMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
Var Str: String;
begin
  if ssCtrl in Shift then
  begin
    Str := (Sender as TCheckBox).Name;
    if Str = 'CheckBox1' then Form2.Caption := 'Ctrl + mouse move over CheckBox1';
    if Str = 'CheckBox2' then Form2.Caption := 'Ctrl + mouse move over CheckBox2';
  end;
end;
 

P.S. у меня AlphaControls не установлены, поэтому примеры для обычных CheckBox-ов, поправите по месту под свои типы и компоненты.

Всего записей: 669 | Зарегистр. 07-07-2004 | Отправлено: 00:09 17-02-2014 | Исправлено: IJCuper, 00:23 17-02-2014
Ugnetatel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сергей, просто великолепно, Браво, поняли именно так как нужно.
 
Я вот пробовал по вашему примеру делать тоже самое для кнопки Shift, ctrl, alt - работает изумительно,
а для caps lock, цифр: 1, 2, 3 и для символа `(не зажатой тильды),
компилироваться не хочет. Можете тут подсказать, т.к. для Caps Lock удержание не нужно.

Всего записей: 31 | Зарегистр. 06-01-2014 | Отправлено: 00:37 17-02-2014
IJCuper



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Увы, ShiftState не может обрабатывать все клавиши. Вот фрагмент из документации:

Цитата:
Indicates the state of the Alt, Ctrl, or Shift key, mouse buttons, or touch devices.
The TShiftState type is used by key-event and mouse-event handlers to determine the state of the Alt, Ctrl, or Shift key, the state of the mouse buttons or of an attached touch device, when the event occurs. It is a set of flags that indicates the following states:
Value     Meaning
ssShift -The Shift key is held down.
ssAlt - The Alt key is held down.
ssCtrl - The Ctrl key is held down.
ssLeft - The left mouse button is held down.
ssRight - The right mouse button is held down.
ssMiddle - The wheel mouse button is held down.
ssDouble - The mouse button was double-clicked.
ssTouch - The user is holding a finger on the touch surface.
ssPen - The pen is touching the surface of a tablet.  

 
Можно попробовать обратиться к функции GetKeyBoardState напрямую. Что-то типа

Код:
 
procedure TForm2.CheckBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  KBDState: TKeyboardState;
begin
  GetKeyBoardState(KBDState);
  if ((KBDState[VK_CAPITAL] And 128) <> 0) then   showmessage('Удерживается нажатой клавиша CapsLock');
  if ((KBDState[vkTilde] And 128) <> 0) then   showmessage('Удерживается нажатой клавиша Тильда');
end;
 

(Для обработки константы vkTilde нужно в строку Uses в начале модуля дописать UITypes, либо заменить vkTilde на ее код = 192)
 
А как уж скомбинировать опрос клавиш и проверку движения мыши над конкретным объектом - надо смотреть по логике программы.

Всего записей: 669 | Зарегистр. 07-07-2004 | Отправлено: 01:12 17-02-2014 | Исправлено: IJCuper, 13:52 17-02-2014
Ugnetatel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да, спасибо за разъяснения.
 
Могли бы вы показать как на этом примере с кнопкой Ctrl(удерживаемой и отжатой):

Код:
procedure TForm1.CheckBox1MouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);
begin
  if (ssCtrl in Shift) then begin
    // Здесь будет ваш код
  end;
end;  

 
Только с клавишей Caps Lock, т.к. её раз нажал и удерживать больше не нужно 'фокус работает', еще по Caps Lock - и MouseMove как бы в falce.
 
Заранее Спасибо.
 

Всего записей: 31 | Зарегистр. 06-01-2014 | Отправлено: 01:56 17-02-2014
MGAlex



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ugnetatel
Так выше же пример написан:
 

Код:
 
procedure TForm2.CheckBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  KBDState: TKeyboardState;
begin
  GetKeyBoardState(KBDState);
  if (KBDState[VK_CAPITAL] <> 0) then
   // Если CapsLock нажат, то ...
  else
    //Если не нажат, тогда ...
end;
 

Всего записей: 1855 | Зарегистр. 12-10-2007 | Отправлено: 02:06 17-02-2014 | Исправлено: MGAlex, 02:10 17-02-2014
Ugnetatel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Извиняюсь, но я только учусь.  
Елки зелёные, так мне именно и нужно отслеживать текущее состояние режима CAPS LOCK,
тобишь, когда выключена клавиша MouseMove неактивна, включена - активна.
 
А как мне записать в этом примере MouseMove не активной и наоборот, я,  что-то запутался,
я имел ввиду удерживать CapsLock тут не нужно, раз нажал - работает MouseMove,  
ну и аналогично раз по CapsLock и нет.

Всего записей: 31 | Зарегистр. 06-01-2014 | Отправлено: 02:12 17-02-2014 | Исправлено: Ugnetatel, 02:33 17-02-2014
MGAlex



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот так:
 

Код:
 
procedure TForm2.CheckBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  KBDState: TKeyboardState;
begin
  GetKeyBoardState(KBDState);
  if (KBDState[VK_CAPITAL] <> 0) then
   begin
      //Ваш код
   end;
end;
 

 
OnMouseMove будет выполняться проверка. Если включен CapsLock, то будут выполняться действия описанные в блоке    

Код:
 
    begin
      //Ваш код
    end;
 
 
 
В ином случае ничего происходить не будет.
 
OnMouseMove - это не переменная, а событие. И оно не имеет состояния true или false. Каждое событие имеет свой обработчик. Если в этом обработчике прописан какой-то код, то при наступлении того или иного события будет выполняться этот код. Если нужно, чтобы код выполнялся только в определенных случаях, необходимо добавить условие в обработчик события.

Всего записей: 1855 | Зарегистр. 12-10-2007 | Отправлено: 12:33 17-02-2014 | Исправлено: MGAlex, 12:42 17-02-2014
Ugnetatel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо IJCuper и MGAlex тема супер получилась.
 
А так можно сделать если хотим назначить на цифры или символы:

Код:
procedure TForm1.CheckBox1MouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);
begin
  if (GetAsyncKeyState($31) and $8000) <> 0 then begin  //  клавиша "1" находится в нажатом состоянии
    // Здесь будет ваш код
  end;
end;

 
А вот коды кнопок клавиатуры:

Код:
Kлaвишa Oбoзнaчeниe 10-ный кoд
16-ный кoд
backspace DOM_VK_BACK_SPACE 8 0x08
Tab DOM_VK_TAB 9 0x09
Enter DOM_VK_ENTER 13 0x0D
Shift DOM_VK_SHIFT 16 0x10
Ctrl DOM_VK_CONTROL 17 0x11
Alt DOM_VK_ALT 18 0x12
Pause DOM_VK_PAUSE 19 0x13
CapsLock DOM_VK_CAPS_LOCK 20 0x14
Esc DOM_VK_ESCAPE 27 0x1B
пpoбeл DOM_VK_SPACE 32 0x20
PageUp DOM_VK_PAGE_UP 33 0x21
PageDown DOM_VK_PAGE_DOWN 34 0x22
End DOM_VK_END 35 0x23
Home DOM_VK_HOME 36 0x24
cтpeлкa влeвo DOM_VK_LEFT 37 0x25
cтpeлкa ввepx DOM_VK_UP 38 0x26
cтpeлкa впpaвo DOM_VK_RIGHT 39
0x27
cтpeлкa вниз DOM_VK_DOWN 40 0x28
Insert 45 0x2D
Delete 46 0x2E
0 48 0x30
1 49 0x31
2 50 0x32
3 51 0x33
4 52 0x34
5 53 0x35
6 54 0x36
7 55 0x37
8 56 0x38
9 57 0x39
A 65 0x41
B 66 0x42
C 67 0x43
D 68 0x44
E 69 0x45
F 70 0x46
G 71 0x47
H 72 0x48
I 73 0x49
J 74 0x4A
K 75 0x4B
L 76 0x4C
M 77 0x4D
N 78 0x4E
O 79 0x4F
P 80 0x50
Q 81 0x51
R 82 0x52
S 83 0x53
T 84 0x54
U 85 0x55
V 86 0x56
W 87 0x57
X 88 0x58
Y 89 0x59
Z 90 0x5A
лeвaя клaвишa Windows 91 0x5B
пpaвaя клaвишa Windows 92 0x5C
клaвишa Applications 93 0x5D
NumPad 0 96 0x60
NumPad 1 97 0x61
NumPad 2 98 0x62
NumPad 3 99 0x63
NumPad 4 100 0x64
NumPad 5 101 0x65
NumPad 6 102 0x66
NumPad 7 103 0x67
NumPad 8 104 0x68
NumPad 9 105 0x69
NumPad * 106 0x6A
NumPad + 107 0x6B
NumPad - 109 0x6D
NumPad. 110 0x6E
NumPad / 111 0x6F
F1 DOM_VK_F1 112 0x70
F2 DOM_VK_F2 113 0x71
F3 DOM_VK_F3 114 0x72
F4 DOM_VK_F4 115 0x73
F5 DOM_VK_F5 116 0x74
F6 DOM_VK_F6 117 0x75
F7 DOM_VK_F7 118 0x76
F8 DOM_VK_F8 119 0x77
F9 DOM_VK_F9 120 0x78
F10 DOM_VK_F10 121 0x79
F11 DOM_VK_F11 122 0x7A
F12 DOM_VK_F12 123 0x7B
NumLock DOM_VK_NUM_LOCK 144 0x90
ScrollLock DOM_VK_SCROLL_LOCK 145
0x91
PrintScreen DOM_VK_PRINTSCREEN
154 0x9A
Meta DOM_VK_META 157 0x9D
; 186 0xBA
= 187 0xBB
, 188 0xBC
- 189 0xBD
. 190 0xBE
/ 191 0xBF
~ 192 0xC0
[ 219 0xDB
\ 220 0xDC
] 221 0xDD
' 222 0xDE

 
Все вопросы решены, классный пост получился.
Ещё раз всем ответившим огромное СПАСИБО!!!

Всего записей: 31 | Зарегистр. 06-01-2014 | Отправлено: 18:36 17-02-2014
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Скрытый MouseMove у всех sCheckBox и привязка к клавише


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru