我已经编写了代码将自定义 PopUpMenu 分配给 DBGrid 组件。这些更改已在 dfm 文件中完成:
object myGrid: TDBGrid
..................
PopupMenu = myPopUp
..................
end
object myPopUp: TPopupMenu
Left = 528
Top = 176
object mnuFillDown: TMenuItem
Action = actionFillDown
end
end
object actionFillDown: TAction
Caption = 'Fill Down'
ShortCut = 16453
OnExecute = actionFillDownExecute
end
但不知何故,显示的菜单是默认上下文菜单,而不是我的自定义菜单。我应该如何关闭默认上下文菜单并使用自定义菜单?
让 DBGrid 显示弹出菜单的关键因素是将 DBGrids
PopupMenu
属性设置为弹出菜单。看来您是基于 完成此操作的
object myGrid: TDBGrid
..................
PopupMenu = myPopUp
..................
end
虽然缩进不正确。由于它仍然没有弹出,请验证设置是否正确。看下面我的例子,赋值是如何相对于 TDBGrid 对象缩进的。
这似乎是您的错误(假设
actionFillDownExecute
是 OnExecute
的 TAction actionFillDown
事件处理程序):
object myPopUp: TPopupMenu
Left = 528
Top = 176
object mnuFillDown: TMenuItem
Action = actionFillDownExecute
end
end
您无法将事件处理程序分配给需要
TMenuItem.Action
(或后代)的 TAction
属性。以上无法编译!
相反,您应该将
TAction
actionFillDown
分配给菜单项 Action
属性,并将 actionFillDownExecute
过程分配给操作的 OnExecute 事件。
这是测试项目的.dfm:
object Form1: TForm1
Left = 313
Top = 142
Width = 393
Height = 177
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object DBGrid1: TDBGrid
Left = 8
Top = 8
Width = 320
Height = 120
PopupMenu = myPopup
TabOrder = 0
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = 'MS Sans Serif'
TitleFont.Style = []
end
object myPopup: TPopupMenu
Left = 336
Top = 56
object FillDown1: TMenuItem
Action = actFillDown
end
end
object ActionList1: TActionList
Left = 336
Top = 24
object actFillDown: TAction
Caption = 'Fill Down'
OnExecute = actFillDownExecute
end
end
end
还有菜单图片:
我在Delphi XE4中也遇到了同样的问题。发现如果在将 PopUpComponent 分配给 TDBGrid 之前将 OnDblClick 事件分配给它,就会发生这种情况。解决方案:删除对OnDblClick的引用,运行程序,添加对OnDblClick的引用。 很奇怪,但它对我有用。