看到楼上回答的朋友不少,没有仔细看完,也来卖卖:
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....)的了解及说明?
关于这一点我倒没觉得有什么说的,人人都可说一大把。