Hallo,
ich nutze dynamisch erzeugte Buttons auf einer TScrollBox. Diese können mit der Maus frei verschoben werden (ähnlich Delphi
IDE). Nun möchte ich eine Art Raster dadurch erreichen, dass der Benutzer diese Buttons ebenfalls mittels Tastatur verschieben kann und ich dann die Werte auf Vielfache von 8, 16 oder so runde.
Mit einem Button allein klappt das prima. Mit 2 oder mehr nicht, weil dann mit den Cursortasten der Focus gewechselt und meine Aktion auf eine anderes Control angewendet wird. Im www stand dazu, dass man den Buttons diese Verhalten abgewöhnen kann, indem man
Key:= 0;
setzt.
Aber ganz so einfach scheint es dann doch nicht zu sein. Denn folgender Code funktioniert eben nur bedingt:
Delphi-Quellcode:
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
aControl : TWinControl;
aButton : TButton;
begin
aControl:= ActiveControl; // aktives Control merken
if (aControl is TButton) then
begin
aButton:= (aControl as TButton);
case Key of
VK_LEFT : aButton.Left:= aButton.Left - 16;
VK_UP : aButton.Top:= aButton.Top - 16;
VK_RIGHT : aButton.Left:= aButton.Left + 16;
VK_DOWN : aButton.Top:= aButton.Top + 16;
end;
Key:= 0; // <== Tastaturpuffer gelöscht.
SetFocusedControl(aControl); // <== Focus nochmal gesetzt
end;
end;
Ich vermute also, dass VK_LEFT & Co. immer noch irgendwo im Tastaturpuffer rumlungern. Wie löse ich das Problem denn richtig?