Das ist das falsche Event. Dein Code gehört nicht in TForm.OnKeyUp
sondern nach TApplicationEvents.OnShortCut
(oder von mir aus TApplication.OnShortCut
)...
Danke, das passt genau! Ich habe das jetzt so zusammengebaut:
Delphi-Quellcode:
procedure TForm1.ApplicationEvents1ShortCut(var Msg: TWMKey;
var Handled: Boolean);
begin
Handled:= True;
if (ActiveControl is TButton) then
begin
case Msg.CharCode of
VK_LEFT : (ActiveControl as TButton).Left:= (ActiveControl as TButton).Left - 16;
VK_UP : (ActiveControl as TButton).Top:= (ActiveControl as TButton).Top - 16;
VK_RIGHT : (ActiveControl as TButton).Left:= (ActiveControl as TButton).Left + 16;
VK_DOWN : (ActiveControl as TButton).Top:= (ActiveControl as TButton).Top + 16;
else
Handled:= False;
end
end
else Handled:= False;
end;
Ich habe es so unschön gebaut, weil ich es unübersichtlicher gefunden hätte, 4 Mal nur wegen
Handled:= True;
ein
begin ... end;
einzufügen. Es geht vermutlich auch schöner.
Und
TApplication.OnShortCut
finde ich sogar noch besser, weil ich keine zusätzliche Komponente mit reinbasteln muss. Und schließlich und letztlich habe ich mal im Code von
Vcl.AppEvnts geschnüffelt. Beim weiteren Suchen bin ich dann auf die Möglichkeit gestoßen, das ganze auch komplett über die Messages abzufangen mit z.B.
procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
. Nachteil ist allerdings, dass es kein Handled gibt und man aufpassen muss, die nicht ausgewerteten Tasten mit Inherited schön weiterzugeben.