パネルの子コントロールとしてラベルを配置し、パネルにOnClickイベントを
定義しているのですが、パネル内のラベルをクリックした時、あたかも親の
パネルをクリックしたような挙動にする事は可能でしょうか。
LabelのOnClickイベントで単純に親パネルのOnClickを呼び出せば、
親パネルのクリックイベントは実行できますが、この方法だと
A.親パネルのラベル以外の部分でマウスDown ⇒ マウス移動 ⇒ 親パネル内 でマウスUp ⇒ 親パネルのクリックイベントが発生する
B.親パネル内のラベル上でマウスDown ⇒ マウス移動 ⇒ 親パネルのラベル 以外の場所でマウスUp ⇒ 親パネルのクリックイベントが発生しない
となり、親パネル上でクリックした場合とラベル上でクリックした場合で、
クリックキャンセルに対する挙動が変わってしまいます。
パネルとラベルを大量に使用するため、なるべく簡単に記述する方法を
考えているのですが、何かいい方法はないでしょうか。
OnMouseUp で処理したら良いと思いますが?
編集 削除>パネルとラベルを大量に...
でも、ハンドラは一つだけ
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;
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;