我有一个扩展的库,允许我们通过ms-automation库测试与Delphi StringGrids的交互。当我调用showContextMenu
方法时,该库有效地调用popup
的{{1}}方法(在TPopupMenu
中)。这是对Vcl.Menus.pas
Window API调用的包装,当从自动化库调用时,调用不会显示任何菜单,当通过应用程序内的按钮调用时,则会显示菜单。
我已经调试了它,它似乎将相同的信息传递给TrackPopupMenu
调用,但没有得到相同的结果。
这让我完全难过。
我无法发布应用程序的代码,但基本上代码看起来就像这样...
TrackPopupMenu
type
TMyGridItem = class(TAutomatedStringGridItem)
protected
procedure SelectCell; override;
public
function ShowContextMenu: HResult; override; stdcall;
function Invoke: HResult; override; stdcall;
end;
implementation
function TMyGridItem.ShowContextMenu: HResult;
var
gridTop, top: Integer;
gridLeft, left: Integer;
cell : IAutomatedStringGridItem;
begin
gridTop := self.top;
gridLeft := self.left;
cell := self.getSelectedCell;
left := (cell as TMyGridItem).CellRect.left -gridLeft + self.parent.left;
top := (cell as TMyGridItem).CellRect.top -gridTop + self.parent.left;
self.MouseDownGeneral(self, mbRight, [], left, top);
result := S_OK;
end;
用数据填充菜单项,然后调用上面提到的弹出菜单。
我使用的自动化库位于DelphiUIAutomation ,为了完全公开,这是我的项目。
这让我很难过,所以有人知道从哪里开始研究为什么2个电话的工作方式不同?
MouseDownGeneral
替换了上面的复杂代码,这也无法按预期工作。