【转】再谈DBGrid斑马纹效果 和 解决DBGrid支持滚轮效果最终方法
2010-06-04 15:43
399 查看
http://www.winu.cn/space-14160-do-blog-id-10583.html
// author :jfyes // date: 2005-3-9 整理 // remark: DBGrid 技巧 //A).解决DBGrid支持滚轮效果; //B). 再谈DBGrid斑马纹效果 //A).解决DBGrid支持滚轮效果最终方法 //1). 是改写DBGrid, 只不过改太罗索, 如果通过DBGrid1.WindowProc来处理是个方法如下: var OldGridWnd : TWndMethod; procedure Tfm_Main.NewGridWnd(var Message : TMessage); var IsNeg : Boolean; begin if Message.Msg = WM_MOUSEWHEEL then begin IsNeg := Short(Message.WParamHi) < 0; if IsNeg then DBGrid1.DataSource.DataSet.MoveBy(1) else DBGrid1.DataSource.DataSet.MoveBy(-1); end else OldGridWnd(Message); end; procedure Tfm_Main.FormCreate(Sender: TObject); begin OldGridWnd := DBGrid1.WindowProc ; DBGrid1.WindowProc := NewGridWnd; end; 2). WindowProc,这种方法不容易移植并麻烦,方便还是application.message来处理比容易,就是程式性能 有所降低。 procedure Tfm_Main.OnMouseWheel(Var Msg :TMsg;var Handled:Boolean); begin if Msg.message = WM_MouseWheel then begin if Msg.wParam > 0 then begin if DBGrid1.Focused then DBGrid1.DataSource.DataSet.MoveBy(-1) end else begin if DBGrid1.Focused then DBGrid1.DataSource.DataSet.MoveBy(1); end; Handled:= True; end; end; procedure Tfm_Main.FormCreate(Sender: TObject); begin application.OnMessage := OnMouseWheel; end; 3).如果一个表单有多个DBGrid就要改成如下还要简要: procedure Tfm_Main.OnMouseWheel(Var Msg :TMsg;var Handled:Boolean); begin if Msg.message = WM_MouseWheel then begin if not(ActiveControl is TDBGrid) then Exit; if Msg.wParam > 0 then TDBGrid(ActiveControl).DataSource.DataSet.MoveBy(-1) else TDBGrid(ActiveControl).DataSource.DataSet.MoveBy(1); Handled:= True; end; end; //============================================================== //B). 再谈DBGrid斑马纹效果 // 曾在DFW上看到多种实现DBGrid的斑马纹效果但其结果不是很理想 //1).第一种方法是改写DBGrid,重新继承写一个,那就有点小题大做了。 //2).直接在OnDrawColumnCell解决最好。但是看了许多解决方法都是DataSet.RecNo来实现 //,但这样就不是非常好的效果,insert就不行了,相信有很多DFW有过这样的情况。 //但是DataSet.RecNo和TCustomGrid(Sender).MouseCoord(X, Y).Y 来结合,事情就完全解决;如下: procedure Tfm_Main.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var RowNo: Integer; begin RowNo := TDBGrid(sender).DataSource.DataSet.RecNo; // 这里可以不要但这比MouseCoord效率高 if RowNo = -1 then //这里是dsInsert 状态的值 RowNo := TCustomGrid(Sender).MouseCoord(Rect.Left + 1, Rect.Top + 1).Y; //这是取行号 with TDBGrid(Sender).canvas do begin if RowNo Mod 2 = 0 then Brush.Color := clInfoBk else Brush.Color := clwhite; if (state =[gdSelected])or(state =[gdSelected, gdFocused]) then begin Brush.Color := clblue; font.Color := clRed; end; Pen.Mode := pmMask; end; // with TDBGrid(Sender).canvas do (sender as TDBGrid).DefaultDrawColumnCell(Rect, datacol, column, State); end; // 希望对各位大富翁有点帮助。 来自:ysai, 时间:2005-3-9 20:19:01, ID:3009466 标题有别字,"在谈"应该为"再谈" 1.代码有漏洞,如果DBGrid没有关联DataSource,代码肯定出错,应该加上判断语句: if assigned(DBGrid1.DataSource) and assigned(DBGrid1.DataSource.DataSet) and DBGrid1.DataSource.DataSet.active then DBGrid1.DataSource.DataSet.MoveBy(1) 2.某些时候,TDBGrid(sender).DataSource.DataSet.RecNo不正确,比如,新增记录时为-1,会造成全Grid为同一种颜色. 来自:zyt_1978, 时间:2005-3-9 20:21:43, ID:3009473 还有 左边固定列显示序号的问题 来自:jfyes, 时间:2005-3-9 20:30:47, ID:3009480 谢谢ysai的指点 ! 来自:晓梦残雪, 时间:2005-3-9 22:33:09, ID:3009561 问一个很菜的问题:这里所说的滚轮效果是指记录的循环滚动吗?象火车站大屏幕的信息那样? 来自:SmallGhost, 时间:2005-3-9 22:39:51, ID:3009566 直接用DevExpress Grid,功能很强呀! 来自:dawnsoft, 时间:2005-3-9 22:44:36, ID:3009567 上楼: 晕,滚轮就是鼠标中间那个轮。 收藏了。多谢楼主。 来自:yayongm, 时间:2005-3-9 22:57:06, ID:3009578 不好意思,俺一直在使用wwDBGrid 来自:晓梦残雪, 时间:2005-3-10 7:08:32, ID:3009695 谁能帮我想想滚屏的实现方法?在Delphi或者VB之中。有没有稍简单一点的? (1)显示出数据的滚动效果, (2)当鼠标停留在某行数据时,可以给出适当的提示 (3)单击或双击时,可以跳转到用以显示明细内容的界面。
相关文章推荐
- VB6.0对鼠标滚轮不支持的解决方法[转]已经测试work
- 解决DBGrid中关于鼠标滚轮的一种方法。
- VB6.0对鼠标滚轮不支持的解决方法
- DBGrid支持鼠标滚轮滚动的解决办法
- VB6.0对鼠标滚轮不支持的解决方法
- VB6.0对鼠标滚轮不支持的解决方法
- 服务器不支持FLV视频播放的原因及解决方法
- 终于解决了IE8不支持数组的indexOf方法
- CreateInstance(__uuidof(Connection)) 不支持此接口解决方法
- 用一种无耻的方式解决bootstrapvalidator不支持中国id验证的方法
- IIS不支持PHP的解决方法
- 当电脑的wmic 显示不是内部或外部命令的解决方法以及查看电脑最大支持内存
- android2.3 Luncher2开启3D效果(图标、字体模糊解决方法)
- 解决ie6支持最大高度最小高度的方法
- Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
- IE 8不支持支付宝插件问题解决方法
- DBGrid不支持鼠标滑轮的解决
- 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法
- 解决问题最重要的习惯不是一直盯着屏幕和编写修改代码,某些时候,阻止你成功的东西恰恰会是过于努力。这时候你需要暂停一下,平缓你的思绪,换一种方法或许能带给你不一样的效果。
- python2.4不支持datetime.strptime方法的解决方法。