delphi cxgrid + PopupMenu 创建智能过虑功能的菜单

先看效果图

test2

设置cxgrid视图的OnMouseDown事件即可实现

procedure TfraModuleCPRK.GridView2MouseDown(Sender: TObject; Button:
    TMouseButton; Shift: TShiftState; X, Y: Integer);
var
    HT: TcxCustomGridHitTest;
begin  //菜单仅在记录内显示
    with TcxGridSite(Sender) do
    begin
        HT := ViewInfo.GetHitTest(X, Y);
        if (HT is TcxGridRecordHitTest) and (数据来源.Text = '近期入库') then
        begin
            //加载P1子菜单
            if p1.Count = 0 then
            begin
                var fq := TFDQuery.Create(nil);
                fq.Connection := Dm.FDConnection1;
                fq.sql.Text :=
                    'select ID,日期区间 FROM DateRange where 启用状态=-1 order by 权重 DESC,ID';
                try
                    fq.Open();
                    if fq.IsEmpty then
                    begin
                        UWPInfoMessage('提示', 'DateRange 未配置,请检查');
                        Exit;
                    end;

                    fq.First;
                    while not fq.Eof do
                    begin
                        var SubMenuItem := TMenuItem.Create(p1);
                        SubMenuItem.Caption := fq.FieldByName('日期区间').AsString; // 设置显示文本
                        SubMenuItem.Tag := fq.FieldByName('ID').AsInteger;  // 存储 ID
                        SubMenuItem.OnClick := P1MenuItemClick; // 设置点击事件
                        p1.Add(SubMenuItem);// 添加到 p1 菜单项

                        // 设置单选组
                        SubMenuItem.RadioItem := True;
                        SubMenuItem.GroupIndex := 1;  // 同一组的索引相同

                        fq.Next;
                    end;
                finally
                    fq.free;
                end;
            end;

             // 确保有焦点行和焦点列
            if (GridView2.Controller.FocusedRowIndex >= 0) and
                (GridView2.Controller.FocusedColumn <> nil) then
            begin
                var ARowIndex := GridView2.Controller.FocusedRecordIndex; // 焦点行索引
                var AColIndex := GridView2.Controller.FocusedColumn.Index; // 焦点列索引

                // 获取单元格的值
                var CellValue := VarToStr(GridView2.DataController.GetValue(ARowIndex,
                        AColIndex));
                p2.Caption := '等于 ' + CellValue;
                p3.Caption := '不等于 ' + CellValue;

                GridView.PopupMenu := PopupMenu2;
            end
            else
                GridView.PopupMenu := nil;
        end;
    end;
end;

菜单的点击事件在这里:

delphi 慎用split - 一曲轻扬 - 博客园 (cnblogs.com)

posted @ 2026-04-30 03:31  一曲轻扬  阅读(28)  评论(0)    收藏  举报