作为组件制作的开始,应该了解一些概念,我以为这些概念是非常重要的,将可以作为以后实践的理论基础。
<?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;
在对象察看器中看来,就是列出几个选项分别设置真假。比如TForm的BorderIcons属性即是。
对象类型属性:一个属性是一个对象,而这个对象必须派生自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);
所以用户就可以在这个自定义的事件方法中写自己的代码,当事件发生时,该类的调度机制就会自动调用这个事件方法啦
也许有人会问,为什么从消息处理函数要调用DoMouseDown,DoMouseDown又调用MouseDown,然后再调用事件方法呢。为什么不直接在消息处理函数WMLButtonDown中调用呢,其实它这样的做的目的是要进行一些保护判断,以及一些消息附加值的转换,使这些值看起来更加直观。
好了,事件就讲了这里,不知道你们明白了没有,可能是我的表达能力不行,但没有关系,到真正做的时候,大家应该能明白了。
四,组件制作步骤:有了上面的基本概念,其实制作简单组件已经不是什么问题了,而要做真正的组件,还需要有一个正确过程,我们以后学做组件,也会顺着这个过程来做。主要如下:
1, 确定一个祖先类。怎么确定,可以根据上面组件的简要层次结构来确定。如果你想做非可视化组件,可以从继承TComponent开始。如果想做可视要可视化组件,可以从TControl的子类开始。
2 创建组件的单元,这个在制作组件时再说,不过是在IDE里面做几个操作而已。
3 给组件写属性,方法,事件,成员,等。这些在上面己有详细说明,是写组件的核心部分,事实上也是后面实践的主要内容。
4测试,安装组件和写帮助,这个内容比较次要,后面的例子会讲怎么样安装,包括单个单元,或用包的形式安装。而写帮助,己超出范围,这里就不说了。
关于组件基本概念就到这里讲完了,接下来就是实践了,有了上面的知识,实践起来也不是很难,很多东西都在上面了,而一些高级的特性,会在以后慢慢说的。
下一篇是做一个简单的组件,其实只用到了这里讲到了一些基本原理,而最重要的是给出了一个完整的组件制作过程。到了以后难度更大的组件,则重点会在代码的实现上,其他则从略了。
相关推荐
总的来说,用VB制作ASP组件是一项将VB的强大力量引入Web开发的过程,通过自定义组件可以实现更复杂的功能,提高代码复用性和可维护性。然而,这也需要开发者具备扎实的VB基础,对ASP的工作原理有深入理解,并能熟练...
引用百度百科:COM component(COM组件)是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合...
首先,jQuery的核心功能之一是DOM(Document Object Model)操作。在“Jd”文件夹中的代码可能包含了使用jQuery选择器来选取HTML元素,如`$("#id")`选取ID为特定值的元素,`$(".class")`选取具有特定类名的元素,...
"TR 组件 PPT 教案" ...本教案对 TR 组件的概念、设计技术、制作和测试、概念、背景意义、主要指标、混频器、振荡器、环形器、隔离器等内容进行了系统的讲述,为读者提供了一个系统的 TR 组件知识框架。
npm组件源码.zip是一个包含npm组件制作源代码的压缩包,主要涉及的技术栈是npm和Vue.js。在本文中,我们将深入探讨npm组件的创建、管理和发布,以及Vue.js组件化开发的基础知识。 首先,npm(Node Package Manager...
组件是Vue.js框架中一个非常核心的概念,它允许开发者通过自定义元素的方式扩展HTML的功能,实现可复用的代码块。在Vue.js中,组件可以是普通HTML元素的形式,也可以是原生HTML元素的形式,利用is特性进行扩展。组件...
JSF(JavaServer Faces)是...理解这些技术并熟练运用,是成为专业前端开发者的必备技能之一。通过阅读"如何使用JSF和Ajax制作强大的网络组件.pdf"这份教程,你将更深入地掌握这些概念和技术,并能实际应用到项目中去。
其中,微软的组件对象模型(COM)是最为广泛使用的组件技术之一。 #### 二、组件技术概述 **1. 组件技术的概念** 组件技术是指一种将软件系统划分为独立可重用的单元的方法。每个单元都有明确的功能定义,可以独立...
2. **数据绑定**:Vue的核心特性之一是双向数据绑定,使得视图与数据模型之间能实时同步。图片上传组件中,可能会有如`selectedImages`这样的数据属性来存储已选择的图片。 3. **事件监听**:Vue使用`v-on`指令监听...
总的来说,Office组件之间的协同工作是一个强大的工具,它允许用户在多个应用之间灵活切换,有效地整合和共享信息,提高生产力。了解并掌握这种协同工作的方式,对于提升日常办公效率至关重要。无论是进行数据分析、...
这个闰年判断小程序是利用Visual Studio 2008开发的一个实用工具,它属于勾月桌面管理系统的一个组件,主要功能是帮助用户快速判断任意年份是否为闰年。 首先,我们来了解一下闰年的概念。闰年是为了弥补因地球围绕...
1. **Axure组件**:Axure中的组件库是其核心功能之一,包含各种预设的UI元素,如按钮、文本框、图片等。这些组件可以自由拖放,组合成完整的页面原型。通过下载额外的组件包,用户可以扩展原有的组件库,满足更个性...
Java Excel组件Apache ...由于其灵活性和广泛的应用场景,Apache POI成为Java开发人员处理Excel文件的首选工具之一。随着版本的迭代,POI的性能和功能也得到了进一步增强,但3.1版本已经足够应对大多数Excel操作需求。
飞檐是中国古代建筑的典型特征之一,它是指屋顶向外悬挑的部分,通常由屋檐板、椽子、瓦片等构成。在设计上,飞檐增加了建筑的层次感,使建筑物显得更加宏伟壮观;在功能上,它能遮阳避雨,减少雨水对墙体的直接冲刷...
安卓ROM(Read-Only Memory)是Android操作系统的核心组件之一,负责存储操作系统和应用程序的代码和数据。安卓ROM可以分为两个部分:系统ROM和 Recovery ROM。系统ROM负责存储操作系统的代码和数据,而Recovery ROM...
在C#中,报表制作的核心技术之一是使用第三方库。例如,水晶报表(Crystal Reports)是一个流行的选择,它允许开发者设计复杂的报表并集成到C#应用程序中。通过水晶报表,你可以利用拖放功能创建报表布局,绑定数据...
网页制作是互联网时代不可或缺的基本技能之一,它涵盖了从设计、编码到发布整个流程。这篇教程将带你走进网页制作的世界,了解基本概念和技术。首先,我们要明确网页制作的主要目标是创建可浏览于互联网上的HTML文件...
《CCArmature动画组件制作详解》 在游戏开发和交互式应用中,动画效果的实现是至关重要的。其中,CCArmature动画组件是Cocos2d-x引擎中的一个强大工具,它允许开发者创建复杂的骨骼动画,使角色和物体的动作更加...
这一管理制度的核心目标是构建一个统一、规范且相对稳定的管理体系,旨在通过合理的规程和制度,促进公司的业务发展和管理动作的协调性。 首先,规范化管理大纲是整个制度的基础,它定义了管理的概念,即根据公司的...