怎样让DBGrid在按住Shift点鼠标的同时能将连续范围的多行选中?

trybird 2000-02-22 05:13:00
我是菜鸟,我怕谁?
各位大虾:大家好!我这菜鸟在此向诸位致敬了!

怎样让DBGrid在按住Shift点鼠标的同时能将连续范围的多行选中?
并响应鼠标右击从弹出菜单点选“删除”项后,删除所选项?

现有一DBGrid构件,其通过DataSource所连的数据集是Mater/Detail式关系表中的Detail表,
其所显示表中字段还包含有Calculated型计算字段和Lookup型查找字段。

大家知道,通过设置DBGrid的dgMultiSelect为true,可以实现按住Ctrl后,再点击鼠标一次一次地
对行进行多选,但现在我想实现象Windows资源管理器那样的功能,即既能按住Ctrl后一次次进行多
选,也能按住Shift后对连续范围进行多选。

然后还想当在选中的DBGrid行上右击鼠标后,会弹出Popup菜单,选择其中的“删除”菜单项就将
刚才多选时所选中行的记录删除掉。我发现DBGrid好象没有响应鼠标右单击的事件,请问怎么办?

回答请最好给出示例程序,谢谢!



...全文
231 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
huiwsey 2000-02-23
  • 打赏
  • 举报
回复
trybird:
问题解决之后,把方案放出来大家共享一下如何,我是不是有点自私呀。哈哈
chenlibo 2000-02-23
  • 打赏
  • 举报
回复
参见例子:

private
Sel : Boolean ;//判断是否处于选择状态
BookMark : TBookMark ;//记录先前的位置

procedure TForm1.DBGrid1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var SelNo:integer ;//记录当前位置
begin
if ( Button = mbLeft ) then
if sel = false then//非选择状态,记录当前位置
begin
BookMark := Table1.GetBookmark ;
Sel := true ;
exit ;
end
else //选择状态
if Shift = [ssShift] then
begin
//遍历所有从先前位置开始到当前位置之间的记录并标记
SelNo := DBGrid1.DataSource.DataSet.RecNo ;
DBGrid1.DataSource.DataSet.DisableControls ;
DBGrid1.DataSource.DataSet.GotoBookmark(BookMark);
DBGrid1.SelectedRows.CurrentRowSelected := true ;

if SelNo<DBGrid1.DataSource.DataSet.RecNo then
while SelNo<DBGrid1.DataSource.DataSet.RecNo do
begin
DBGrid1.SelectedRows.CurrentRowSelected := true ;
DBGrid1.DataSource.DataSet.Prior ;
end
else
while SelNo > DBGrid1.DataSource.DataSet.RecNo do
begin
DBGrid1.SelectedRows.CurrentRowSelected := true ;
DBGrid1.DataSource.DataSet.Next ;
end;
DBGrid1.DataSource.DataSet.EnableControls ;
Sel := false ;
end ;
end;
虽然效果不十分理想,但足以完成要求。
trybird 2000-02-22
  • 打赏
  • 举报
回复
对不起,Lin大侠,刚才离线一段时间:

我的妹儿: trybird@cmmail.com 或 trybird@21cn.com

可能我还真必须不得不头疼地去修改DBGrid的源码!!!

因为还是有其他目标要实现——

主要是——要对表示Lookup查找型字段的DBGrid的Cell单元格能够直接修改
有些我在贴中说明过的情况就不再在此重复了
大家知道,将Lookup字段的ButtonStyle属性设为cbsAuto,就可以在单元格上
出现一个下拉按钮,可以拉出供选取的字段值(如果不是Lookup字段,还可在
Picklist中设置一些供下拉的选值,并且ButtonStyle若为cbsEllipsis将以省略
号按钮代替下拉按钮)。
但是查找字段的Cell是绝对修改不了的,只能通过下拉列表选上去!
可是我们经理下死令了——必须能够键入值,并达到如下的效果:
其实是Access中的效果——
下拉按钮的效用当然要保留,另外还必须能键入字串,
并响应出FindNearest式的查找效果——
具体举例:假如此Lookup字段名为Name,其值来源于另一个表,
首先要能键入值,比如我只键入了try三个字母,会自动从查找的源表找出
相近的值显示在单元格上:trybird,其中bird被抹黑选中,当我接着键入
w字后,又会找出相近的值:tryworm,其orm中被抹黑选中,依此类推,就这样……

唉,菜鸟到死思方尽,虫子成堆累不甘!

另外,要提醒各位大侠的是此贴并非50分,而是双50——100分
因为我在C++ Builder中也挂了一模一样的一贴,
愿象lin一样的热心大侠,一式两份地来响应
只要热心相帮并对俺解决问题有助的大侠,菜鸟都会铭记和感谢的!
得分到是次要,此问题来自实际需求,解决了相信对大家都有会有所助益!
不论什么情况,菜鸟在此都愿将最终的结果无保留地与大家共析!!!
问题尚未解决,同志仍须努力!
Lin 2000-02-22
  • 打赏
  • 举报
回复
得分心切,没看仔细。我觉得比较难。:=(
不过你可以试试在DBGrid得OnMouseMove事件中加入(DBGrid1 as TCustomGrid).MouseCoord(X,Y),其返回的MouseCoord.Y值表示鼠标所在的行,不只有没有用?
Lin 2000-02-22
  • 打赏
  • 举报
回复
得分心切,没看仔细。:=(
Lin 2000-02-22
  • 打赏
  • 举报
回复
Give Me Your email.
trybird 2000-02-22
  • 打赏
  • 举报
回复
还要多谢Lin大侠!!!
不过通过钩子来做是否可行?请给出示例!!!
trybird 2000-02-22
  • 打赏
  • 举报
回复
Lin大侠:可看好了,看仔细了,通过设置DBGrid的dgMultiSelect为true,我早在
贴中讲过,但这种多选只能用按住Ctrl后一次次进行多选.而我的问题是。。。。。。
我虽比较菜,也不至于连常识都不懂!
在一时也很难找到现成控件情况下,我准备修改源码
刚刚把c:\Program files\Borland\CBuilder\Source\Vcl\dbcgrids.pas打出-----
19页A4纸,共1180行-------头疼欲裂------
那位大侠能在从何入手,在何方位努力,应雕琢那段指点一二-------
本菜鸟将感恩不尽!!!
Lin 2000-02-22
  • 打赏
  • 举报
回复
1、设置DBGrid的Options的dgRowSelect和dgMultiSelect为True,在最左列点鼠标就可以选择多列。
2、Hook DBGrid的OnMouseMove和OnMouseDown事件,自己编写一定的代码。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