4
votes

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

popup screen capture

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.

2
Are you trying to hurt your users? Why shouldn't they open IME? - David Heffernan
@David Hefferman: "Why shouldn't they open IME?" Because I want to add additional menu options to the right-click menu when the user is in this grid. I ended up taking my cue from Excel's pop-up, which has only Cut, Copy, Paste but not the Unicode stuff. - RobertFrank

2 Answers

8
votes

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;
7
votes

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?