手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

C Builder创建组件探密

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

1.创建组件的类声明
class PACKAGE 新类名 : public 祖先类名
{

  • private:私有数据:
    (1)内部私有用
    (2)发布属性的真正数据保存
    (3)发布事件的数据保存
    (1,2,3)私有数据初始化一般在构造函数中,(3)的初始化一般和祖先该事件相连。
    通常为方便直接调用祖先方法常加保存祖先类型的变量:typedef 祖先类名 Inherit;
    私有方法:仅在类定义内部使用,不希望被继承使用,不希望公开使用。(尽量写成通用函数)
  • protected:保护数据:一般很少用。
    保护方法:一般是虚函数。在类定义时内部使用,对象不能直接调用,并把公开和否控制权给其派生类其派生类能够用重定义该方法,并可将其公开。
  • public:公有数据:一般属性,但不属于发布(即设计期不能操作)属性并不是真正的数据需要私有数据来保存属性,操作属性通过方法。常用的定义如:
    方式1:
    __property AnsiString ItemData={read=FItemData,write=FItemData,default="A"};
    方式2:
    __property AnsiString ItemData={read=GetItemData,write=SetItemData,default="A"};
    FItemData是其数据私有保存处GetItemData(),SetItemData()是实现读写函数,其内部除了配置数据外还能够加相应的处理代码,这部份处理就是属性的最大长处。即通过直接修改属性既实现了数据的读写又可实现的代码处理,然而用户的感觉似乎是只作了数据的改,正是这点“副作用”所带来的。
    另外假如对属性的修改无需响应处理则只用定义方式1就行了。
    公有方法:实现类的封装,改变数据成员都通过公有函数。(Method)重定义函数通常的先调用祖先类的该方法Inherit::XXX();(Inherit已说明,XXX表函数名), 然后再写自身要作的处理代码。
    __published:发布属性:同公有部分的属性,区别在于发布属性在设计期可直接通过对象观察器修改。祖先类已发布的属性,最好在此作确认。
    顺便指出方法不宜写在发布声明处,属性同样可写成公有或私有,但是他们是无法在设计期访问的,私有属性仅在内部使用不向用户提供。

}

写组件应尽量多用属性,而少用方法。只有属性无法完成的工作才由方法来完成。
发布事件:

1.普通事件: 参数唯一仅有TObject *Sender,一般用TNotifyEvent(指针类型)

如:__property TNotifyEvent OnExit={read=FOnExit,write=FOnExit} ;

同属性相同需要私有数据来保存事件指针。

TNotifyEvent FOnExit;另外是事件处理代码。

void __fastcall MyOnExit(System::TObject *Sender)其实现代码中由 FOnExit(Sender)语句触发事件;(注意事件处理函数返值void)

2.特别事件:
首先:需定义事件类型指针(类似于函数指针的定义)

typedef void __fastcall (__closure *TKeyDownEvent)(System::TObject* Sender, WORD &Key,TShiftState Shift);

其次:要有数据保存处。在private处声明:如 TKeyDownEvent FOnKeyDown ;
再次:有相应事件处理函数一般在protected处声明。如

protected:virtual void __fastcall MyOnKeyDown(System::TObject *Sender, WORD &Key,TShiftState Shift);

代码中常有 FOnKeyDown(Sender,Key,Shift)

最后:设定连接(需要提供前三者:事件指针类型,数据存放处变量,事件处理函数)。

__property TKeyDownEvent OnKeyDown={read=FOnKeyDown,write=FOnKeyDown}; };

组件检验及注册static inline void ValidCtrCheck(新类名 *){new 新类名(NULL);}

确保该控件声明中没有纯虚函数,因为虚基类是不能生成实例的。

namespace 名称空间

{

void __fastcall PACKAGE Register()

{

TComponentClass classes[1] = {__classid(新类名)};

}

RegisterComponents("所属包名", classes, 0);
还可加属性编辑器说明 RegisterPropertyEditor(...)}}名称空间是个C 特性,利用此Register()函数才能够区分其他控件。此命名必须符合规范,跟控件所在的文档名有关。如 TMyButton在 mybutton.cpp中则此命名空间为Mybutton.用New Component对话框生成新组件,不用考虑该问题。




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS