导航
  • 主页
  • Windows SDK/API
  • 基础类
  • ActiveX
  • 数据库及相关技术
  • 网络及通讯开发
  • VCL组件使用和开发
  • 问答

求助,关于GRID

yuanque 2002-09-03 01:08:53
我想用CB中的TStringGrid来实现数据的展示(不一定是数据库中的数据,所以没有考虑用TDBGrid),但TStringGrid我感觉有点简单,因为我希望单元格可以有多种样式(如按钮,下拉框,图片,单选框等),不知怎么解决好,希望大家帮忙出主意!
...全文
24 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yuanreid 2002-09-03
比如要TStringGrid支持TListBox作为编辑对象(即下拉框),
第一步:可以先从TCustomListBox继承一个自己的类,假如叫TPopupListbox。必须实现两个保护的方法(protected):
void __fastcall CreateParams(Controls::TCreateParams & Params);
void __fastcall CreateWnd(void);

同时还需要处理一些按键和鼠标事件
DYNAMIC void __fastcall KeyPress(char &Key);
DYNAMIC void __fastcall MouseUp(TMouseButton Button, TShiftState Shift, int X, int Y);

第二步:从TInplaceEdit类继承自己的TGridInplaceEdit,并在TPopupListbox类中把TGridInplaceEdit添加为友元。
添加如下代码:
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_SETCURSOR, TWMSetCursor, WMSetCursor)
VCL_MESSAGE_HANDLER(WM_PAINT, TWMPaint, WMPaint)
VCL_MESSAGE_HANDLER(WM_LBUTTONDBLCLK, TWMLButtonDblClk, WMLButtonDblClk)
VCL_MESSAGE_HANDLER(WM_KILLFOCUS, TMessage, WMKillFocus)
VCL_MESSAGE_HANDLER(WM_CANCELMODE, TMessage, WMCancelMode)
VCL_MESSAGE_HANDLER(CM_CANCELMODE, TCMCancelMode, CMCancelMode)
END_MESSAGE_MAP(TInplaceEdit)
处理这些消息。

第三步从TStringGrid的父类TCustomGrid继承你的控件,并把
TGridInplaceEdit添加为友元。
在(protected)重载如下:
void __fastcall DrawCell(int ACol, int ARow, const Windows::TRect &ARect, Grids::TGridDrawState AState);
TInplaceEdit* __fastcall CreateEditor(void);
DYNAMIC AnsiString __fastcall GetEditText(int ACol, int ARow);
DYNAMIC int __fastcall GetEditLimit(void);
DYNAMIC void __fastcall SetEditText(int ACol, int ARow, const System::AnsiString Value);
void __fastcall HideEditor(void);


在public中重载:
DYNAMIC bool __fastcall CanEditAcceptKey(char Key);
DYNAMIC bool __fastcall CanEditModify(void);
bool __fastcall CanEditShow(void);
DYNAMIC AnsiString __fastcall GetEditMask(int ACol, int ARow);

这些都是看VCL的源程序得到的灵感,时间长了比较生疏了,框架和实现方式大概就是这样了,有问题可以参考delphi的源程序。祝好运!

回复
yuanque 2002-09-03
帮帮忙,分不够尽管开口嘛
回复
yuanque 2002-09-03
楼上是不是指TStringGrid有一个Objects属性?能否简单举个例子,感激不尽
回复
yuanreid 2002-09-03
如果不用别人的,只能自己编写这种控件,我也尝试过,TStringGrid实际已经预留了扩展的空间,他的每个单元支持用TcomboBox或CheckBox填充。感觉不是很困难,
回复
yuanque 2002-09-03
当然不能用listview了,是要用表格控件。那不是一个层面的东东。
回复
vixkywx 2002-09-03
用listview吧
回复
yuanque 2002-09-03
因为工程的需要不能用别人的控件,有源码吗,请指点一两个网站,谢谢:)
回复
JamesJiang 2002-09-03
去找几个增强型的Grid控件,网上大把。
回复
发动态
发帖子
C++ Builder
创建于2007-08-02

1.3w+

社区成员

C++ Builder相关内容讨论区
申请成为版主
社区公告
暂无公告