TcxGridPopupMenu控件用来给cxgrid设置右键菜单的.它长这样
属性面板长这样:
默认的系统菜单长这样:
这菜单上面有好几个选项我不想要,怎么办?隐藏它呗!
private { Private declarations } procedure StdHeaderMenuPopup(Sender: TObject); //-------------------------------------- uses cxGridStdPopupMenu; {$R *.dfm} procedure TForm1.cxGridPopupMenu1Popup(ASenderMenu: TComponent; AHitTest: TcxCustomGridHitTest; X, Y: Integer; var AllowPopup: Boolean); begin if ASenderMenu is TcxGridStdHeaderMenu then TcxGridStdHeaderMenu(ASenderMenu).OnPopup := StdHeaderMenuPopup; end; procedure TForm1.StdHeaderMenuPopup(Sender: TObject); var I: Integer; DisabledItems: string; //不想显示的菜单 begin {自带的所有菜单都在这里了,} DisabledItems := 'Sort Ascending' + 'Sort Descending' + 'Clear Sorting' + 'Group By This Field' + 'Group By Box' + 'Footer' + 'Group Footers' ;//+ {下面四个是要显示的,所以注释掉} // 'Remove This Column' + // 'Field Chooser' + // 'Best Fit' + // 'Best Fit (all columns)'; with TcxGridStdHeaderMenu(Sender).Items do for I := 0 to Count - 1 do if AnsiPos( Items[I].Caption,DisabledItems)>0 then begin // Items[I].Enabled := False; //只是禁用,还是会显示出来 Items[I].Visible := False; //不显示 end end;
到这里,我们实现了一个可以让用户自由设置想显示或者隐藏字段的功能:
下面我们来汉化菜单:
我们需要修改一下上面的 代码:
procedure TForm1.StdHeaderMenuPopup(Sender: TObject); var I: Integer; DisabledItems: string; //不想显示的菜单 TempCaption: PChar; begin {自带的所有菜单都在这里了,} DisabledItems := 'Sort Ascending' + 'Sort Descending' + 'Clear Sorting' + 'Group By This Field' + 'Group By Box' + 'Footer' + 'Group Footers'; //+ {下面四个是要显示的,所以注释掉} // 'Remove This Column' + // 'Field Chooser' + // 'Best Fit' + // 'Best Fit (all columns)'; with TcxGridStdHeaderMenu(Sender).Items do for I := 0 to Count - 1 do if AnsiPos(Items[I].Caption, DisabledItems) > 0 then begin // Items[I].Enabled := False; //禁用 Items[I].Visible := False; //不显示 end else // 汉化菜单 begin if Items[I].Caption = 'Remove This Column' then Items[I].Caption := '隐藏此列'; if Items[I].Caption = 'Field Chooser' then Items[I].Caption := '显示列'; if Items[I].Caption = 'Best Fit' then Items[I].Caption :='最佳宽度'; if Items[I].Caption = 'Best Fit (all columns)' then Items[I].Caption :='最佳宽度(所有列)'; end; end
最后我还想在上面自定义一个自己的菜单上去,比如这样:
private { Private declarations } procedure StdHeaderMenuPopup(Sender: TObject); procedure test(Sender: TObject);//test是绑定的点击事件,这个随意发挥就好 uses vcl.Menus; //核心代码就是这面这几行 var TempItem: TMenuItem; TempItem :=TMenuItem.Create(cxGridPopupMenu1); TempItem.Caption:='自定义菜单'; TempItem.OnClick:=test; add(TempItem);
//TempItem.free; //这里有个坑
procedure TForm1.test(Sender: TObject); begin ShowMessage('自定义菜单') ; end;
然后我遇到了一个坑,第一次右击弹出菜单时,自定义菜单显示正常.但是在多次弹出后,就变成了这样:
于是我在新建完成之后 ,马上free,结果它不显示了...
所以上面的代码还是有问题的,需要再次优化一下:
1.创建一个全部变量 IsNew:Boolean,然后在窗体创建前,设置它为True.
Var IsNew :Boolean; procedure TForm1.FormCreate(Sender: TObject); begin IsNew := True; end;
2.在创建前判断IsNew是否为true,如果是则创建菜单,同时把IsNew设置为false,否则略过,到这里运行就正常了!
最后,我还是觉得这个菜单少了点东西...
啊,咱给它左边也上个图标呗,但是,他喵的面板上根本就没有设置图标的属性啊!
不用怕,老样子,还是用TActionList来凑数吧.我这么画,大家应该能看懂吧
然后给自定义的菜单,设置ACtion指令,然后设置个好看的图标.有几个菜单就做几个指令吧,按实际业务来操作即可.
提醒
1,不要忘记了修改一下ac指令的Caption属性,不然弹出来的就是个"Action1"菜单,而不是你设置好的名称:
2.如果你没有给ac指令设置事件,则菜单会变成灰色不可用状态.这个准则适用于所有引用了ac指令的控件!!!
然后上面的绑定事件就要改一下了,要改成ACtion指令了
if isnew then begin TempItem := TMenuItem.Create(self); //TempItem.Caption := '自定义菜单'; //因为设置好的AC指令的Caption,所以这里可注释掉了 // TempItem.OnClick := test; TempItem.Action := Action1; //注意上下两个事件绑定的区别 add(TempItem); isnew := false; end; end;
但是,但是,但是NND,为什么设置好的图标,跟展现出来的图标不一致啊???!!!!!!!!抓狂啊,来个大佬教教我吧
标签:控件,菜单,TcxGridPopupMenu,Sender,Items,delphi,TempItem,Caption,end From: https://www.cnblogs.com/yoooos/p/17421692.html