【发布时间】:2015-05-07 08:00:39
【问题描述】:
我正在使用this answer 在标准窗口“剪切/复制/粘贴”上下文菜单上强制使用我自己的TPopupMenu。问题是我不知道如何布置 OO 结构以允许这样做。
unit BaseRamEditor.pas
type
{ This will override the default TStringGrid. }
TStringGrid = class(Grids.TStringGrid)
protected
function CreateEditor: TInplaceEdit; override;
end;
TfrmBaseRamEditor = class(TForm)
sgrSync: TStringGrid;
RamEdPopup: TPopupMenu;
procedure MenuItem1Click(Sender: TObject);
implementation
{$R *.dfm}
function TStringGrid.CreateEditor: TInplaceEdit;
{ Use our TPopupMenu instead of Windows default. }
begin
Result := inherited CreateEditor;
// XXX: I don't know how to reference the `RamEdPopup` object that belongs to
// `TfrmBaseRamEditor`. I can't reference the `TfrmBaseRamEditor` instance
// because it hasn't been created yet because it depends on THIS new
// `TStringGrid`.
TMaskEdit(Result).PopupMenu := RamEdPopup;
end;
这是在BaseRamEditor.dfm 中定义的RamEdPopup。请注意,OnClick 引用了TfrmBaseRamEditor 的方法:
BaseRamEditor.dfm
=================
object frmBaseRamEditor: TfrmBaseRamEditor
object RamEdPopup: TPopupMenu
object MenuItem1: TMenuItem
Caption = 'Diagramm 1'
OnClick = MenuItem1Click
end
end
end
所以概述是:
-
TfrmBaseRamEditor构造函数依赖于被覆盖的TStringGrid - 这个
TStringGrid构造函数依赖于TfrmBaseRamEditor的TPopupMenu。 - 这个
TPopupMenu指向TfrmBaseRamEditor的方法。
我怎样才能解开这个混乱,以便frmBaseRamEditor 中使用的TStringGrid 使用TPopupMenu?
【问题讨论】:
-
你的事情过于复杂了。 TStringGrid 有一个可以使用的 PopupMenu 属性。
-
@Peter 我知道它有,但我必须使用链接答案的方法,因为如果我只设置
TStringGrid.PopupMenu然后在单元格内左键单击以编辑一些文本,然后右键单击:上下文菜单将是标准的 Windows 不是我自己的TPopupMenu。我的TPopupMenu只会在我取消选择单元格(即单击其他位置)然后右键单击该单元格时显示。 -
TMaskEdit(Result).PopupMenu := TfrmBaseRamEditor(Self.Owner).RamEdPopup;工作吗? -
@LURD 哇,是的。我不知道你可以做这样的参考;这太酷了!非常感谢您帮助我
-
您说构造函数相互依赖,但您的代码中没有显示任何构造函数。我了解表单的构造函数如何依赖网格(因为表单加载 DFM 并创建其子项,从而构建网格控件),但我不知道网格的构造函数将如何依赖表单。
标签: delphi delphi-xe2