TFrameにTChartを貼り付け、
TChartの拡張コンポーネントを作成しています。
TChartのように、OnKeyDownイベントを持たないコンポーネントで
Ctrl+A (*)といった、キーボード入力を検出することは可能でしょうか?
*:Ctrl+A で表示中のグラフを全選択させる
キーボード入力検出用のダミーTEditorを表示上は見えない位置に置き(TChartの背面など)
常に、ダミーTEditorにフォーカスがあるようにすれば、実現は可能なのですが、
皆さんでしたら、もっとスマートな方法をご存知と思い質問しました。
よろしくお願いします。
TActionにイベントを作成して、FormのOnKeyイベントに連動させたらどうでしょうか?
こんな感じ?
TChartEx = class(TChart)
private
FCTRL: Boolean;
procedure WMKEYDOWN(var Message: TWMKEYDOWN);message WM_KEYDOWN;
procedure WMKEYUP(var Message: TWMKEYUP);message WM_KEYUP;
procedure WMLBUTTONDOWN(var Message: TWMLBUTTONDOWN);message WM_LBUTTONDOWN;
protected
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure CreateWnd;override;
published
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
end;
procedure Register;
implementation
constructor TChartEx.Create(AOwner: TComponent);
begin
inherited;
FCTRL := False;
end;
procedure TChartEx.CreateWnd;
begin
inherited CreateWnd;
SetFocus;
end;
destructor TChartEx. Destroy;
begin
inherited
end;
procedure TChartEx.WMLBUTTONDOWN(var Message: TWMMouse);
begin
inherited;
//TCharクリックでフォーカス移動
SetFocus;
end;
procedure TChartEx.WMKEYUP(var Message: TWMKEYUP);
begin
inherited;
if Message.CharCode = VK_CONTROL then FCTRL := False;
end;
procedure TChartEx.WMKEYDOWN(var Message: TWMKEYDOWN);
begin
inherited;
if Message.CharCode = VK_CONTROL then FCTRL := True;
if (FCTRL = True) and (Message.CharCode = 65) then
begin
//CTRL + A が押された
end;
Exit;
end;
ツイート | ![]() |