How to avoid the “Open IME” popup in a StringGrid?

2019-05-06 19:40发布

问题:

In a StringGrid, sometimes I get the unwanted menu below when I right-click. Is this a Windows popup?

How to I prevent this popup from appearing rather than my own?

I have goAlwaysShowEditor in my Options.

I have set StringGrid.PopupMenu to my popup.

I've set StringGrid.OnMouseDown to show my popup if it's a right click.

回答1:

You can override the virtual CreateEditor method like this way (not a good solution though, I know :-):

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;


回答2:

That is the popup menu found in every Windows EDIT control. Possible the world's most known menu (the only competition comes from the system menu). You want it, because your user's expect it (and need it). When you edit the text in a cell, the TStringGrid control actually creates a standard Windows EDIT control, which is great. And thus you get its popup menu.

In addition, to show your own popup menu (when you are not editing a cell), you don't need to set the OnMouseDown handler. It is enough to set the PopupMenu property. In fact, it is very bad to use the OnMouseDown handler to trigger a popup menu, because then the menu will only be shown when the user right-clicks the control (and not, for instance, when he presses the "context" button on his keyboard).

If you really want your own popup menu to show, even when the user is editing a cell, you really have to give him his usual options for undo, copy, cut, paste, Unicode stuff, etc., manually. Surely you don't want that?



标签: delphi ime