可视控件不重新注册情况下扩展其功能

这是答应QQ群“Delphi之幽冥魔焰2”要写的东西。今天终于心平气和,能够做点事情了。

我们的开发中可能会遇到这样一个问题,比如我的窗体已经写好了,但是突然变更了需求,导致希望某个窗体的可视控件拥有一个新的功能,以便操作。例如我的窗体上有很多个Image控件,此时需要每个Image都有一个Filename属性,以便记录这些Image中的图片来源。通常有两种做法,一是自己再写一个拥有此项属性的Image控件,注册到IDE中,然后重新修改原来设计好的窗体;另外一个办法就是单独设置变量来记录这些Filename和他们对应的Image,这种方法只需要改动代码,而不需要修改界面,可是这些数据管理起来又很麻烦。那么下面我就要隆重介绍一下新的办法了。既不需要重新修改界面,又能让TImage具有Filename属性。直接给代码,然后大家去试一下。呵呵。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls;

type
  TImage = class(ExtCtrls.TImage)
  public
    FileName: string;
  end;

  TForm1 = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure Image1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Image1.FileName := 'c:\123.bmp';
end;

procedure TForm1.Image1Click(Sender: TObject);
begin
  ShowMessage(Image1.FileName);
end;

end.

其操作顺序是,先设计好窗体,也就是窗体上首先存在一个标准的TImage控件(这样符合上述问题的需求)。然后运行代码。一切如我们所愿。

基本原理是依赖于变量和类的作用域规定,也就是说,在上述例子单元中的Unit1.TImage类声明拥有最高优先级。所以代码在分析和创建TImage时,是按照Unit1.TImage创建的。但是另外一个问题,界面设计器明明使用的是ExtCtrls.TImage。没错,但是需要注意的是,编译器只是按照代码进行编译(dfm文件,dpr文件,pas文件等),而不会关心你再界面设计器上的操作过程,所以,虽然你再界面上放的是ExtCtrls.TImage,但是当持久化到dfm里以后,他仅仅是保存为TImage,于是编译器按照优先级高低,首先匹配了Unit1.TImage。于是我们的代码运行正常。

声明:以上内容纯属本人无验证推理过程。相信者,一切后果自负。哈哈。

posted @ 2007-04-25 22:33  monkeyking  阅读(442)  评论(4编辑  收藏  举报