在DBGrid中的右键菜单怎么才能在有文本得到焦点时不把系统自己的剪切复制菜单屏蔽掉? 我在这个右键菜单中有增加删除等操作,但是我希望在文本有焦点时,系统自己的菜单能够弹出来而不是我自己的菜单,而不是只有通过键盘快捷键来操作 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 to myling(阿德) 指文本操作剪切复制粘贴等to Raptor(猛禽) 我不知道怎么判断文本是不是有焦点 自己加不好,太麻烦了,最好是能用系统自己的 if TWinControl.Focused then TWinControl.PopupMenu:=nil; if DBGrid.EditorMode then DBGrid.PopupMenu := NILelse DBGrid.PopupMenu := APopupMenu; 我不清楚什么事件是这两个状态切换的你就在OnMouseUp事件中处理吧 这个问题确实比较棘手,上面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; endend;实现肯定是可以实现的可以需要定义一个自己的OnMouseDown事件,来捕获标的在单元格的OnMouseDown事件,这样再判断一样,如果条件满足, 再PopupMenu.Popup出来,我没有试,你自己试试吧 我已经试验过了procedure TForm1.DBGrid1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);beginif DBGrid1.EditorMode then DBGrid1.PopupMenu := NILelse DBGrid1.PopupMenu := PopupMenu1;end; 惭愧!我走了这么大弯路检讨1.DBGrid的EditorMode跟DataSet的EditModes不同2.不过OnMouseDown确实在单元格中无效,为何OnMouseUp就有效了呢 我最先考虑的也是OnMouseDown。OnMouseDown无效的原因可能是:事件触发顺序:OnMouseDown -》进入编辑状态 -》 OnMouseUp show和showmadal 这样为什么不行? 一个光标出发事件的问题 关于在DELPHI中使用ADO的问题 让人非常无奈的现象 在三层结构(使用socketconnection)中,执行查询语句中总是提示"Invalid variant operation"的错误,第二次执行却可以,请问是何原因? 将选中的字符转化为大写,有什么快捷方式吗? 代码通的过,运行起来出现异常,why?help! 能在DELPHI中使用GIF格式的文件吗? 关于MDI程序的全屏幕问题。 无线数据传输 急!急!急! 我的程序需要自动控制用户使用电脑。
指文本操作剪切复制粘贴等
to Raptor(猛禽)
我不知道怎么判断文本是不是有焦点
自己加不好,太麻烦了,最好是能用系统自己的
TWinControl.PopupMenu:=nil;
DBGrid.PopupMenu := NIL
else
DBGrid.PopupMenu := APopupMenu;
你就在OnMouseUp事件中处理吧
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出来,我没有试,你自己试试吧
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;
检讨
1.DBGrid的EditorMode跟DataSet的EditModes不同
2.不过OnMouseDown确实在单元格中无效,为何OnMouseUp就有效了呢
OnMouseDown无效的原因可能是:
事件触发顺序:OnMouseDown -》进入编辑状态 -》 OnMouseUp