パネル内のコントロールクリック時、親パネルがクリックされたように見せかけたい

解決


ニケ  2008-03-27 18:25:23  No: 30289  IP: 192.*.*.*

パネルの子コントロールとしてラベルを配置し、パネルにOnClickイベントを
定義しているのですが、パネル内のラベルをクリックした時、あたかも親の
パネルをクリックしたような挙動にする事は可能でしょうか。

LabelのOnClickイベントで単純に親パネルのOnClickを呼び出せば、
親パネルのクリックイベントは実行できますが、この方法だと
A.親パネルのラベル以外の部分でマウスDown ⇒ マウス移動 ⇒ 親パネル内  でマウスUp ⇒ 親パネルのクリックイベントが発生する
B.親パネル内のラベル上でマウスDown ⇒ マウス移動 ⇒ 親パネルのラベル  以外の場所でマウスUp ⇒ 親パネルのクリックイベントが発生しない
となり、親パネル上でクリックした場合とラベル上でクリックした場合で、
クリックキャンセルに対する挙動が変わってしまいます。

パネルとラベルを大量に使用するため、なるべく簡単に記述する方法を
考えているのですが、何かいい方法はないでしょうか。

編集 削除
KHE00221  2008-03-27 21:07:51  No: 30290  IP: 192.*.*.*

OnMouseUp で処理したら良いと思いますが?

編集 削除
エコ  2008-03-27 23:39:29  No: 30291  IP: 192.*.*.*

>パネルとラベルを大量に...
でも、ハンドラは一つだけ

procedure TForm1.SomeLabelMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  P: TPoint;
  wParent: TControl;
begin
  P := TControl(Sender).ClientToScreen(Point(X, Y));
  wParent := TControl(Sender).Parent;
  if WindowFromPoint(P) = wParent.Handle then begin
    SomePanelClick(wParent);
  end;
end;

procedure TForm1.SomePanelClick(Sender: TObject);
begin
  ShowMessage(TControl(Sender).Name+' CLICK');
end;

編集 削除
ニケ  2008-03-28 10:15:29  No: 30292  IP: 192.*.*.*

OnMouseUpだけで処理しようとすると、パネル外の部分でマウスDownし、
パネル内でマウスUpした場合にもクリック処理が走ってしまったので、
OnMouseDownでラベルの親パネルにフォーカスをセットし、OnMouseUpで
ラベルの親パネルにフォーカスがあればクリックイベント発生、としました。
何も問題がなければこれで行ってみようと思います。
ありがとうございました。

procedure TForm1.LabelInPanelMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  ctlParent: TWinControl;
begin
  if Button = mbLeft then
    // 親パネルにフォーカスを移す
    ctlParent := TControl(Sender).Parent;
    if ctlParent.CanFocus then
      ctlParent.SetFocus;
end;

procedure TForm1.LabelInPanelMouseMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  ctlParent: TWinControl;
begin
  if Button = mbLeft then
    // マウスDownしたパネルと同じパネルでMouseUpした場合のみ、クリックイベント発生
    ctlParent := TControl(Sender).Parent;
    if Self.ActiveControl = ctlParent then
      TplButton(ctlParent).OnClick(TControl(Sender).Parent);
end;

編集 削除