有关Delphi控件开发讨论, 自认为精通Delphi控件开发及VCL架构的高手请人内发表心得!?(300分)

  • 主题发起人 主题发起人 lorderic
  • 开始时间 开始时间
我还是喜欢JAVA风格的code, 看上去很酷的样子,特别是加上几个interface,
帅呆了.
 
pipi你好:
[?]我做了一个控件,当我把属性设为default False;时,我并不需要在Create事件
中重新设置,也没有什么错误发生,你所说的“
如果设置了default,你又没有在create设置相同的值,或者根本没有赋初值,那会出问题的
"是什么意思?
 
初始化的时候boolean如果没赋值,缺省是初始化为false,所以你的default false即使没有显式在create中赋值false
他也是false,所以不出问题。但这个不是好的习惯
你可以试试default true,如果在create中不给他赋值true,你在设计期设置这个属性为true,运行起来看是否会保存true就知道了
 
看到楼上回答的朋友不少,没有仔细看完,也来卖卖:

1. VCL控件开发的几个主要基类TComponent、TControl、TWinControl、TGraphicControl、TCustomControl的主要功能及各类用途!?
TComponent:因封装了设计期的一些信息而使得可以在设计时使用,当然要在设计时使用还必须注册到Delphi的IDE控件面板,所以TComponent是所有可以放在控件面板上的类的基类。
实现了IInterface, IInterfaceComponentReference接品。
TControl:顾名思义,这才是真正的Delphi的"控件"。我们常说的Delphi控件应该就是从它来继承,它是所有可视类的基类,可以在运行时看见。它封装了几封了所有的鼠标消息和部份界面的消息、外壳消息。
另外最重要的是它填充装了所有的消息分发。
TWinControl:当然它就是窗口控件,对应着VC里的窗口类(我不太懂VC),也是在Windows中的具有唯一标识Handle的类,所有容器类和可获得焦点的类都是从它上面继承。
作为窗口控件,它当然封装了所有的窗口消息,比如键盘消息。
TGraphicControl:从TControl上继承下来,没有窗口句柄,但是增加了画布Canvas,通过Canvas封装了主要的图形绘制API函数。
TCustomControl:类似于TGraphicControl,不过它是从TWinControl继承下来的,有了窗口句柄.
它和TGraphicControl一样,只处理了WM_PAINT消息。
2. ComponentState属性的用途
用于判断TComponent继承下来的类的状态,比如是否是设计期或者装载期等等。
3. 如果有一个属性为指向另一个类的实例(如TDataSource的Dataset属性), 要注意的事项
我想最重要应该是在写接品方法中调用另一个类实例的FreeNotification方法,经以便在另一个类实例析构的时候清空本类实例的相关属性(将相关成员字段设为nil)。
4. property宣告的具体心得及注意事项、Keyword Default及Stored的意义
这方面的东东其实主要看个人喜好,我的感觉在宣告一个属性时应尽可能避免这个属性可以不能过写接口而改写,那样可能为这个属性改变量所作的努力将不起作用,
比如动态数组类型的属性:最好不要声时动态数组类型的属性,因为在Delphi中动态数组类型的数组其实和指针差不多,它可以直接操作这个属性而不会调用写接口,除非你用赋值符号为动态数组赋值(这在Delphi中应尽量避免使用),
如果确实有动态数组类型的属性,可以通过定义属性下标来将其转换成简单类型或复合类型的属性
而一些类属性,一般在写接口中需要使用Assign方法来赋值,比如大多数可视控件的Font属性,或部份控件的TPicture类型属性,而且这样的属性因为本身有Assign方法,可能不会使用赋值运算为其赋值(在Delphi中应尽量避免使用赋值运算对类实例赋值,
除非真的是要两个实例变量指向同一个实例),所有一般不仅需要处理写接品,还需要给这个属性所对应的成员字段定义OnChange事件。
至于Default指示,不用看楼上也具定说得很多,关键是要注意,它并不对属性对应的私有成员初始化,如果需要初始化,则需要在构造函数中进行。
它仅仅用来指示属性是否需要被流化以保存在dfm文件中,编译以资源的形式进入EXE,可以有效的减小EXE文件的容量,并提示程序加载速度。
Stored指示的作用与Default指示字相仿,不过Default只是指定一个值,如果属性值在设计期间与这个值相同,就不流化,而且Default只支持有限的几种简单定长类型数据。
而Stored而可以通过一个Boolean函数来检查设计期间的属性值是否需要流化,这个函数可以非常复杂。

