delphi的TControl类具体是什么?

如题所述

第1个回答  2022-10-18
分类: 电脑/网络 >> 程序设计 >> 其他编程语言
解析:

TControl是从TPersistent类的子类TComponent类继承而来的。TPersistent抽象基类具有使用流stream来存取类的属性的能力。

TComponent类则是所有VCL组件的父类。

这就是所有的VCL组件包括您的自定义组件可以使用dfm文件存取属性的原因(当然要是TPersistent的子类,我想您很少需要直接从TObject类来派生您的自定义组件吧)。

TControl类的重要性并不亚于它的父类们。在BCB的继承关系中,TControl类的是所有VCL可视化组件的父类。实际上就是控件的意思吧。所谓可视化是指您可以在运行期间看到和操纵的控件。这类控件所具有的一些基本属性和方法都在TControl类中进行定义。

TControl的实现在\Borland\CBuilder5\Source\Vcl\control.pas中可以找到。

TControl继承但并没有重写TObject的Dispatch方法。反而提供了一个新的方法WndProc。一起来看看Borland的工程师们是怎么写的吧。

procedure TControl.WndProc(var Message: TMessage);

var

Form: TCustomForm;

begin

由拥有control的窗体来处理设计期间的消息

if (csDesigning in ComponentState) then

begin

Form := GetParentForm(Self);

if (Form <> nil) and (Form.Designer <> nil) and

Form.Designer.IsDesignMsg(Self, Message) then Exit;

end

如果需要,键盘消息交由拥有control的窗体来处理

else if (Message.Msg >= WM_KEYFIRST) and (Message.Msg <= WM_KEYLAST) then

begin

Form := GetParentForm(Self);

if (Form <> nil) and Form.WantChildKey(Self, Message) then Exit;

end

处理鼠标消息

else if (Message.Msg >= WM_MOUSEFIRST) and (Message.Msg <= WM_MOUSELAST) then

begin

if not (csDoubleClicks in ControlStyle) then

case Message.Msg of

WM_LBUTTONDBLCLK, WM_RBUTTONDBLCLK, WM_MBUTTONDBLCLK:

Dec(Message.Msg, WM_LBUTTONDBLCLK - WM_LBUTTONDOWN);

end;

case Message.Msg of

WM_MOUSEMOVE: Application.HintMouseMessage(Self, Message);

WM_LBUTTONDOWN, WM_LBUTTONDBLCLK:

begin

if FDragMode = dmAutomatic then

begin

BeginAutoDrag;

Exit;

end;

Include(FControlState, csLButtonDown);

end;

WM_LBUTTONUP:

Exclude(FControlState, csLButtonDown);

end;

end

下面一行有点特别。如果您仔细的话会看到这个消息是CM_VISIBLECHANGED.

而不是我们熟悉的WM_开头的标准Windows消息.

尽管Borland没有在它的帮助中提到有这一类的CM消息存在。但很显然这是BCB的

自定义消息。呵呵,如果您对此有兴趣可以在VCL源码中查找相关的内容。一定会有不小的收获。

else if Message.Msg = CM_VISIBLECHANGED then

with Message do

SendDockNotification(Msg, WParam, LParam);

最后调用dispatch方法。

Dispatch(Message);

end;

看完这段代码,你会发现TControl类实际上只处理了鼠标消息,没有处理的消息最后都转入Dispatch()来处理。

但这里需要强调指出的是TControl自己并没有获得焦点Focus的能力。TControl的子类TWinControl才具有这样的能力。我凭什么这样讲?呵呵,还是打开BCB的帮助。很多朋友抱怨BCB的帮助实在不如VC的MSDN。毋庸讳言,的确差远了。而且这个帮助还经常有问题。但有总比没有好啊。

Delphi消息的发送有三种方法:

1.Tcontrol类的Perform对象方法。可以向任何一个窗体或控件发送消息,只需要知道窗体或控件的实例。其声明如下:

function Tcontrol.Perform(Msg:Cardinal;Wparam,Lparam:Longint):Longint

2.Windows的API函数SendMessage()和Postmessage()。其声明如下:

function SendMessage(hWnd: HWND; Msg: UINT;wParam:WPARAM; lParam: LPARAM):LRESULT;stdcall;

function SendMessage(hWnd: HWND; Msg: UINT;wParam: WPARAM; lParam:LPARAM):LRESULT;stdcall

