C++ Builder创建组件探密

2016-02-19 16:36 59 1 收藏

下面这个C++ Builder创建组件探密教程由图老师小编精心推荐选出,过程简单易学超容易上手,喜欢就要赶紧get起来哦!

【 tulaoshi.com - 编程语言 】

  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(新类名)};
}

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  RegisterComponents("所属包名", classes, 0);

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

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

来源:https://www.tulaoshi.com/n/20160219/1612526.html

延伸阅读
13.对话框组件 96)问:怎样编写文件打开、保存等对话框? 答:C++Builder为我们提供了许多常用的对话框组件,这些对话框组件都放在组件模板的Dialogs选项卡中,例如Font,Color,Open和Print对话框。其中OpenDialog对话框组件最具有代表性,只要掌握了它的用法,那么你也就会使用其他的对话框组件了。 97)问:对话框组件...
53)问:能介绍一下TTreeNodes与TTreeNode? 答:在BCB中,树状视图的节点是通过TTreeNodes对象来管理的,通过这个对象可以对树状视图进行动态的增加、删除、插入、移动节点等操作。而每一个节点都是一个TTreeNode对象。 TTreeNode的主要属性和函数: Count:这个属性用来返回某个节点所拥有的子节点的数目。它不包括其子节...
  38)问:事件OnChange和OnScorll都可以描述滚动条的滚动事件,他们有什么区别吗?  答:事件OnChange和OnScorll是有区别的。只要属性Position的值发生改变,那么无论这个值是用户操作滚动条引起的还是通过程序修改的,都会产生OnChange事件。而OnScorll事件只有在用户操作滚动条时才发生。当用户操作滚动条时,首先发生OnScorll事件...
一直以来都想写一点为BCB初学者快速入门的东西,前不久写了几篇《闲谈BCB》想把自己学习BCB中如何来解决难点的方法说给大家,没想到被骂得不成样子。本想不写了,但觉得这些东西留下来能做什么呢?还是用另一种方法来重新演译我的思维吧,最近有些忙,那几篇没有写完的文章,我也会尽快写完的,至于《深入QR》,我想我一定会用另一种手法来...
4.列表类组件 31)问:当我需要使用多个选项的时候,使用单选按钮或复选框来进行选择不是很恰当,因为在窗体上放置大量的按钮既不利于布局的美观,又会消耗大量的系统资源,C++Builder有什么解决办法吗? 答:可以使用列表框(ListBox、CheckListBox)或组合框(ComboBox)这两类最常用的列表组件。 32)问:列表框有那些主要属...

经验教程

923

收藏

16
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部