`
javasogo
  • 浏览: 1778673 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

组件制作之一(概念)

阅读更多

作为组件制作的开始,应该了解一些概念,我以为这些概念是非常重要的,将可以作为以后实践的理论基础。

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

, 组件的简要层次结构。一般情况下,VCL的组件可以从Tcomponent为开始。其最明显的特征就是它的属性可以在设计时通过对象察看器来操纵,另外,他还能拥有其他组件。

Tcomponent下,分出非可视组件和可视组件。

非可视组件如TOPenDialog,TTimer,TTable等,这些组件因为继承自Tomponent,所以也就继承了在设计时可以被操纵的特性。

可视化组件始自TControl,是它引入了可视化属性和方法,使继承自它的类都有了这些可视化特性。

TControl又分出两类组件类型:从TWinControl(窗口控件)自下的控件,和从TGraphicControl(图形控件)自下的控件。继承自TWinControl的控件将windows控件进行封装,所以拥有windows控件的很多特性,比如可以得到焦点,有唯一的句柄,用户可以通过发送消息与这些控件进行交互等。而继承自TGraphicControl的控件,也是可见的,但没有句柄,可以称之为图形控件,比如TLabel,TBevel,都是Delphi画出来的,并不占用系统资源。

二,属性 先看一个简单的属性定义:

     TsomeObj=class

Private

FCount:integer;

Protected

Procedure SetCount(value:Integer);

published

      Property count:integer read FCount write SetCount default 0;//属性定义

End;

该属性从私有成员FCount读出值,而靠SetCount方法设置值到私有成员FCount

属性的优势在于可以很直观进行读写,而又不同于私有成员。因为属性可以通过写访问方法来保护私有成员:

     Procedure TsomeBoj.SetCount(value:Integer);

Begin

If FCount<>value then

FCount:=value;

End;

其中属性定义中的Default 0并不是默认值(即对象察看器显示的值),默认值要在组件类的构造函数中设定。而Default有这样的作用,决定DFM文件中是否要保存该属性的值,比如上面为Default 0,即当该属性值为0时,则该属性不会被保存到DFM中,如果该属性值不为0,则该属性会被保存到DFM中。另外属性定义还有一个关键字为

  NoDefault,设置了这个关键字,比如

  Property count:integer read FCount write SetCount NoDefault;

  则无论它的值是什么,都会被写到DFM文件中。

属性可以有如下几种类型,下面只给出简单介绍,而这些类型的属性,会在组件制作时详细的运用:

简单类型属性:如上面定义的,加一个例子

       Property text:string read Ftext write SetText;

枚举类型属性:TEnumtype=(Enum1,Enum2,Enum3);

FEnumtype:TEnumtype;

Property Enumtype:TEnumtype read FEnumtype write FEnumtype;

      在对象察看器中看来就是下拉列框选择值。

集合类型属性:Tset=(set1,set2,set3);

Tsets=set of Tset;

Fsets:Tsets;

Property sets:Tsets read Fsets write Fsets;

在对象察看器中看来,就是列出几个选项分别设置真假。比如TFormBorderIcons属性即是。

  对象类型属性:一个属性是一个对象,而这个对象必须派生自Tpersistent或者他之下的类,才能在对象察看器中可以展开它,并设置它里面的属性。

数组类型属性:数组属性如果要在对象察看器中看见,需要有自己的属性编辑器(如果不想在对象察看器看当然就不用啦),是比较高级的组件,在后来的组件制作再来介绍,会更直观一些。这里只给出它的定义形式:

         property Selected[Index: Integer]: Boolean read GetSelected write SetSelected;

三,事件:事件其实是一种特殊的属性,他是指针类型,指向一个事件方法类型。当有特定的事件发生时,它就会关联到一段执行代码。

     下面以一个例子来讲解事件是怎么发生的。

我们先定义一个鼠标点下事件的鼠标事件类型,它其实就是方法指针:

     type TMouseEvent = procedure (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object;

又定义一个私有成员:鼠标事件类型的,即一个方法指针类型

FonMouseDown:TMouseEvent

最后定义一个属性:类要通过这个属性将外部的事件处理函数和FonMouseDown关联在一起:

onMouseDown:TMouseEvent read FonMouseDown write FonMouseDown;

     当有鼠标左键点击的,系统会向窗口会发送WM_LBUTTONDOWN;消息

     Delphi 可以截获这个消息,如下定义消息函数:

procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;

在这个消息处理函数中调DOMouseDown,DoMouseDown又调 用了MouseDown

在这个函数里面才到了最重要的部分

该函数是这样的:

    procedure TControl.MouseDown(Button: TMouseButton;Shift: TShiftState; X, Y: Integer);

begin

       if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y);

end;

而我们先来看看用户外部是怎么操作的,

他自己定义一个SomeobjMouseDown; 是一个事件处理函数,必须和TMouseEvent的形式一样:

Procedure SomeobjMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

然后他这样赋值:someobj.onMouseDown:=SomeobjMouseDown;

当赋值以后,类内部其实是通过onMouseDown属性,将SomeobjMouseDown;FonMouseDwon关联在一起,也就是说,MouseDown方法中调用了FOnMouseDown(Self, Button, Shift, X, Y);其实就等于调用了Procedure SomeobjMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);

所以用户就可以在这个自定义的事件方法中写自己的代码,当事件发生时,该类的调度机制就会自动调用这个事件方法啦

也许有人会问,为什么从消息处理函数要调用DoMouseDownDoMouseDown又调用MouseDown,然后再调用事件方法呢。为什么不直接在消息处理函数WMLButtonDown中调用呢,其实它这样的做的目的是要进行一些保护判断,以及一些消息附加值的转换,使这些值看起来更加直观。

好了,事件就讲了这里,不知道你们明白了没有,可能是我的表达能力不行,但没有关系,到真正做的时候,大家应该能明白了。

四,组件制作步骤:有了上面的基本概念,其实制作简单组件已经不是什么问题了,而要做真正的组件,还需要有一个正确过程,我们以后学做组件,也会顺着这个过程来做。主要如下:

1, 确定一个祖先类。怎么确定,可以根据上面组件的简要层次结构来确定。如果你想做非可视化组件,可以从继承TComponent开始。如果想做可视要可视化组件,可以从TControl的子类开始。

2 创建组件的单元,这个在制作组件时再说,不过是在IDE里面做几个操作而已。

3 给组件写属性,方法,事件,成员,等。这些在上面己有详细说明,是写组件的核心部分,事实上也是后面实践的主要内容。

4测试,安装组件和写帮助,这个内容比较次要,后面的例子会讲怎么样安装,包括单个单元,或用包的形式安装。而写帮助,己超出范围,这里就不说了。

关于组件基本概念就到这里讲完了,接下来就是实践了,有了上面的知识,实践起来也不是很难,很多东西都在上面了,而一些高级的特性,会在以后慢慢说的。

下一篇是做一个简单的组件,其实只用到了这里讲到了一些基本原理,而最重要的是给出了一个完整的组件制作过程。到了以后难度更大的组件,则重点会在代码的实现上,其他则从略了。

分享到:
评论

相关推荐

    vs2019 Com组件初探之简单的COM编写及实现跨语言调用的方法

     引用百度百科:COM component(COM组件)是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合...

    AcReport 3.2.12 中国式报表控件 最新版

    Anycell Report(简称AC Report)是一款中国式报表组件,是国内最早的基于表格,支持图文混排、公式和脚本的中国式报表工具之一。就如Anycell Report的名称那样,灵活强大的表格功能一直是AC Report区别于其它软件或...

    composion:使用React和Emotion制作的组件库

    我的愿望是创建一个比Grommet更轻并且比Blueprint,PrimeReact,Rebass或Semantic UI之类的库更接近Flexbox规范的库。 这个想法是,知道应该知道如何使用该库,而不知道灵活盒模型的人应该可以通过使用它来学习。 ...

    ACReport中国式报表组件2010(Ver2.2)(含文档)

    灵活强大的表格功能一直是AC Report区别于其它软件或控件最显著的特征之一,AC Report 表格取消了传统表格概念中“列”的概念,每一行上的单元格数量可以不等,且可以自由活动,不用上下对齐,在制作复杂的中国式...

    python入门到高级全栈工程师培训 第3期 附课件代码

    04 ORM多表操作之一对多查询之双下划线查询 05 ORM多表操作之多对多添加记录 06 ORM多表操作之多对多查询 07 ORM多表操作之F查询与Q查询 08 ORM的querySet集合对象的特性 第53章 01 admin介绍 02 alex首秀失败 03 ...

    Wonderfull-land-of-React:使用 ReactJs 制作的奇妙项目之家

    哈哈,这是我学习 React 基础知识的第一个项目之一。 ##Filtering Libraries 我想有一个地方可以找到流行的库,所以(使用我的新 React 技能)我制作了一个可过滤的列表,使用......你猜对了:React。 再次非常...

    DELPHI 5编程实例与技巧

    12.1 客户/服务器的概念 248 12.1.1 客户 248 12.1.2 InterBase 客户例程库 248 12.1.3 InterBase服务器 248 12.1.4 Borland数据库引擎 248 12.2 数据库的管理和维护 249 12.2.1 创建数据库 249 12.2.2 创建表 250 ...

    D6 SOAP_WEB SERVICE程序设计.part1.rar

    delphi下soap编程指导 第一章 SOAP和Web Service的概念 第二章 组件模型、Internet/Intranet和SOAP 第三章 开发Web Service ...第十三章 Delphi的Soap和Web Service之幕后制作 第十四章 在Internet上使用Web Service

    易语言中应用Grid++Report教程

    Grid++Report第三方报表组件是较为理想的选择之一,如它可以免费注册,以及强大的报表功能,详细的中文帮助,大量的易语言实用例程,为易语言进行了优化……使得它成为易语言商业用户制作报表的首选工具。...

    C语言程序大作业:基于qt制作学生信息管理系统.zip

    例如,在数据表编辑界面上,一些字段是必填字段,就可以在初始化界面时为这些字段的关联显示组件定义一个新的required属性,并设置值为“true"。 4.类的附加信息 属性系统还有一个宏Q_CLASSINFO(),可以为类的元...

    Cocos2d-x游戏引擎实战开发之炸弹超人项目

    特点二、在每节开始之前先简单回顾上一节所讲的主要内容,并对本节所讲的内容先进行概述,讲解概念、技术要点,设计实现思路等内容,最后总结本次课程的要掌握的要点,讲师授课采用先理论,后实战的方式,由浅入深,...

    asp.net知识库

    制作一个简单的多页Tab功能 一完美的关于请求的目录不存在而需要url重写的解决方案! 在C#中实现MSN消息框的功能 XmlHttp实现无刷新三联动ListBox 鼠标放在一个连接上,会显示图片(类似tooltip) 使用microsoft.web.ui...

    ACReport中国式报表控件2011(Ver2.42)

    就如Anycell Report的名称那样,灵活强大的表格功能一直是AC Report区别于其它软件或控件最显著的特征之一,AC Report 表格取消了传统表格概念中“列”的概念,每一行上的单元格数量可以不等,且可以自由活动,勿须...

    Highcharts-Maps-8.1.2.zip

    Highmaps 最重要的特点之一就是:无论免费版还是付费版,你都可以下载源码并可以对其进行编辑。 基于开源社区我们可以第一时间获取用户的需求、及时的 Bug 修复及吸收社区贡献。 no-backend纯 JavaScript Highmaps...

    精通JS脚本之ExtJS框架.part2.rar

    9.3.1 制作第一个EditorGrid 9.3.2 添加一行数据 9.3.3 保存修改结果 9.3.4 验证EditGrid中的数据 9.3.5 限制输入数据的类型 9.4 PropertyGrid属性表格控件 9.4.1 PropertyGrid简介 9.4.2 只读的PropertyGrid...

    ACReport中国式报表控件2011(Ver2.45)

    就如Anycell Report的名称那样,灵活强大的表格功能一直是AC Report区别于其它软件或控件最显著的特征之一,AC Report 表格取消了传统表格概念中“列”的概念,每一行上的单元格数量可以不等,且可以自由活动,勿须...

    WYSIWYG Web Builder v15.0.3.zip

    这款编辑软体有一项很大的优点,就是具备图层概念,连FLASH都可以被叠上去。软件界面美观简洁、简单全面、实用方便,无需培训,即可快速上手,轻轻松松完成日常网页生成功能,真正做到简单全面实用。不需要学习HTML...

    基于Arduino Uno制作的啤酒浇注机器人-电路方案

    由于比利时是啤酒之乡,我们决定为两种比利时啤酒(Duvel和Jupiler)制作一个浇注机器人,并根据玻璃瓶和瓶子尺寸制作机器人,作为我们的Master One项目的一部分。这个想法是为两个啤酒品牌建立一个共同的机器人。...

    AC Report 中国式报表控件(Ver 2.61)

    就如Anycell Report的名称那样,灵活强大的表格功能一直是AC Report区别于其它软件或控件最显著的特征之一,AC Report 表格取消了传统表格概念中“列”的概念,每一行上的单元格数量可以不等,且可以自由活动,勿须...

    《面向对象程序设计java)》课程整体教学设计.docx

    并行课程:数据库设计与应用 后续课程: :《JSP动态网站设计开发》、《安卓手机应用开发》 二、课程概述 课程定位 《面向对象程序设计》是计算机类专业的核心课程之一,也是基础课程之一, 在整个课程体系中起专业...

Global site tag (gtag.js) - Google Analytics