2014-03-03 38 views
1

我有一個poup菜單,我有兩個無線電項目。TPoupMenu無線電項目uncheched當點擊相同的項目

procedure MySelector.CreatePopup; 
begin 
    FGroupingMenu := TPopupMenu.Create(Self); 
    FGroupingMenu.Name := 'FGroupingMenu'; 
    FGroupingMenu.OnPopup := GroupingMenuItemPopup; 

    FmnuNameGroup := TMenuItem.Create(Self); 
    FmnuNameGroup.Name := 'mnuNameGroup'; 
    FmnuNameGroup.AutoCheck := True; 
    FmnuNameGroup.Caption := '&Name Group'; 
    FmnuNameGroup.RadioItem := True; 
    FmnuNameGroup.OnClick := GroupingMenuItemClick; 
    FGroupingMenu.Items.Add(FmnuNameGroup); 

    FmnuAge := TMenuItem.Create(Self); 
    FmnuAge .Name := 'mnuAge'; 
    FmnuAge .AutoCheck := True; 
    FmnuAge .Caption := '&Age Group'; 
    FmnuAge .RadioItem := True; 
    FmnuAge .OnClick := GroupingMenuItemClick; 
    FGroupingMenu.Items.Add(FmnuAge); 
end; 

而且OnClick事件是

procedure MySelector.GroupingMenuItemClick(Sender: TObject); 
begin 
    if FmnuNameGroup.Checked then 
    grp:= sgName 
    else if FmnuAge .Checked then 
    grp := sgAge 
    else 
    Assert(False, 'MySelector.GroupingMenuItemClick: Unknown MenuItem'); 
end; 

的問題是,如果集團被選中,如果我再次點擊同一項目,OnClick事件被稱爲和名稱組現在成爲選擇,而因爲沒有最初的名字該項目被檢查它正在崩潰。

是否有反正,以防止菜單項取消選中,如果我再次選擇所選項目或有任何方法檢查onclick發件人是否已被選定的項目?

另一種解決方案我認爲是讓自動檢查錯誤,並有OnClick事件處理程序像下面

procedure MySelector.GroupingMenuItemClick(Sender: TObject); 
var 
    mnuItem : TMenuItem; 
begin 

    mnuItem := sender as TMenuItem; 
    if mnuItem.Name = 'mnuNameGroup' then 
    begin 
    grp:= sgName 
    FmnuNameGroup.Checked := true; 
    end 
    else if mnuItem.Name = 'mnuAge' then 
    begin 
    grp := sgAge 
    FmnuAge.Checked := true; 
    end 
    else 
    Assert(False, 'MySelector.GroupingMenuItemClick: Unknown MenuItem'); 
end; 

這是一個正確的做法?

+0

不,你必須像你一樣手動進行。菜單項的行爲不像收音機組,也不像工具按鈕那樣具有可以設置爲False的AllowAllUp。 –

回答

2

我會做如下修改:

  1. 離開AutoCheckFalse
  2. 設置這兩個項目的GroupIndex。例如,爲兩個項目設置GroupIndex1。這使得它們成爲同一組的一部分,並且在任何情況下都可以檢查組中的最多一個組。
  3. 更改OnClick事件處理程序是這樣的:

 

procedure MySelector.GroupingMenuItemClick(Sender: TObject); 
begin 
    (Sender as TMenuItem).Checked := True; 
    // any other logic goes here 
end; 

當你點擊一個項目,它會被檢查,該組的所有其他成員都選中。假設您在顯示菜單之前檢查了其中一個項目,您將始終只有一個已選中的成員。