Delphi の TToolBar 上でPopupMenuの表示位置下にあるコントロールを取得
Delphi の TToolBar 上でPopupMenuの表示位置下にあるコントロールを取得
今回は TToolBar 上に TToolButton.Style を tbsButton と tbsSeparator で配置したもの
TToolBar には、指定位置のコントロールを取得する ScreenToClient があるのだが、tbsSeparator のコントロール上で取得しても nil しか返ってこない
procedure TForm1.PopupMenuItem1Click(Sender: TObject);
var
Point: TPoint;
Ctrl: TControl;
begin
if (Sender is TMenuItem) then begin
Point := ToolBar1.ScreenToClient(TPopupMenu(TMenuItem(Sender).GetParentMenu).PopupPoint);
Ctrl := ToolBar1.ControlAtPos(Point, True);
// ToolButton.Style が tbsSeparator のコントロールは Ctrl = nil が返る
end;
end;
そのため Toolbar 上のコントロールを探して一致するものを取得(例は横軸しか判定してません)
procedure TForm1.PopupMenuItem1Click(Sender: TObject);
var
Point: TPoint;
Ctrl: TControl;
I: Integer;
begin
if (Sender is TMenuItem) then begin
Point := ToolBar1.ScreenToClient(TPopupMenu(TMenuItem(Sender).GetParentMenu).PopupPoint);
for I := ToolBar1.ControlCount - 1 downto 0 do begin
Ctrl := ToolBar1.Controls[I];
if (Point.X > Ctrl.Left) and (Point.X < Ctrl.Left + Ctrl.Width) then begin
// 該当
Break;
end;
end;
end;
end;
画面右端で PopupMenu を表示させた場合、右クリック位置とは違う場所にメニューが表示されるが、PopupPoint は最初に右クリックした位置が入っているようす
Controls に入っている順番は、Left等からの昇順ではなく ToolBar へ登録された順番となるため、ToolButton 等を動的に作成する時に Tag へ index 等を保存しておくとよいかも
コメント