5. TControl与TWinControl的差异
TControl的和TWinControl其实在上面已经比较清楚了,主要就是一一个是父类,一个是子类,TWinControl比TControl增加了Handle和相关的方法和属性,以用相应的消息处理函数,
最主要的是,除是多了句柄之外,因为可以获得焦点,所以多了键盘相关的消息和方法。

6. TWinControl中如何封装Windows窗体(或者说, Windows的消息通知(message call), 经过了什么过程, 成为Delphi的Method Call) ? Windows的消息处理机制?
或者另一个问法, 在一个Control中, 要处理消息(message), 除了定义消息函数 (procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;) 外, 尚有那些方式?
这个可复杂了点,首先,TControl有于个属性WindowProc,其实它是一个事件,只不过Delphi中的所有类都没有把它放到published域,所以我们从没有在设计期间看到这个属性,
但是它的确存在,而且作用非常大,在TControl中的构造函数中,在重用了父类的构造代码后的第一行就是给这个事件赋了值,这个值是成员方法WndProc,这是一个动态方法,
可以重载,它完成了几乎所有鼠标消息和界面消息的分发.我们如果需要自己来处理这些分发,一种方法可以重载这个方法,另一种是自己定WindowProc事件句柄。
不过我便能愿意重载一些。其实到这里就可以明白,除了重载消息处理函数外,我们也可以载重WndProc方法来处理消息和重写WindowProc事件来处理消息。共至少有三种方法。

其他程序向Delphi编译的程序的窗口发的消息Delphi是如何能接收到的?请看CreateWnd方法中有一句WindowClass.lpfnWndProc := @InitWndProc;就是句告诉Windows这个窗口的消息由InitWndProc这个回调函数来处理,
而在InitWndProc这个函数中的一段汇编把它和TWinControl.FObjectInstance联系起来,再转到TWinControl.Create(AOwner: TComponent)中,第二行的FObjectInstance := Classes.MakeObjectInstance(MainWndProc);
才真正引出主角MainWndProc,它个函数很简单,就是触发WindowProc事件,把接收到的消息传给这个事件,再由个这事件来分发。好了说了一大通,但是太乱,可能不会有太多人能明白。
好在我们一般情况下不需要关心这些,只需要知道处理消息的三种方法就行了。

7. 设计覆合式控件的注意事项
说得简单点,就是注意谁是容器,谁是子对象就行了,在构告的时候把子对象的Parent属性和Owner设为容器,设计时就不会出现两个或者多个可操作纵的对象(而是只有一个唯一的对象可供用户操作)。

8. 对Windows基本窗体(Eidt, Button, ListBox....)的了解及说明?
关于这一点我倒没觉得有什么说的,人人都可说一大把。
 
关键还在于:
Windows的消息处理机制,
面向对象的原理。
不同控件对资源的占用情况,
…………………………
 
请你多些学习第三方组件的好东西,学习他们的方法和精神。
 
to delnus:
小弟想看看您说的Delphi组件开发帮助,可否给小弟一份?
小弟的E-Mail: yaxich@sohu.com 或 yaxich_hot@hotmail.com
 
to delnus:
小弟想看看您说的Delphi组件开发帮助,可否给小弟一份?
小弟的E-Mail: synworld@sina.com.cn
 
