可视控件不重新注册情况下扩展其功能
这是答应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。于是我们的代码运行正常。
声明:以上内容纯属本人无验证推理过程。相信者,一切后果自负。哈哈。