C++ Builder BCB 中如何实现DBGRID用鼠标拖动多选?

dfpgb 2009-06-17 05:58:04
C++ Builder BCB 中如何实现DBGrid用鼠标拖动多选?
就是说用鼠标划个框,选中一部分记录,
能在已经选中的一部分记录中再用鼠标画个框把框中的记录再反选就更好了,
不然按住shift或者ctrl可以选择多个段落也可以.

给个思路就好.


目前我正在试验OnColEnter事件,可是很奇怪,DBGrid的第一列不会触发这个事件,而其它的列就可以,怎么回事情呢?
...全文
370 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
hansyswin 2009-06-30
  • 打赏
  • 举报
回复
ding
yefu2000 2009-06-29
  • 打赏
  • 举报
回复
问题解决了,你就结贴呗。。。
dfpgb 2009-06-29
  • 打赏
  • 举报
回复
结帖~?
dfpgb 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 wg961423 的回复:]
行高?行号?

TGridCoord p=DBG->MouseCoord(X,Y);
p.X 列号
p.Y 行号

可以参考我之前的问题帖子:http://topic.csdn.net/u/20090603/13/825f172b-d2e1-4276-821a-78931d3d154a.html
[/Quote]
我是问行高拉,因为我以为是要自己计算现在鼠标在第几行拉,哈哈,不知道有这么个函数啊,谢谢你哦!

[Quote=引用 20 楼 mypop2006 的回复:]
我来学习的 不知道什么串口控件好用呢?
[/Quote]
MSCOMM.....
mypop2006 2009-06-24
  • 打赏
  • 举报
回复
我来学习的 不知道什么串口控件好用呢?
wg961423 2009-06-23
  • 打赏
  • 举报
回复
晕,找到一个画框的方法。
TPoint P = Mouse->CursorPos;
if(NEWX==-1||NEWY==-1)
{
NEWX=p.X;
NEWY=p.Y;
MyX=P.x;
MyY=P.y;
}
HDC hDC = GetDC(0);
Canvas->Handle = hDC;
Canvas->Brush->Style = bsClear;
Canvas->Pen->Color = clBlue;
DBG->Repaint();
Canvas->Rectangle(MyX,MyY,P.x,P.y);
wg961423 2009-06-23
  • 打赏
  • 举报
回复
对了,有没有人知道怎么画线框啊?就像Windows的桌面的空白处,按下鼠标左键或右键不松,移动鼠标后出现的那种框?
wg961423 2009-06-23
  • 打赏
  • 举报
回复
行高?行号?

TGridCoord p=DBG->MouseCoord(X,Y);
p.X 列号
p.Y 行号

可以参考我之前的问题帖子:http://topic.csdn.net/u/20090603/13/825f172b-d2e1-4276-821a-78931d3d154a.html
dfpgb 2009-06-23
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wg961423 的回复:]
唉,我也要用到这个功能了,不过我只是要把选中的单元格的内容放到剪贴板上就行了。

我的方法:
1、在DBGrid的MouseMove里记录右键按下起始位置(我的左键已经有其他用处了),这个时候,DataSet也自动会到这一行;
2、在DBGrid的MouseUP里记录右键松开位置,并弹出POP菜单(选择复制所选单元格还是所选整行);
3、把DataSet复制一份到新的DataSet1,并把DataSet1的当前位置设定与DataSet一样;
4、根据记录的起始和终…
[/Quote]
唉~我现在都已经要放弃准备用第三方控件了....ehlib的dbgrideh好像很强.....

不过你根据鼠标的点怎么确定选择的记录的呢?
我一开始也想过,可是我没发现怎么获得dbgrid的行高,汗...!
wg961423 2009-06-22
  • 打赏
  • 举报
回复
唉,我也要用到这个功能了,不过我只是要把选中的单元格的内容放到剪贴板上就行了。