从面向对象过渡到面向组件的程序设计,大家基本上开始适应。怎样作好一个安全稳定
的组件(Delphi组件),光靠学好Delphi是不行的。
我认为Component可以说是Component,也可以说是Software.
所以Component好不好关键靠设计,Component编写之前必须对整个Component进行
全面的规划。
 
1. VCL控件开发的几个主要基类TComponent、TControl、TWinControl、TGraphicControl、TCustomControl的主要功能及各类用途!?
TComponent所有可在设计期间可看到的组件的祖先。
TControl控件的祖先
TWinControl所有有句柄的控件的祖先。
TGraphicControl所有图形组建的祖先。没有句柄
TCustomControl继承自TWinControl但是提供了画布属性
2. ComponentState属性的用途
ComponentState是组件的状态。一般在可视化设计使用的较多。可以知道当前正在读入,正在设计还是运行等等信息。
3. 如果有一个属性为指向另一个类的实例(如TDataSource的Dataset属性), 要注意的事项
调用被指向组件的FreeNotification方法指明释放通知对象,和在组件自身的Notification方法。再释放时把该属性置空
4. property宣告的具体心得及注意事项、Keyword Default及Stored的意义
Default是告诉窗体流保存时把该属性保存下来,而不管其是否发生过变化(通常如果属性在设计期间为变化过,窗体文件是不保存的)。Stored则通过一个布尔值来确定是否保存。
5. TControl与TWinControl的差异
TWinControl从TControl继承而来。最大的差别就是多了句柄。可以处理各种消息。实际上各种TWinControl都是Windows的窗口的不同体现。
6. TWinControl中如何封装Windows窗体(或者说, Windows的消息通知(message call), 经过了什么过程, 成为Delphi的Method Call) ? Windows的消息处理机制?
或者另一个问法, 在一个Control中, 要处理消息(message), 除了定义消息函数 (procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;) 外, 尚有那些方式?
主要可以通过覆盖过程WndProc来处理消息
7. 设计覆合式控件的注意事项
通过主控件的ComponentState判断是设计状态还是运行状态。以便表现出不同的表现。
8. 对Windows基本窗体(Eidt, Button, ListBox....)的了解及说明?
这些都是通过窗体的风格来实现的。也就是覆盖GreateParams方法。
在里面调用创建子类的方法CreateSubClass;用第二个参数通知系统窗体的风格。
例如Edit就传一个'Edit'字符串就行了,Button就是字符串'Button'而ListBox就传递一个'LisBox'。通过这些参数系统将给我们分配不同风格的的窗口。省去了我们自己画窗体的麻烦。所以标准Windows控件都是由系统自动画出外观的。


写这么多累死了。下次问点有难度的好不好!
 
这么好的帖子应该继续讨论
我来提下
 
1. VCL控件开发的几个主要基类TComponent、TControl、TWinControl、TGraphicControl、TCustomControl的主要功能及各类用途!?
TComponent是组件的祖先,一切在设计期间可见的组件(包括TControl、TWinControl、TGraphicControl、TCustomControl)全部派生于此,
TControl控件的祖先,一切可是化控件皆派生与此
TWinControl是Windows控件的祖先,从这个分支以后都是Windows窗体。都有句柄
TGraphicControl图形控件的祖先,没有据柄,但有画布(TCANVAS)
TCustomControl派生自TWinControl。所以也是窗体。同时带有画布属性

2. ComponentState属性的用途
ComponentState顾名思义就是组件的状态,是一个集合属性。举个例子:例如包含csDesigning就说明现在是在设计期间,否则在运行期间。

3. 如果有一个属性为指向另一个类的实例(如TDataSource的Dataset属性), 要注意的事项
如果指向的是TComponent类的派生类实例,要注意覆盖Notification虚方法。在所指向的组件释放的时候把该属性设置为空(NIL)
也就是Operation=opRemove并且AComponent=属性所指向的组件的时候

