1

ばかげた質問かもしれませんが、多くの TTreeViewItem にリンクされたポップアップ メニューがあります。問題は、TTreeView.Selected プロパティが右クリックで設定されないことです。GetMousePos は、次または前の TTreeViewItem の座標を返す傾向があります。実際にポップアップをトリガーしたアイテムを取得するにはどうすればよいですか?

4

2 に答える 2

2

PopupMenu のアイテムをクリックするとポイントがTPopupMenu.PopupPoint返されるようです ( Delphi XE2では、メニューの位置を設定するために内部で使用され、メニューが消えると 0 に設定されるようです)。したがって、この状況では、最も簡単な方法は、選択したアイテムへの参照を保存できる場所を処理し、それをポップアップアイテムイベントハンドラーで使用することです。(0,0)TreeView.OnMouseDown

そのため、以下の例のコードではFClickedItem : TTreeViewItem、フォーム クラスに追加しました。

procedure TSampleForm.SampleTreeViewMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
    if button = TMouseButton.mbRight then
         FClickedItem := SampleTreeView.ItemByPoint(x,y)
    else FClickedItem := nil;
end;

procedure TSampleForm.TestMenuItemClick(Sender: TObject);
begin
    if Assigned(FClickedItem) then
         ShowMessage(Format('Item `%s (%s)` was selected!', [FClickedItem.Text, FClickedItem.Name]))
    else ShowMessage('there is nothing to show');
end;

更新:ソース コードを参照したところTPopupMenu.FPopupPoint、実装コードでプライベート変数 (読み取り専用プロパティ) が使用されていないため、常に =(0,0)

于 2013-12-25T14:08:48.693 に答える