![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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:;
... |
|
#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; |
|
#4
|
|||
|
|||
|
Ага спасибо AND REY, твой способ работает.
но столкнулся с проблемой,если на форме нет ни одной кнопки,едита и т.д. то активной становиться форма и событие onkeydown работает. но если есть хоть одна кнопка,едит и тд. то активны получаються они,то есть курсор на них наведен,и на события формы программа уже не реагирует. что можно сделать? |
|
#5
|
||||
|
||||
|
FormN.KeyPreview?
|
|
#6
|
||||
|
||||
|
Цитата:
|
|
#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; |
|
#11
|
|||
|
|||
|
во спасибо.работает даже лучше чем я ожидал( даже если форма не активна,как раз так и надо).
а как сюда добавить одиночную кнопку? т.е. без зажатия Шифта,например просто когда Ентер нажимаю |
|
#12
|
||||
|
||||
|
Так вроде бы:
Код:
RegisterHotKey(Form1.Handle, ID1, 0, VK_RETURN); // Регистрируем. procedure TForm1.WMHotKey(var Message: TMessage); begin if HiWORD(Message.lParam) = VK_RETURN Then // Проверяем. end; |
|
#13
|
|||
|
|||
|
спасибо большое =)
|
|
#14
|
|||
|
|||
|
xD
чёто такое сделал |