PostMessage函数将消息添加到应用程序的消息队列中去。应用程序的消息循环会从消息队列中提取登记的该消息,再发送到相应的窗口中。

delphi的TControl类具体是什么?
TControl是从TPersistent类的子类TComponent类继承而来的。TPersistent抽象基类具有使用流stream来存取类的属性的能力。TComponent类则是所有VCL组件的父类。这就是所有的VCL组件包括您的自定义组件可以使用dfm文件存取属性的原因(当然要是TPersistent的子类,我想您很少需要直接从TObject类来派生您的自定义组件吧...

delphi那么多类怎么记忆啊
接下来是TControl,从这开始控件有可视化的界面;接下来是TWinControl,TWinControl是包装Windows可视化类的,其实窗体,输入框等都是WIndows已经提供了,Delphi把它重新包装了;等等,再往下还有各种分枝,但那都是具体细化的,总之你了解VCL的结构,如果要你写个控件知道怎么选择祖先类,那就够了。除此之外,...

delphi中 ***.fillrecprect);FillRect和ClipRect各有什么含义、作用,参 ...
在Delphi编程中,FillRect和ClipRect是两个重要的图形处理函数,它们各自具有独特的含义和作用,用于精细化控制绘制区域和裁剪操作。首先,FillRect函数就像一个绘画工具,它的主要任务是填充一个指定的矩形区域。这个函数的语法通常是:TControl.Surface.FillRect(ARect, Color);其中,ARect是一个TRect对象...

Delphi中Owner和Parent的区别
而在 delphi 语言里,这两个单词所代表的含义之英文原意相仿。两者的区别在于:1、Owner 指构件的 “所有者”,它负责构件的创建和释放。Parent 指构件的包容器(构件的上一层构件:“父母”),构件只能在此范围内显示和移动。2、与 Owner 关联的对象是 TComponent(元件),而与 Parent 关联的是TC...

DELPHI基础教程:Delphi自定义部件开发(二)[4]
procedure TControl WndProc(var Message:TMessage) begin if (Message Msg >= WM_MOVSEFIRST) and (Message Msg <= WM_MOUSELAST) then if Dragging then DragMouseMsg(MMOUSE(Message)) { 处理拖动 } else … { 正常处理其它 } … { 否则正常处理 } end; 返回目录 DELPHI基础教程 编辑推荐 Java程序...

DELPHI基础教程:Delphi自定义部件开发(一)[1]
Delphi部件编程概述 Delphi可视部件类库 Delphi的部件都是可视部件类库(VCL)的对象继承树的一部分 下面列出组成VCL的对象的关系 TComponent是VCL中每一个部件的共同祖先 TComponent提供了Delphi部件正常工作的最基本的属性和事件 库中的各条分支提供了其它的更专一的功能 当建立部件时 通过从对象树中已有的...

delphi数据继承
Delphi的组件结构确保了所有部件,如TComponent,从基础的TObject类型继承了数据和程序代码。TComponent还提供了额外的专用属性、方法和事件,使其可以直接与用户交互,存储状态,甚至保存到文件。例如,TControl从TComponent派生,增加了显示对象等特性。TCheckBox虽然看起来不是直接从TObject继承,但其实它继承...

Delphi的消息处理[2]
Delphi消息的发送有三种方法 .Tcontrol类的Perform对象方法 可以向任何一个窗体或控件发送消息 只需要知道窗体或控件的实例 其声明如下 function Tcontrol Perform(Msg: Cardinal; Wparam Lparam: Longint): Longint .Windows的API函数SendMessage()和Postmessage() 其声明如下 function SendMessage(...

DELPHI基础教程:Delphi自定义部件开发(一)[2]
例如 建立一个最简单的从TComponent直接继承非可视的部件 将下列的类型定义加在部件单元的interface部分 type TNewComponent=class(TComponent)……end;现在你能注册TNewComponent 但是新部件与TComponent没什么不同 你只创建了自己部件的框架 ⑶ 注册部件 注册部件是为了告诉Delphi什么部件被加入部件库和加入...

明白delphi的来看看
注意 如果计划将 Screen.ActiveControl 传递给一个过程,那么在那个过程中必须用子句 As Control 而不是指定控件的类型 (As TextBox 或 As ListBox)声明参数,即使 ActiveControl 总是引用相同类型的控件。myrect:=activecontrol.boundsrect;\/\/读入形状(左,上,右,下)myrect.Right:=myrect.left+2...

相似回答
大家正在搜