delphi TcxGridPopupMenu控件学习笔记

发布时间 2023-05-22 22:14:47作者: 一曲轻扬

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,为什么设置好的图标,跟展现出来的图标不一致啊???!!!!!!!!抓狂啊,来个大佬教教我吧