网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: ASP学习资源 >> 网站开发 >> Delphi教程 >> 文章正文
  改变VCL的行为--一个使用可视化元件的实例            【字体:
改变VCL的行为--一个使用可视化元件的实例
      
    要使一个可视化控件的行为与其默认行为不同,我们通常要从这个原始类继承,创建一个新的控件。本文将介绍如何在不创建新类的情况下动态改变原生Delphi可视化控件的行为。
  这可能实现吗?秘密在于在控件之前抢先截获Windows消息。这可以通过使用一个叫做WindowProc的TControl属性来实现,这个属性实质上指向控件的Windows消息事件处理器(event handler)。
  为了展示这一技术,我们将创建一个LinkedLabel控件,可以将它连接到任何TControl控件并且动态改变它的行为。TLinkedLabel由TLabel继承而来,附加4个公开的属性:
Associate —— 将被改变行为的相连控件
CapsLock —— 当这个Boolean属性被设置为True时,特定类型的控件将把小写键盘输入作为大写来处理。这个属性并不对所有控件有效,因为并不是所有的控件都以相同的方式相应WM_CHAR消息。经测试Edit,MaskEdit,Memo,和RichEdit控件都对CapsLock属性有响应,但是ComboBox则不响应。很明显,CapsLock属性对于很多其他控件(如Button、CheckBox等)只有很小的影响,或者没有影响。
Gap —— LinkedLabel与相连控件的距离
OnTop —— 这个Boolean属性决定LinkedLabel出现在相连控件的左侧还是顶端。
  另外,TlinkedLabel将保持自身和相连控件的Enabled和Visible属性相一致。它也会保持自身和相连控件的距离和角度,也就是说,当你移动LinkedLabel时,其关联也会随之移动,反之亦然。
我们来看一下TLinkedLabel类的声明,如图1所示。
unit LinkedLabel;

interface

uses
Messages, Classes, Controls, StdCtrls;

type
 TLinkedLabel = class(TLabel)
 private
 // 相连控件.
 FAssociate: TControl;
 // 将 FAssociate 置为全大写模式
 FCapsLock: Boolean;
 // 标签与关联控件之间的距离
 FGap: Integer;
 // 标签在关联控件顶端时为true
 FOnTop: Boolean;
 // 保存 FAssociate.WindowProc的原始值
 FOldWinProc: TWndMethod;
 // 用于防止无限更新循环
 FUpdating: Boolean;
 protected
 procedure Adjust(MoveLabel: Boolean);
 procedure SetGap(Value: Integer);
 procedure SetOnTop(Value: Boolean);
 procedure SetAssociate(Value: TControl);
 procedure NewWinProc(var Message: TMessage);
 procedure Notification(AComponent: TComponent;
 Operation: TOperation); override;
 procedure WndProc(var Message: TMessage); override;
 
public
 constructor Create(AOwner :TComponent); override;
 destructor Destroy; override;
 published
 property Associate: TControl
 read FAssociate write SetAssociate;
 property CapsLock: Boolean
 read FCapsLock write FCapsLock;
 property Gap: Integer read FGap write SetGap default 8;
 property OnTop: Boolean read FOnTop write SetOnTop;
end;

  现在让我们来仔细看看这个控件中的不同方法,先由构造器(constructor)开始。首先说明一下,当创建一个新对象时,与它相关联的所有内存都被清空。这个动作将会自动把Fassociate和FoldWinProc设置为nil,将FcapsLock、FonTop、Fupdating设置为False。所有这些都不需要在构造器中明确的初始化它们。因此,唯一需要我们在构造器中设置的就是Gap的默认值。
implementation

constructor TLinkedLabel.Create(AOwner: TComponent);
begin
 inherited;
 FGap := 8;
end;
  现在我们来看一下Adjust方法,它负责安排LinkedLabel或者关联控件的放置(取决于MoveLabel参数的取值)。正如你将在代码中看到的,LinkedLabel与相关控件的实际位置取决于Gap和OnTop属性(见图2)。虽然我们在OnTop中只提供了两种可能的选择,不过可以很容易的对其编程以提供更多的可能性。不过,把TlinkedLabel武装到牙齿(原文是“add a lot of "bells and whistles"”,译者注)并不是本文的重点,这项任务就委托给读者们来完成吧。
procedure TLinkedLabel.Adjust(MoveLabel: Boolean);
var
dx, dy: Integer;
begin
 if (Assigned(FAssociate)) then begin
 if (FOnTop) then
begin
 dx := 0;
 dy := Height + FGap;
end
else
begin
 dx := Width + FGap;
 dy := (Height - FAssociate.Height) div 2;
end;
 if (MoveLabel) then
begin
 Left := FAssociate.Left - dx;
 Top := FAssociate

[1] [2] [3] 下一页

  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    DELPHI:利用INI文件实现界面…
    巧用日期转换函数验证用户输…
    在Delphi 7 中用Indy开发Soc…
    在Delphi中用ADSI创建IIS的虚…
    在DELPHI程序中拨号上网
    在Delphi中侦测剪贴板的变化
    用Delphi 开发数据库程序经验…
    Delphi实现远程屏幕抓取
    怎样用delphi制作一个IPhunt…
    TWebBrowserTWebBrowser与MS…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    企业专区
    司法考试
    经济论文
    国内资讯
    两性知识
    健康知识
    现代文学
     
    行业资讯
    案例判例
    教育论文
    国外资讯
    性爱技巧
    保健养生
    网络文学
     
    行销知识
    理论研究
    社会论文
    游戏策划
    两性生理
    两性健康
    古典文学
     
    行销实战
    司法解释
    财税论文
    程序教程
    两性心理
    心理健康
    武侠言情
     
    行销资源
    样本范本
    证券论文
    美术教程
    孕育知识
    心理测试
    科幻小说
     
    网络广告
    法规大全
    医学论文
    手机游戏
    两性误区
    家庭医生
    侦探恐怖
     
    电信产业
    法律论文
    管理论文
    移动平台
    两性故事
    老年保健
    纪实文学
     
    投资信息
    法律咨询
    会计论文
    项目管理
    性情男女
    性格测试
    少儿文学
     
    传播论坛
    法律援助
    实用文书
    市场运营
    成人笑话
    性爱测试
    星座知识
    Copyright © 2005-2008 asp.u258.net All rights reserved.
    本站资源部分来自互联网如有侵犯你的权益请与我们联系