![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здраствуйте =)
незнаю как можно сделать чтоб, выделить копмонент TImage и перемещать его,не мышкой,а именно стрелками клавиатуры. у этого компонента нету свойств Onkey ,да и на форме его выделить не получается.возможно ли както это реализовать? задача у меня такая,на форме несколько квадратных имейджев,и надо стрелками выбрать нужный,и шифт+стрелки перемещать его. ну с самой задачей надеюсь сам справлюсь, а как выделить обьект и событие onkeypress прикрутить к нему? Последний раз редактировалось Snake22, 13.03.2011 в 16:48. |
#2
|
||||
|
||||
![]() как вариант - запоминать в глобальную переменную. Событие нажатия клавиши можно перехватить:
Код:
procedure wmkeydown(var msg: TWMKeyDown); message WM_KEYDOWN; ... case msg.CharCode of VK_LEFT:; VK_RIGHT:; ... — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
||||
|
||||
![]() Если правильно понял вопрос то так:
Код:
Var T: Array [0..1] of TPoint; // К-во Imageй. X,Y,N: Integer; procedure TForm1.Image1Click(Sender: TObject); begin N:= 0; end; procedure TForm1.Image2Click(Sender: TObject); begin N:= 1; end; //И т.д. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if ssShift in Shift Then begin Case Key of VK_LEFT: Dec(T[N].X, 5); VK_RIGHT: Inc(T[N].X, 5); VK_UP: Dec(T[N].Y, 5); VK_DOWN: Inc(T[N].Y, 5); end; (Form1.Components[N] As TImage).Left:= T[N].X; (Form1.Components[N] As TImage).Top:= T[N].Y; end; end; If end Then begin; |
#4
|
|||
|
|||
![]() Ага спасибо AND REY, твой способ работает.
но столкнулся с проблемой,если на форме нет ни одной кнопки,едита и т.д. то активной становиться форма и событие onkeydown работает. но если есть хоть одна кнопка,едит и тд. то активны получаються они,то есть курсор на них наведен,и на события формы программа уже не реагирует. что можно сделать? |
#5
|
||||
|
||||
![]() FormN.KeyPreview?
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#6
|
||||
|
||||
![]() Цитата:
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#7
|
|||
|
|||
![]() Цитата:
а через WM_KEYDOWN не подскажете как сделать? гуглём чтото не находит как узнать какая клавиша нажата,там тока как нажать клавишу с помощью wm_keydown както так...непонимаю |
#8
|
|||
|
|||
![]() ага,кажеться нашел тут на форуме нужную вещь.
но чтото не соображу куда все это мне писать? Код:
SendMessage(Wnd: HWnd; wm_KeyDown, wParam: Word; lParam: Longint); SendMessage(Wnd: HWnd; wm_KeyDown, wParam: Word; lParam: Longint); SendMessage(Wnd: HWnd; wm_KeyUp, wParam: Word; lParam: Longint); SendMessage(Wnd: HWnd; wm_KeyUp, wParam: Word; lParam: Longint); Wnd: Окно, пpинимающее сообщение wm_KeyDown: Нажатие клавиши wm_KeyUp: Отпускание клавиши wParam: Является кодом виpтуальной клавиши. Т.е. в твоем случае Код Ctrl Код С Код С Код Ctrl (не могу сказать какой там у них код, Delphi под рукой нету, а гуглить лень) lParamLo: Количество pаз, когда нажатие этой клавиши повтоpялось из-за фиксации ее в нажатом положении |
#9
|
|||
|
|||
![]() ну что неужели никто не знает??
|
#10
|
||||
|
||||
![]() Так где хочешь отловит нажатие клавиш:
Код:
private procedure WMHotKey(var Message: TMessage); message WM_HOTKEY; Var T: Array [0..1] of TPoint; // К-во Imageй. X,Y,N: Integer; ID1, ID2, ID3, ID4: Integer; procedure TForm1.FormActivate(Sender: TObject); begin ID1:= GlobalAddAtom('Key_1'); ID2:= GlobalAddAtom('Key_2'); ID3:= GlobalAddAtom('Key_3'); ID4:= GlobalAddAtom('Key_4'); RegisterHotKey(Form1.Handle, ID1, MOD_SHIFT, VK_LEFT); RegisterHotKey(Form1.Handle, ID2, MOD_SHIFT, VK_RIGHT); RegisterHotKey(Form1.Handle, ID3, MOD_SHIFT, VK_UP); RegisterHotKey(Form1.Handle, ID4, MOD_SHIFT, VK_DOWN); end; procedure TForm1.Image1Click(Sender: TObject); begin N:= 0; end; procedure TForm1.Image2Click(Sender: TObject); begin N:= 1; end; //И т.д. procedure TForm1.WMHotKey(var Message: TMessage); begin if LoWORD(Message.lParam) <> MOD_SHIFT Then Exit; Case HiWORD(Message.lParam) of VK_LEFT: Dec(T[N].X, 5); VK_RIGHT: Inc(T[N].X, 5); VK_UP: Dec(T[N].Y, 5); VK_DOWN: Inc(T[N].Y, 5); end; (Form1.Components[N] As TImage).Left:= T[N].X; (Form1.Components[N] As TImage).Top:= T[N].Y; end; procedure TForm1.FormDestroy(Sender: TObject); begin UnregisterHotKey(Form1.Handle, ID1); UnregisterHotKey(Form1.Handle, ID2); UnregisterHotKey(Form1.Handle, ID3); UnregisterHotKey(Form1.Handle, ID4); GlobalDeleteAtom(ID1); GlobalDeleteAtom(ID2); GlobalDeleteAtom(ID3); GlobalDeleteAtom(ID4); end; If end Then begin; |
#11
|
|||
|
|||
![]() во спасибо.работает даже лучше чем я ожидал( даже если форма не активна,как раз так и надо).
а как сюда добавить одиночную кнопку? т.е. без зажатия Шифта,например просто когда Ентер нажимаю |
#12
|
||||
|
||||
![]() Так вроде бы:
Код:
RegisterHotKey(Form1.Handle, ID1, 0, VK_RETURN); // Регистрируем. procedure TForm1.WMHotKey(var Message: TMessage); begin if HiWORD(Message.lParam) = VK_RETURN Then // Проверяем. end; If end Then begin; |
#13
|
|||
|
|||
![]() спасибо большое =)
|
#14
|
|||
|
|||
![]() xD
![]() чёто такое сделал |