========================================
1. VCL控件开发的几个主要基类TComponent、TControl、TWinControl、TGraphicControl、
TCustomControl的主要功能及各类用途!?
:目前还没有能力回答这个问题。
========================================
2. ComponentState属性的用途
:用途就是描述控件的状态。由于自己做控件时很少遇到加上也不算难懂,我认为看看
vcl源代码了解一下应用就够了。
========================================
3 的内容被包含在7里了
========================================
4. property宣告的具体心得及注意事项、Keyword Default及Stored的意义
这个问题前面已经讨论的很多了,我也不多说了。
========================================
5. TControl与TWinControl的差异
TControl为所有在运行期可视并可操作的控件的基类。
TWinControl为所有具有输入焦点(即有窗体句柄)的控件的基类。
---------------------------------------------------------------------
TControl的子类拥有诸如position,cursor,paint,mouse actions等等属性,方法和事件。
TWinControl的子类除了拥有TControl所有的事件,还有拥有OnEnter OnKeyDown OnKeyPress
OnKeyUp OnExit几个事件。
---------------------------------------------------------------------
TControl 的子类可以作为进入入坞点的子窗体。
TWinControl的子类可以作为入坞点;
---------------------------------------------------------------------
只有TWinControl的子类才能转换成ActiveX(当然并不是所有的都能转换)。
========================================
6. TWinControl中如何封装Windows窗体(或者说, Windows的消息通知(message call),
经过了什么过程, 成为Delphi的Method Call) ? Windows的消息处理机制?或者另一个问法,
: 所有的Delphi类都有一个处理消息的内建机制--message handlers.
消息的派发过程是:event-->MainWndProc-->WndProc-->Dispatch-->Handler
当一个事件event发生后,delphi会调用MainWndProc来处理,MainWndProc又调用虚拟的WndProc
(因为各个组件的处理信息可以定制,所以这里用了虚拟方法,具体到某个组件,它可以实现自己的
消息处理定制)。TWinControl的WndProc方法是个主角,在这里进行消息的筛选,trap掉不想处理的
消息,然后将要处理的消息传给TObject的Dispatch,由Dispatch来决定实际该调用哪个方法处理次
消息。Dispatch检查消息的Msg field,如果组件定义了针对次消息的处理(handler),那么就转到
handler;如果没有,就调用DefaultHandler。
在一个Control中, 要处理消息(message), 除了定义消息函数 (procedure WMSetFocus(var Message:
TWMSetFocus); message WM_SETFOCUS
外, 尚有那些方式?
: // // // // // // // // //
protected
procedure WndProc(var Message: TMessage); override;
//。。。
procedure TForm1.WndProc(var Message: TMessage);
begin
if Message.Msg=SN_Msg then
showmessage('hello from WndProc');
inherited;
end;
========================================
7. 设计覆合式控件的注意事项
(我对覆合式控件的概念不是很清楚,这里我把它当做是控件A包含B)
我认为要分为两种情况:一种是要在A中创建B;另一种是A中引用B。
第一种较简单:
只要注意最后释放就行了,代码如下:
TA=class(TComponent)
private
FB:TComponent;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
constructor TA.Create(AOwner: TComponent);
begin
inherited;
FB :=TComponent.Create(self);
end;
destructor TA.Destroy;
begin
FreeAndNil(FB);
inherited;
end;
第二种就是你说的TDataSource这种引用之类,要注意的是必须改写此控件的 Notification 方法。
这个答案有现成的,下面是从深度历险摘来的,正合适你用:)
译者: 陈宽达 原作者 :John M. Miano
TMyComponent = class (TComponent)
private
FDataSource: TDataSource;
procedure SetDataSource(Value: TDataSource);
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
published
property DataSource: TDataSource read FDataSource write SetDataSource;
end;
procedure TMyComponent.SetDataSource(Value: TDataSource);
begin
if Value <> FDataSource then
begin
FDataSource := Value;
// 告诉叁考构件说,当它被移除时记得通知我一声。
if FDataSource <> nil then FDataSource.FreeNotification(Self)
end;
end;
procedure TMyComponent.Notification(AComponent: TComponent; Operation:TOperation);
begin
inherited Notification(AComponent, Operation);
// 如果被移除的正是叁考构件,把FDataSource字段清除。
if (Operation = opRemove) and (AComponent = FDataSource) then
FDataSource := nil
end;
========================================
8. 对Windows基本窗体(Eidt, Button, ListBox....)的了解及说明?
不要忽视了tag属性。
它们最常被用作控件数组的。