用BCB设计DBTreeView组件小结
续二的最后一个函数,你是不是感到很纳闷:这个函数到底是用来干什么的呢?下面听我慢慢道来:我使用这个函数主要是用来实现定制属性编辑器。细心的读者一定还记得,我设计的控件中有三个关键的数据成员:ParentID,PrimaryIDField,DisplayField,这三个成员的函义是什么?相信不用我多说。为了使它们的设置更人性化,我选择了用下拉框的方式显示它,而其具体内容则由数据表中的字段而来,那么很自然我便采用了TFieldNameProperty,通过对它的定制,我实现了属性编辑器的定制。
TTypeInfo* AnsiStringTypeInfo(void)
{
//定义类型信息
TTypeInfo* TypeInfo = new TTypeInfo;
TypeInfo->Name = "AnsiString";
TypeInfo->Kind = tkLString;
return TypeInfo;
}
namespace Dbtreeview
{
//注册组件
void __fastcall PACKAGE Register()
{
RegisterPropertyEditor(AnsiStringTypeInfo(), __classid(TDBTreeView), "ParentIDField", __classid(TFieldNameProperty));//注册属性
RegisterPropertyEditor(AnsiStringTypeInfo(), __classid(TDBTreeView), "PrimaryIDField", __classid(TFieldNameProperty));//注册属性
RegisterPropertyEditor(AnsiStringTypeInfo(), __classid(TDBTreeView), "DisplayField", __classid(TFieldNameProperty));//注册属性
TComponentClass classes[1] = {__classid(TDBTreeView)};
RegisterComponents("Data Controls", classes, 0);//注册组件
}
}
到此为止,我已给出了用BCB实现DBTreeView的所有思路及代码,不知您感觉如何?要是觉得好就给点鼓励;要是觉得差,您也可以直言(好像是江湖卖艺^),我希望大家共同进步!
通过对这个组件的编写实践,你应该会用BCB进行一些组件的开发了吧?这里我再总结一下该组件设计中的要点,并为您以后设计组件提供一点建议:
1. 编写一个新的组件,首先要考虑从哪派生。你需要熟悉一下VCL结构,大致各种可视组件、不可视组件、窗口组件等的继承关系。建议你看看《C++Builder 5开发人员指南》和《C++ Builder 深度历险》。
2. 事件定义。事件其实就是某件事情发生时要做的处理,以DBTreeView中定制带参数的方法为例,我阐述一下定义的件的方法:
typedef void __fastcall (__closure *TDBTVSetImageIndexEvent)(System::TObject* Sender, int ID, int ParentID, int Level, int& ImageIndex, int& SelectedIndex);
TDBTVSetImageIndexEvent是自定义的事件类型,ID,ParentID等是事件所需的参数。那么就可以这样定义事件:
Private:
TDBTVSetImageIndexEvent FonSetImageIndex;
__published:
__property TDBTVSetImageIndexEvent OnSetImageIndex = {read=FOnSetImageIndex, write=FOnSetImageIndex};
3. 定义消息。虽然我的DBTreeView中没使用消息,但消息的作用绝不容忽视。在BCB中定义消息的方法如下:
private:
void __fastcall OnMyMessage(Tmessage &Msg);//定义消息函数
BEGIN_MESSAGE_MAP
MESSAGE_HANDLE(消息,消息类型,消息函数)
END_MESSAGE_MAP(父类)
本文地址:http://com.8s8s.com/it/it29442.htm