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 等を保存しておくとよいかも
コメント