2010-03-24 60 views
15

有一個彈出菜單附加到窗體上的按鈕,但也像TCharts的東西,我想知道哪個組件被右鍵單擊以啓動彈出菜單第一個地方。什麼是一個彈出菜單點擊發起的組件

click方法的Sender參數只是指向TMenuItem,其父對象是彈出式菜單(或父級菜單項)。

如何獲取原始組件?

回答

27

您的意思是PopupMenu1.PopupComponent?

+0

+1。或者,爲了更通用,我會在菜單的OnPopup事件中使用它:(發件人爲TPopupMenu).PopupComponent – 2010-03-24 10:21:32

+0

@BruceMcGee爲什麼/這將如何變得更「通用」? – Wolf 2015-01-20 12:39:55

+0

@Wolf:更通用,因爲它不需要知道組件的名稱。如果組件名稱發生更改,則更易碎,同一事件可能被多個組件使用。 – 2015-01-20 21:11:51

0

作爲最後的手段,您可以使用Mouse.CursorPosTPopupMenu.OnPopup在窗體上查找此組件。但是,可能有更好/更簡單的方法。

+0

這隻有在通過鼠標點擊打開彈出式菜單時纔有幫助,還有一個鍵(或組合鍵)可以打開聚焦控件的上下文菜單。 – Wolf 2015-01-20 12:35:02

9

您可以通過

Caller := ((Sender as TMenuItem).GetParentMenu as TPopupMenu).PopupComponent; 

一個這樣的PopupMenu的被分配到幾個列表框和解決導出到文件功能範例中得到這樣的PopupMenu的TMenuItem的單擊事件中主叫組件:

procedure TForm1.mniExportFileClick(Sender: TObject); 
var Caller: TObject; 
begin 
    if SaveTextFileDialog1.Execute then 
    begin 
    Caller := ((Sender as TMenuItem).GetParentMenu as TPopupMenu).PopupComponent; 
    (Caller as TListBox).Items. 
     SaveToFile(SaveTextFileDialog1.FileName, 
     StandardEncodingFromName(
      SaveTextFileDialog1.Encodings[SaveTextFileDialog1.EncodingIndex])); 
    end; 
end; 
相關問題