我有一个poup菜单,我有两个收音机项目。
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事件并且现在名称组将被取消选中,因为没有选中该项目,所以它正在崩溃。
如果我再次选择所选项目或者是否有任何方法可以检查是否已经选择了发件人?
是否可以阻止菜单项取消选中我认为另一个解决方案是使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;
这是正确的做法吗?
答案 0 :(得分:2)
我会做出以下更改:
AutoCheck
保留为False
。GroupIndex
。例如,为这两个项目设置GroupIndex
到1
。这使它们成为同一组的一部分,并且在任何情况下都不能检查该组中的一个。OnClick
事件处理程序更改为:
procedure MySelector.GroupingMenuItemClick(Sender: TObject);
begin
(Sender as TMenuItem).Checked := True;
// any other logic goes here
end;
单击某个项目时,将检查该项目,并取消选中该组的所有其他成员。假设您在显示菜单之前选中了其中一个项目,那么您将始终只有一个已检查过的成员。