2011-11-09 36 views
2

我正在使用以下方法在運行時使用Action創建ActionClient。如何在運行時向操作項添加下拉菜單

procedure TMainForm.AddToProjectHistory(Path: string); 
var 
    NewOption: TAction; 
    ActionClient: TActionClientItem; 
begin 
    NewOption := TAction.Create(self); 
    NewOption.ActionList := ActionManager1; 
    NewOption.Caption := Path; 
    NewOption.OnExecute := ProjectHistoryExecute; 
    ActionClient := TActionClientItem(aToolBarFile.ActionClient.Items[0].Items.Add); 
    ActionClient.Action := NewOption; 
    ActionClient.Caption := Path; 
end; 

這工作正常,如果已經存在在列表中的項目,但在所有如果沒有

例如不工作如果我在設計時添加一個項目,然後我可以在運行時

enter image description here enter image description here

添加更多的項目,但如果我不在設計時添加任何東西,世界上沒有下降到顯示的項目列表中,添加項目後不出現下拉菜單。

enter image description here

這並不一定與動作來完成,但菜單系統的其餘部分使用的行爲,我不認爲我可以下添加標準的MenuItems的作用下降。

德爾福2005年

+0

只是一個小小的評論:設置「ActionClient.Caption」是多餘的,當它被設置爲相同的值的行動。 – NGLN

回答

2

的VCL自動創建依賴於項目是否有子元素的類型的按鈕控制。默認情況下(取決於ActionManager的樣式設置),對於包含子項的ActionClientItem,將創建一個TXPStyleDropDownBtn按鈕,對於無子ActionClientItem,將創建TXPStyleButton

因此,在運行時添加第一個子項目時,該按鈕的類型是錯誤的。更改該按鈕的類型將需要銷燬當前按鈕以及全新手動實例化新按鈕。這應該是可能的,但還沒有嘗試過,因爲:

真正最簡單的解決方法是在設計時添加一個子項,愚弄VCL,並刪除表單創建該項目:

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    aToolBarFile.ActionClient.Items[0].Items[0].Free; 
end; 
+1

不是一個壞主意。我會在生產代碼中添加註釋,並將設計時間項目稱爲「佔位符001」或類似的東西。 –

+0

@沃倫是的,這確實需要一些澄清。 – NGLN

0

如果你創建了一個類型爲「context」的actionclient,它不需要改變按鈕類型。相反,當您右鍵單擊該按鈕時,菜單將會下降。

+0

這聽起來像一個不錯的解決方案。請詳細說明如何完全做到這一點。而且由於哪個Delphi版本可以與VCL一起使用? – NGLN

相關問題