我在这个右键菜单中有增加删除等操作,但是我希望在文本有焦点时,系统自己的菜单能够弹出来而不是我自己的菜单,而不是只有通过键盘快捷键来操作

解决方案 »

  1.   

    to  myling(阿德) 
      指文本操作剪切复制粘贴等
    to  Raptor(猛禽) 
      我不知道怎么判断文本是不是有焦点
      自己加不好,太麻烦了,最好是能用系统自己的
      

  2.   

    if TWinControl.Focused then
        TWinControl.PopupMenu:=nil;
      

  3.   

    if DBGrid.EditorMode then
      DBGrid.PopupMenu := NIL
    else
      DBGrid.PopupMenu := APopupMenu;
      

  4.   

    我不清楚什么事件是这两个状态切换的
    你就在OnMouseUp事件中处理吧
      

  5.   

    这个问题确实比较棘手,上面l_xiaofeng(流水不腐) 与 windindance(风舞轻扬) 的方法可能都不行,因为是DBGrid中的文本,首先文本得到焦点并不是说一定是处于编辑模式,不处于编辑模式文本同样也可以有选择焦点,并且OnMouseDown与OnMouseUp在单元格中是无效的,它们只在单元格以外区域有效,我试着继承一个DBGrid公布InplaceEditor来做
      TDBGrid1 = class(TDBGrid)
      private
        { Private declarations }
      protected
        { Protected declarations }
      public
        property InplaceEditor;
      published
      end;
    ---------------------------------------------------------------------
    但是因为MouseDown的问题也是比较麻烦, 只有在Popup事件中写,但这样还是不行,因为
    DBGrid中的PopupMenu已经设置了,会导致系统本身的菜单无效
    procedure TForm1.PopupMenu1Popup(Sender: TObject);
    begin
      if (DBGrid11.InplaceEditor <> nil)
          and (DBGrid11.InplaceEditor.Focused)
          and (DBGrid11.InplaceEditor.SelLength > 0) then
      begin
        Abort;
      end
    end;
    实现肯定是可以实现的可以需要定义一个自己的OnMouseDown事件,来捕获标的在单元格的OnMouseDown事件,这样再判断一样,如果条件满足, 再PopupMenu.Popup出来,我没有试,你自己试试吧
      

  6.   

    我已经试验过了
    procedure TForm1.DBGrid1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
    if DBGrid1.EditorMode then
      DBGrid1.PopupMenu := NIL
    else
      DBGrid1.PopupMenu := PopupMenu1;
    end;
      

  7.   

    惭愧!我走了这么大弯路
    检讨
    1.DBGrid的EditorMode跟DataSet的EditModes不同
    2.不过OnMouseDown确实在单元格中无效,为何OnMouseUp就有效了呢
      

  8.   

    我最先考虑的也是OnMouseDown。
    OnMouseDown无效的原因可能是:
    事件触发顺序:OnMouseDown -》进入编辑状态 -》 OnMouseUp