Здоровеньки булы, Дима Барсуков!
9 июля 2004 г., пятница, 11:52:15 (GMT+05:00), пришел ко мне
почтальон Почкин и всучил письмо с пометкой "Анализ нажатий",
в котором сообщалось следующее:
ДБ> Выяснил, что если на кнопке не стоит фокус, то эти события замечательно обрабатываются
ДБ> формой... Но при этом никак не получаетсся убрать фокус с кнопки...
ДБ> Проясните ситуацию, кто сталкивался, плиз...
Короче вот работающий код, я привожу на Delphi - Builder влом ставить
на форме Timer1, Button1, Button2 и ActionControl1 (в нем акшионы
ActionLeft, ActionRight, ActionUp и ActionDown).
Надеюсь в Bilder сможешь сам перевести - там делов на минуту.
PS: На форме две кнопки - координаты меняет та на которой стоит фокус.
PPS: Реализовано немного через задницу, но если нет другого способа
обойти необработку Left, Right, Up, Down через OnKeyDown то я думаю этот сойдет.
public
keys: array[0..255] of Boolean;
procedure ProcessKeys;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ActionLeftExecute(Sender: TObject);
begin
keys[VK_LEFT] := True;
end;
procedure TForm1.ActionRightExecute(Sender: TObject);
begin
keys[VK_RIGHT] := True;
end;
procedure TForm1.ActionUpExecute(Sender: TObject);
begin
keys[VK_UP] := True;
end;
procedure TForm1.ActionDownExecute(Sender: TObject);
begin
keys[VK_DOWN] := True;
end;
procedure TForm1.ProcessKeys;
begin
with Form1.ActiveControl{ Button1} do
begin
if keys[VK_LEFT] then Left := Left - 1;
if keys[VK_RIGHT] then Left := Left + 1;
if keys[VK_UP] then Top := Top - 1;
if keys[VK_DOWN] then Top := Top + 1;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ProcessKeys;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
ActionLeft.ShortCut := ShortCut(VK_LEFT , []);
ActionRight.ShortCut := ShortCut(VK_RIGHT, []);
ActionUp.ShortCut := ShortCut(VK_UP , []);
ActionDown.ShortCut := ShortCut(VK_DOWN , []);
Timer1.Interval := 10;
Form1.KeyPreview := true;
end;
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
keys[Key] := False;
end;