首页 > 其他分享 >delphi TcxGridPopupMenu控件学习笔记

delphi TcxGridPopupMenu控件学习笔记

时间:2023-05-22 22:24:05浏览次数:44  
标签:控件 菜单 TcxGridPopupMenu Sender Items delphi TempItem Caption end

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

相关文章

  • DateTimePicker如何与Delphi自带Style同步
    原文出处:DateTimePicker如何与Delphi自带Style同步-封三郎-博客园(cnblogs.com)Delphi的DateTimePicker组件有一个CalColors属性,可以设置DropDown打开的日历节目的风格。但如果不使用Delphi自带的Style,在这里设置属性看不到期望的效果。而使用了delphi自带的st......
  • Flutter一天一控件之ListTile
    ListTile简介Flutter中的ListTile控件是一种常用的列表项控件,它可以用于显示列表中的每一个项,通常包含标题、副标题、图标等内容。ListTile控件的外观和行为类似于Android中的ListView中的列表项。一个简单的ListTile示例:ListTile(leading:Icon(Icons.person),//左侧图标......
  • 使UIScrollView的子控件在scrolling的过程中,子控件不滚动(固定在某个位置)
    使UIScrollView的子控件在scrolling的过程中,子控件不滚动(固定在某个位置)受本篇问答的启发http://stackoverflow.com/questions/11272847/make-uiview-in-uiscrollview-stick-to-the-top-when-scrolled-up修改代码如下注意:使UIScrollView的子控件self.letter在scrolling的过程中,子......
  • StackOverView又一个Android 5.0 任务管理器控件。这次这个比上次那个(MaterialRecents
    StackOverView视图布局(ViewLayout)★★★★★2015-09-2120:21147kbAndroidStudio1075次165次https://github.com/Bossyao168/StackOverView卡片,任务下载 收藏 Bossyao168 / StackOverViewacustomwidgetofandroid,liketaskmanagerofandr......
  • delphi cxGrid做一个空白的出/入库单
    效果图: 实现的原理:1.在数据库建一个表,然后绑定到cxgrid上面.数据表各字段的数据类型,按你的业务需求来设置,同时要允许空值,因为我们必须让它们保持空值,这样在绑定到cxgrid时,才会是空白的,然后再弄个自增的主键ID.下面这张图是我研究时截的图,不想改了,凑合着用吧2.绑......
  • 【记录一下】修正lazarus fr报表控件在龙芯电脑不能使用QRcode的Bug
    近日海南朋友使用fr控件时发现不能在报表插入QRCode和PDF417等二维码,经跟踪发现只需将frxBarcodePDF417.pas第1592行将A:=TInt(ERROR_LEVEL[errorLevel]);改为:A:=@(ERROR_LEVEL[errorLevel]);就可以正常插入QRCode等二维码了,如果你使用过程也遇到同样问题可参考一下......
  • delphi cxgrid截图
    效果图: 点击GetImage,会在程序目录下生成一个表格截图的图片文件,打开后如下图:以下是代码:procedureTForm4.SpeedButton1Click(Sender:TObject);vargridView:TcxGridDBTableView;focusedItem:TcxCustomGridTableItem;focusedRect:TRect;aBitmap:TBitm......
  • DCC32命令行方式编译delphi工程源码
    本文链接地址:http://blog.csdn.net/sushengmiyan/article/details/10284879作者:苏生米沿 一、首先找到这个可执行文件,熟悉delphi的人应该很容易就找到,打开你安装delphi的目录,如我的路径C:\ProgramFiles\Delphi_2007\bin\DCC32.EXE二、拷贝一份出来,我将其放在了我的测试目录下......
  • 报表控件FastReport VCL v2023.2 - 将Delphi 产品整合到单一系统
    FastReport 是功能齐全的报表控件,可以帮助开发者可以快速并高效地为.NET,VCL,COM,ActiveX应用程序添加报表支持,由于其独特的编程原则,现在已经成为了Delphi平台最优秀的报表控件,支持将编程开发中的报表信息输出为TXT、PDF等多种文件格式,是编程开发人员必备的报表工具。FastReportVC......
  • 界面控件DevExpress Blazor UI v22.2 - 报表、富文本编辑器组件增强
    DevExpress拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpressDashboardeXpressApp框架、适用于VisualStudio的CodeRush等一系列辅助工具,该组件拥有众多新产品和数十个具有高影响力的功能,可为桌面、Web和移动应用提供直观的解决方案,全面解决各种使用场......