4. property宣告的具体心得及注意事项、Keyword Default及Stored的意义
Default是指不管属性是否有过改变都要保存到DFM文件中。
Stored通过一个布尔表达式的值来控制特性的存贮行为

5. TControl与TWinControl的差异
TControl不是窗体,没有句柄
TWinControl及其派生类都使窗体,有句柄

6. TWinControl中如何封装Windows窗体(或者说, Windows的消息通知(message call), 经过了什么过程, 成为Delphi的Method Call) ? Windows的消息处理机制?
或者另一个问法, 在一个Control中, 要处理消息(message), 除了定义消息函数 (procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;) 外, 尚有那些方式?

在TWinControl中有一句FObjectInstance := Classes.MakeObjectInstance(MainWndProc);指定了处理方法,而MainWndProc又仅仅只是用异常包装了一下调用WindowProc。
在CreateWnd时,有一句WindowClass.lpfnWndProc := @InitWndProc;说明了InitWndProc这个回调函函数是用来处理窗口消息的。
InitWndProc有这样的代码
asm
PUSH LParam //
PUSH WParam //
PUSH Message //
PUSH HWindow //
MOV EAX,CreationControl //
MOV CreationControl,0 //上面的都是参数
CALL [EAX].TWinControl.FObjectInstance //调用FObjectInstance所指向的方法也就是那个MainWndProc
MOV Result,EAX //
end;

7. 设计覆合式控件的注意事项
不要忘记了调用SetSubComponent方法,否者子控件的属性设置是保存不到DFM文件中的。
8. 对Windows基本窗体(Eidt, Button, ListBox....)的了解及说明?
不知道该怎么回答。反正我只知道通过覆盖CreateParams方法设置子参数
CreateSubClass(Params, 'EDIT');
CreateSubClass(Params, 'BUTTON');
CreateSubClass(Params, 'LISTBOX');
Windows会自动帮你变出他们的风格和一些特性
 
不知哪位大侠知道对非发布组件属性如何读写到frm,Writer.WriteComponent(组件属性)出错,不知为何?
 
问题:有关Delphi控件开发讨论, 自认为精通Delphi控件开发及VCL架构的高手请人内发表心得!? ( 积分:300, 回复:72, 阅读:2154 )
分类:控件 - 开发 ( 版主:cAkk, amo )

-----
怎么都不说话了呀?。。。
 
问题:有关Delphi控件开发讨论, 自认为精通Delphi控件开发及VCL架构的高手请人内发表心得!? ( 积分:300, 回复:73, 阅读:2163 )
分类:控件 - 开发 ( 版主:cAkk, amo )
来自:lorderic, 时间:2002-5-2 15:38:00, ID:1080798 [显示:小字体 | 大字体]

本论总预算1000分, 想与此道高手结识, 有能者得之
请勿发表不相干言论, 分数只会分给内容最精辟正确之人; 没有具体言论者, 请勿回复; 相同意见, 只给第一个发表之人

------------
如果能发表精辟言论,再能解决实际高难度问题才是【真言论】,如果只是把VCL源代码拷到论坛上,并说“这代码好好哦,并列举:好好点1;好好点2。。”之类谁不会呢。
言有过之请见谅,下面是偶在开发控件时遇到的一个问题
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2383056
 
正如目前的Delphi技术书籍中大都把VCL源代码拷过来而已,又有那些书籍中的哪些技术例子在Delphi帮助中不存在的(作者独创的)?
 
俺不是高手,最近有一小本关于Component开发的英文资料正在翻译当中(大概180多页,第一次干难免疏漏),争取在3月前完成。
 
archonwang:可否有电子版啊,可以的话发偶一份xukang2002@sohu.com谢了先
 
先听我说完
以后将是.NET的天下,窃以为不必再浪费时间去研究VCL的部件库了,市面上有好的只管拿来用,花时间去学学.NET的CLR吧,有精力就去钻MSIL......
...砖头来了,快溜...
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部