我的方法:
1、在DBGrid的MouseMove里记录右键按下起始位置(我的左键已经有其他用处了),这个时候,DataSet也自动会到这一行;
2、在DBGrid的MouseUP里记录右键松开位置,并弹出POP菜单(选择复制所选单元格还是所选整行);
3、把DataSet复制一份到新的DataSet1,并把DataSet1的当前位置设定与DataSet一样;
4、根据记录的起始和终止,从DataSet1中把要的数据一一取出来,并放入剪贴板。
dfpgb 2009-06-20
  • 打赏
  • 举报
回复
发现TStringGrid可以实现这种功能,可是怎么让TDBGrid也可以呢?
luoshupeng 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fairchild811 的回复:]
Object Inspector里面点开options选项,里面的dgMultiSelect置为true



DBGrid1->Options = DBGrid1->Options < < dgMultiSelect;
[/Quote]!!!!!!!!!!!!
dfpgb 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 luoshupeng 的回复:]
引用 4 楼 fairchild811 的回复:
Object Inspector里面点开options选项,里面的dgMultiSelect置为true



DBGrid1->Options = DBGrid1->Options < < dgMultiSelect;

!!!!!!!!!!!!
[/Quote]

这样不行....这样只能按住CTRL一条一条一条一条一条一条一条一条一条一条一条一条一条一条一条一条一条的选....不能区域选......更不能多区域选.......
dfpgb 2009-06-18
  • 打赏
  • 举报
回复
zl198183兄谢了,可以实现,不过界面会晃动(应该是GotoBookmark造成的),速度也有一点慢(应该是移动当前数据指针造成的),看看有没有更好的方法呢?


不过根据这个方法应该可以找到更好的写法,试验中
zl198183 2009-06-18
  • 打赏
  • 举报
回复
可以使用BookMark

void __fastcall Form::DBGridMouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y,TADOQuery *ADOQuery,TDBGrid *DBGrid)
{
if( Button == mbLeft )
{

if(blSelect == false)
{
BookMark = ADOQuery->GetBookmark();
OldNo = ADOQuery->RecNo;
blSelect = true;
return;
}
else
{
if(Shift.Contains(ssShift))
{
CurrNo = ADOQuery->RecNo;
ADOQuery->DisableControls();
ADOQuery->GotoBookmark(BookMark);
DBGrid->SelectedRows->CurrentRowSelected=true;
if(CurrNo > OldNo)
{
while(CurrNo > ADOQuery->RecNo)
{
DBGrid->SelectedRows->CurrentRowSelected=true;
ADOQuery->Next();
}
}
else
{
while(CurrNo < ADOQuery->RecNo)
{
DBGrid->SelectedRows->CurrentRowSelected=true;
ADOQuery->Prior();
}

}

ADOQuery->EnableControls();
ADOQuery->FreeBookmark(BookMark) ;
blSelect= false;
CurrNo = 0;
OldNo = 0;
}//end of if
else
{
BookMark = ADOQuery->GetBookmark();
OldNo = ADOQuery->RecNo;
blSelect = true;

}
}

}
}
yangangs 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dfpgb 的回复:]
dgMultiSelect这个属性只可以用ctrl一条一条一条一条的选择
[/Quote]
那按住shife也不行吗?
dfpgb 2009-06-18
  • 打赏
  • 举报
回复
dgMultiSelect这个属性只可以用ctrl一条一条一条一条的选择
fairchild811 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 dfpgb 的回复:]
zl198183兄谢了,可以实现,不过界面会晃动(应该是GotoBookmark造成的),速度也有一点慢(应该是移动当前数据指针造成的),看看有没有更好的方法呢?


不过根据这个方法应该可以找到更好的写法,试验中
[/Quote]

晃动是什么意思,刷新吗?form的doublebuffered = true;
wg961423 2009-06-17
  • 打赏
  • 举报
回复
记录鼠标按下去和松开时候记录所在单元格的座标,并把经过的记录选中,应该可以这么做的。
fairchild811 2009-06-17
  • 打赏
  • 举报
