【发布时间】:2014-03-03 06:05:13
【问题描述】:
我有一个弹出菜单,其中有两个收音机项目。
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 中检查发件人是否已被选中?
我认为的另一个解决方案是将 AutoCheck 设为 false 并使用如下所示的 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;
这是一个正确的方法吗?
【问题讨论】:
-
不,您必须像现在这样手动完成。菜单项的行为既不像单选组,也不像具有 AllowAllUp 的工具按钮,您可以将其设置为 False。
标签: delphi