Delphi 如何避免;“打开输入法”;在StringGrid中弹出?

Delphi 如何避免;“打开输入法”;在StringGrid中弹出?,delphi,ime,Delphi,Ime,在StringGrid中,有时我右键单击时会看到下面不需要的菜单。这是Windows弹出窗口吗 如何防止出现此弹出窗口而不是我自己的弹出窗口 我的选项中有goAlwaysShowEditor 我已将StringGrid.PopupMenu设置为我的弹出菜单 我已将StringGrid.OnMouseDown设置为右键单击时显示弹出菜单。这是每个Windows编辑控件中的弹出菜单。可能是世界上最有名的菜单(唯一的竞争来自系统菜单)。你想要它,因为你的用户期望它(并且需要它)。编辑单元格中的文本时

在StringGrid中,有时我右键单击时会看到下面不需要的菜单。这是Windows弹出窗口吗

如何防止出现此弹出窗口而不是我自己的弹出窗口

我的选项中有goAlwaysShowEditor

我已将StringGrid.PopupMenu设置为我的弹出菜单


我已将StringGrid.OnMouseDown设置为右键单击时显示弹出菜单。

这是每个Windows编辑控件中的弹出菜单。可能是世界上最有名的菜单(唯一的竞争来自系统菜单)。你想要它,因为你的用户期望它(并且需要它)。编辑单元格中的文本时,
TStringGrid
控件实际上创建了一个标准的Windows编辑控件,这非常好。这样你就得到了它的弹出菜单

此外,要显示自己的弹出菜单(当您不编辑单元格时),不需要设置
OnMouseDown
处理程序。设置
弹出菜单
属性就足够了。事实上,使用
OnMouseDown
处理程序触发弹出菜单是非常糟糕的,因为只有当用户右键单击控件时(例如,当用户按下键盘上的“上下文”按钮时),才会显示菜单


如果你真的想显示自己的弹出菜单,即使用户正在编辑一个单元格,你也必须手动为他提供撤销、复制、剪切、粘贴、Unicode等常用选项。你肯定不想这样做吗?

你可以像这样覆盖虚拟
CreateEditor
方法(虽然不是一个好的解决方案,我知道:-):


你想伤害你的用户吗?为什么他们不应该打开IME?@David Hefferman:“为什么他们不应该打开IME?”因为我想在用户位于该网格中时向右键单击菜单添加其他菜单选项。我最终从Excel的弹出窗口中得到了提示,该窗口只有剪切、复制、粘贴功能,但没有Unicode功能。+1感谢您的提醒。我非常习惯于Ctrl-C、Ctrl-X、Ctrl-V,以至于我完全忘记了许多用户所期望的复制、剪切、粘贴功能。而且,感谢您指出我不需要OnMouseDown弹出窗口就可以工作。TLama:这种方法的一个问题是:如果我的程序更改了列(即StringGrid.Col:=2;),InplaceEditor将不会打开,并且I-bar不可见。有什么建议吗?无论您在哪里尝试编辑单元格,这都应该有效。我已经更新了帖子,以尊重继承(无论如何应该有什么)。现在唯一的缺点(来自两行代码:-)是
TInplaceEdit
类类型转换,因为它取决于
TInplaceEdit
继承的类型。在Delphi 2009中,它来自
TCustomMaskEdit
,因为发布
PopupMenu
属性的最近的类后代是
TMaskEdit
,这就是为什么它是按原样进行类型转换的原因。对于将来可能遇到这种情况的任何人:我正在从不同的形式更改当前列。我已经将焦点更改为带有StringGrid的表单,以及StringGrid控件本身。但是,出于某种原因,我发现我还必须在StringGrid.InplaceEditor.SetFocus中添加一条线。现在可以了。再次感谢你,特拉玛。我真的很感谢你的帮助。
type
  TStringGrid = class(Grids.TStringGrid)
  protected
    function CreateEditor: TInplaceEdit; override;
  end;

implementation

function TStringGrid.CreateEditor: TInplaceEdit;
begin
  Result := inherited CreateEditor;
  TMaskEdit(Result).PopupMenu := Form1.PopupMenu1;
end;