回复
然后和windows一样,shift,ctrl就可以了
加载更多回复(3)
Report Machine 2.4 =================== 这是一个报表控件包,For Borland Delphi Versions 3,4,5,6.100% 源码. 最后更新日期:2002.05.25. 目录 ----- 说明 特点 最后更新 历史 安装 Demo程序 版权说明 注册 说明 ---- Report Machine是一个报表控件包, Report Machine is reporting tool component. It consists of report engine,designer and preview. Its capabilities comparable with in QuickReport,ReportBuilder. It written on 100% Object Pascal and can be installed in Delphi 2/3/4/5/6 and C++Builder 1/3/4/5/6. 特点 ---- 复杂的报表?在report machine面前,还会有什么复杂的报表存在吗? 不,不会有的,因为这是一个功能强大,完全自动化、完全自由设计的报表控件。 对于一般的主从表,单表,你甚至只需要点动鼠标次数=你的数据字段个数就可以 完成一个完全自定义的,并且支持用户进行格式修改加工,重新设计格式的报表! 想想fast report 吧,report machine会fast report会的,还会它不会的! 这是一个完全文化报表控件,支持delphi3到delphi6,BCB3到BCB6。 它的最大优点就是:强大与自由! report machine目前主要能做的: 一、支持屏幕打印,控制方法多样,可以打印全部rxlib控件 全部InfoPower控件,TDBGrid,TStringGrid,TImage,TEdit等,TDBGridEh,f1book, TDecisionGrid等等众多控件。 二、支持最终用户设计、修改报表,只需连接相关的数据源,指出数据的位 置(设置报表样式),无论是主从表,子报表,套表,都可迅速生成。开发 一个报表只需几分钟的时间。 三、报表样式可以保存为rmf格式,下次可通过读入使用(配合SQL脚本就可以生成 报表)。并可以把带数据的报表保存为rmp格式,在任何机器上都可以浏览、打印, 而不需要数据库。 四、生成后的报表支持修改,包括字体的设置,边框的设置,修改内容等。 五、报表编辑器内自带ado,bde,ibx,Diamond dao,dbisam等数据访问控件,可以 通过这些控件开发独立的报表制作工具。其使用方法和delphi的控件是一样的。 六、完全、自由自定义页面、边距、字体,标题和页眉页脚,并可以在自认合适的 地方插入函数来实现当前日期,页合计,总合计等功能,合计字段可以放在页头,分 组头,并支持条件合计,对分组合计,分页合计,总计等只需简单地设置属性即可。 七、完全支持d3--d6,c3--c6。 八、报表可以在自认合适的事件(on beforeprint,on afterprint等)加入程 序脚本,以控制、或实现更复杂的打印效果。 九、更新迅速,可根据使用人员与用户的意见,不断的加入新的功能。 十、首家支持缩放打印功能,可以根据打印时选择的纸张自动缩放报表。 十一、多种格式转换,可以把做出的报表转换为html,xml,bmp,jpeg等等格式。 十二、自动对超长记录折行,超长的内容也会自动折行。 十三、最新增加GridView,类似于电子表格,非常非常适合制作复杂报表 最新更新和问题解答请访问论坛:www.pcjingning.com 最后更新 -------- 新版本:2002/05/25更新,欢迎下载(有免费版下载) --FormReport可以打印ListView --TRMReport增加DefaultDictionaryFile属性,可以设置默认数据字典 v.2.2(Build 2002/01/28) - 完善缩放打印功能 - TRMCrossView去掉一些BUG v.2.2(Build 2002/01/11) - 增加缩放打印功能, - TRMFormReport打印StringGrid,DBGridGrid时,对超宽Grid增加分页功能, - MemoView增加属性CalcValue,可以访问MemoView的内容, - CalcMemoView增加TotalCalc属性,现在CalcMemoView科轻松实现页小计,页累计, 页总计,并且可以放在页头,栏目头,分组头,数据头。 v.2.2(Build 2001/12/10) - 修正一些BUG, - 增加了导出到BMP,GIF,JPEG文件功能, - Designer增加最近打开文件功能, - 添加字段的时候可以选择不要在字段名前附加表名。 v.2.1(Build 2001/11/29) - 修正了几个BUG. v.2.1(Build 2001/11/22) - 修正了几个BUG. - 增加多语言功能. v.2.1(Build 2001/11/15) - 修正了几个BUG. v.2.1(Build 2001/11/12) - TRMBandView增加属性LinesPerPage,可以设置每页打印记录数, - TRMBandView增加属性PrintColFirst,当Column>;1时,可以选择先列后行还是 先行后列打印, - 修正没有安装打印机时的错误, - 打印预览功能有些改变和增强. v.2.1(Build 2001/11/07) - EHLib可以打印Footer了, - TRMFormReport增加分组功能, - TRMCalcMemoView可以放在GroupHeader上了, - TRMCalcMemoView增加Filter属性,之计算满足条件的纪录, - 其他一些细节上的改变. v.2.1(Build 2001/11/01) - TRMFormReport增加了数据对齐方式,数据显示格式. v.2.1(Build 2001/10/30) - 修正预览时,页面设置的错误. v.2.1(Build 2001/10/25) - TRMFormReport可以打印Rx,InfowPower全系列控件, - TRMFormReport可以打印EHLib, - 可以打印多个PageFooter,方便制作页小计. v.2.1(Build 2001/10/18) - 大大增强了TRMFormReport功能,可以与ScreenReport, Dev ExpressPrinting System媲美; - TRMFormReport增加了表格的自动缩放功能.可根据纸张的大小自动进行水平或 垂直方向的表格缩放.也就是说程序员不必再为迁就打印宽度和高度而反复调 整屏幕格式和字体大小,而且对于屏幕上带横向滚动杆的任意超宽表格都可以 缩放到指定大小的纸上.再也不用考虑打印超出纸张的问题了,也不会为迁就 打印而影响屏幕格式的美观而感到遗憾!使得表格打印更直接更方便,最大程 度地减少您的工作量; - TRMFormReport增加一个事件OnPrintObject,在这个事件内程序员可自行编制 TRMFormReport不直接支持打印的任意控件;; - 请注意:TRMDBGridReport,TRMwwDBGridReport等已不再维护,因为TRMFormReport 具有以上几个GridReport的所有功能,并且更强. v.2.1(Build 2001/10/08) - 改掉了几个BUG;; - 增加TRMAngledLabel,可以打印倾斜角度的文字;; - TRMGridReport,TRMFormReport等做了一些改进. v.2.1(Build 2001/09/25) - 改掉了几个BUG;; - 背景图片增加Top,Left属性;; - TRMPictureView增加支持GIF格式图片. v.2.1(Build 2001/09/21) - 增加TRMStringGridReport,直接打印TStringGrid,TDrawGrid等继承自TCustomGridGrid;; - 增加TRMDecisionGridReport,直接打印TDecisitonGrid;; - 增加背景图片功能,可以实现套打. v.2.1(Build 2001/09/17) - 修正TRMOLEView只能缩放显示的错误,现在可以按实际大小,居等显示. - 增加TRXWWRichView,可以打印InfowPowwer的TwwDBRichView. v.2.1(Build 2001/09/14) - 修正TRMRxRichView插入字段的错误. v2.1 - 改掉一些BUG - 增加属性PrintFrame,PrintVisible,可以实现套打;; - 报表增加选项(布缩放边框宽度),可以防止表格线变粗;; - Printer单元作了大量修改,Windows2000下支持自定义纸张. v1.1 - 对DataManger作了大量修改,现支持各种数据存取控件(直接支持BDE,ADO,IBX,Diamond);; - 增加Query Designer;; - 增加Report Explorer. v1.0 Preview 4 - Bug fixes;; - Added RX DateEdit control to the Dialog controls;; - Added possibility to excluding particular dataset or entire datamodule from all db-related lists (see TfrDataDictionary.DisabledDatasets and code of main demo);; - Added OnBeforePrint property to the report page (see Object Inspector) and OnActivate event to the dialog form;; - Now you can tune export options in the export components (TfrTextExport and etc);; - TRMFormReport做了修改,可以增加TRMFormReport不支持的控件;; - 其它功能增强或修改. v1.0 Preview 3. - Bug fixes;; - Added Data dictionary;; - Some changes in interface;; - 增加Auto Append Blank - TGridReport(TwwGridReport)改进,支持颜色,对齐方式.下一版本将支持分组,合计功能. - 下一版本将增加一个组件TFormReport,直接打印Form,类似于Screen Report. v1.0 Preview 2. - Fixed old bugs, added new;; - 一些性能改善; - 对备注内容处理更完善;; - Added mouse wheel support in designer and preview (D4 and above);; - Object Inspector now looks like Delphi OI;; - Added expression builder;; - More options for ";Text"; object: line and char spacing, top and left gaps, ";Suppress repeated values"; option;; (可是设置行距,字距) - Now you can turn off variable processing in the ";Text"; and ";RichText"; objects. See ";Text only"; option of these objects;; - Added TRMReport.OnObjectClick event. This event fires when user clicks on any object when previewing report;; - Added new Child band;; - Improved export filters (frames export in TXT, tables in RTF, pictures in HTML);; added more export options;; - Added paper bins support;; - Added component for printing table;; - Added ";Columns"; property for data-bands. See last report in the demo;; - Code changed: TfrReport.OnEnterRect now called OnBeforePrint;; - Added TRMDesigner.OnLoadReport, OnSaveReport and CloseQuery properties. 历史记录 -------- 2001.08.30 Report Machine 2.1 2000.05.10 Report Machine 1.1 2000.03.17 Report Machine 1.0正式版 2000.02.21 Report Machine 1.0 Preview 3. 2000.02.12 Report Machine 1.0 Preview 2. 2000.01.25 Report Machine 1.0 Preview 1. Report Machine的第一版. 安装 ----- 1.如果没有安装RxLib 2.60及以上版本,请打开RM.INC文件, 将";{$DEFINE RX}";改为";{$DEFINE RX}"; 2.如果没有安装InfoPower及以上版本,请打开RM.INC文件, 将";{$DEFINE InfoPower}";改为";{$DEFINE InfoPower}"; 3.Delphi 6.X 从Delphi IDE卸载以前的Report Machine版本。 打开菜单";FileOpen...";打开DclRMachine6.DPK,选择";Install"; 4.Delphi 5.X 从Delphi IDE卸载以前的Report Machine版本。 打开菜单";FileOpen...";打开DclRMachine5.DPK,选择";Install"; 5.Delphi 4.X 从Delphi IDE卸载以前的Report Machine版本。 打开所有的DFM文件,选择保存。(因为我是在Delphi 5.0完成的,DFM文件 与4.X有些不兼容) 打开菜单";FileOpen...";打开DclRMachine4.DPK,选择";Install"; 6.Delphi 4.X 从Delphi IDE卸载以前的Report Machine版本。 打开所有的DFM文件,选择保存。(因为我是在Delphi 5.0完成的,DFM文件 与3.X有些不兼容) 打开菜单";FileOpen...";打开DclRMachine3.DPK,选择";Install"; Demo程序 --------- Report Machine包含一些例子,这是学习使用Report Machine的最快途径。 http://rmachine.8u8.com/download/demos.rar 需要用BDE Administrator建立一个Database Alias: 名称: RMachineDemo Path: 版权说明 ---------- Report Machine可免费应用于非商业应用,如果应用于商业用途,请与作者联系。 付费 ------------------ Report Machine是共享控件,如果你做了东西,赚到了money,并且认为Report Machine还不错,请赞助我, 以便作者有动力开发出更好的产品,如果只是拿来玩玩,不需注册. 参考价格:(这只是参考价格,多少你看着办) 个人:40元人民币 公司:200元人民币 现在提供下载的是免费版本,这是个免费版,与标准版相比少了一些控件,包含源码。 网上付费:http://rmachine.y365.com/html/register.htm 汇款地址:天津市蓟县供电局计算站 王海丰 301900 如果你在使用有什么问题或建议,或发现BUG,请与作者联系,谢谢!!! Report Machine WWW: http://rmachine.yeah.net http://reportmachine.delphibbs.com 作者: wanghaifeng_1@163.net

604

社区成员

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

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