KeyDownイベントを持たないコンポーネントで、Ctrl+Aを検出するには


maco  2008-05-13 04:10:49  No: 30687

TFrameにTChartを貼り付け、
TChartの拡張コンポーネントを作成しています。

TChartのように、OnKeyDownイベントを持たないコンポーネントで
Ctrl+A (*)といった、キーボード入力を検出することは可能でしょうか?

  *:Ctrl+A で表示中のグラフを全選択させる

キーボード入力検出用のダミーTEditorを表示上は見えない位置に置き(TChartの背面など)
常に、ダミーTEditorにフォーカスがあるようにすれば、実現は可能なのですが、
皆さんでしたら、もっとスマートな方法をご存知と思い質問しました。

よろしくお願いします。


HOta  2008-05-13 06:09:43  No: 30688

TActionにイベントを作成して、FormのOnKeyイベントに連動させたらどうでしょうか?


KHE00221  URL  2008-05-13 13:44:52  No: 30689

こんな感じ?

  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;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加