Data-Browse型Data-Aware控件的制作

原创 2002年09月25日 15:56:00

Data-Browse型Data-Aware控件的制作


在MIS系统中,使用得最常见的当属数据感知控件了。学习如何编写自已的组件,一条很重要的原则就是从自己熟悉的
组件入手,派生出新的合乎自己要求的控件。在数据感知控件中,Data-Browse型是非常简单而又实用的。所以下面
我们就讲解一个一个自定义的TSunDBText(功能等同于TDBText)的编写:

TSunDBText = class(TCustomLabel)
 {...}
end;

因为DBText仅起着显示数据的作用,即是个具有数据感知功能的标签,又根据Delphi的习惯,从Custom系列控件派生,
所以我们选择了TCustomLabel。

如何具有数据感知功能,其实大部分的书上都没有讲得很明白,包括Delphi Help。大致上有这么几点,我们慢慢叙述:
一:选择一个能数据感知的DataLink对象,通常我们选用TFieldDataLink,表示仅与一个数据库字段关联
二:组件必须提供DataSource和DataField两个设计时可读写属性
三:组件必须处理FDataLink的OnDataChange事件,以反映数据字段的变化
四:必须提供Notification重载方法,以便当关联的TDataSource组件在设计期或者运行期删除时,能得到通知,并且
      反映出这种改变
五:习惯上,我们还要处理CM_GETDATALINK消息,以符合VCL内部通信的要求
六:为了组件的灵活性,建议提供一个Field属性,以便可以利用TField的方法来增强编程的适用性

下面我们就来一一讲解:
private
   FDataLink:TFieldDataLink;
  
constructor Create(AOwner:TComponent);override;
begin
   inherited;
   FDataLink := TFieldDataLink.Create; {创建一个TFieldDataLink的对象}
   FDataLink.OnDataChange := DataChange;
   {
  
    将TFieldDataLink对象的OnDataChange事件处理交给TSunDBText的DataChange来处理
    这样就要以感知数据库字段的变化,并且进行自己想要的处理
   
   }
end;

destructor Destroy;override;
begin
  {
    这里很简单,仅仅是回收资源而已
  }
   FDataLink.Free;
   FDataLink := nil;
   inherited;
end;

从上面我们已经看到,数据感知的关键就在于DataChange事件,大致上我们可以知道,是需要将该字段的显示值赋予
本标签组件的Caption属性即可,所以下面的代码便是做这部分工作的。
(注意,之所以要用GetFieldText来完成赋值工作,是出于多方面的考虑,包括设计期和运行期,及异常情况)
procedure TSunDBText.DataChange(Sender: TObject);
begin
  Caption := GetFieldText; {read only displaytext when make an data browing component}
end;

function TSunDBText.GetFieldText: String;
begin
  {
 
  正常情况下,只需要取得FDataLink所代表的Field的DisplayText即可,如果你开发的不是Data-Browse控件,请用其他
  Field属性
 
  }
  if(FDataLink <> nil) then
    Result := FDataLink.Field.DisplayText
  else if(csDesigning in ComponentState) then Result := Name else Result := '';
  {
   如果是处在设计期,则标签中显示的是组件的名称,如果是运行期,则标签为空;当然,这只是习惯而已,但对于使用Delphi IDE的人来说,
   几乎就是规则。
  }
end;

如果没有DataSource和DataField这两个属性,那么控件几乎就没法使用了。这也是重要步骤。

    property DataSource:TDataSource read GetDataSource write SetDataSource;
    property DataField:String read GetDataField write SetDataField;
   
    这些方法十分简单,只要存取TFieldDataLink之DataSource和FieldName属性则可。
   
 function TSunDBText.GetDataSource: TDataSource;
begin
  Result := FDataLink.DataSource;
  {仅需简单地返回TFieldDataLink之DataSource属性
   从这就可以看出,DataSource属性的写方法也是对FDataLink赋值}
end;

procedure TSunDBText.SetDataSource(Value: TDataSource);
begin
  FDataLink.DataSource := Value; {如上所云,对DataSource属性赋值}

  if(Value <> nil) then Value.FreeNotification(self);
  {
    这里很重要,TComponent提供了一个FreeNotification(AComponent:TComponent)方法,这样,当Value释放时,就会自动调用AComponent的Notification
    方法,我们就可以调整对应的Data-Browse控件,以反映这种变化。如TSunDBText对应的DataSource组件删除掉,则应该反映在标签上
  }
end;

function TSunDBText.GetDataField: String;
begin
  Result := FDataLink.FieldName;  {获得TFieldDataLink之FieldName属性,也就知道了连接的是哪一个数据库字段名称}
end;

procedure TSunDBText.SetDataField(const Value: String);
begin
  FDataLink.FieldName := Value; {这应该不用解释了}
end;

接上面的,我们说过Notification的由来,下面就进行相关的处理:
procedure TSunDBText.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
  inherited;
  if(Operation = opRemove) and (FDataLink <> nil) and (AComponent = DataSource) then
    DataSource := nil;
end;

当关联组件被删除时,而且被删除的正好是本身关联的DataSource组件,就应该设置其DataSource属性为空

function TSunDBText.GetField: TField;
begin
  Result := FDataLink.Field;
end;

最后,数据感知控件还要响应CM_GETDATALINK消息。通常处理是将TDataLink作为Message的Result域返回
procedure CMGetDataLink(var Message:TMessage);message CM_GETDATALINK;

procedure CMGetDataLink(var Message:TMessage);
begin
    Message.Result := Integer(FDataLink);
end;
到此,基本上组件的功能就已齐备了,然而,有一点许多组件编写者都没有注意到,即Action的应用。如果自定义组件能融入VCL的Action机制,
必然可以使自定义控件的功能更强大,更为一些高级使用者喜欢。

下一次,我们就来讲一讲Action之来龙去脉。

Data-Browse型Data-Aware控件的制作

Data-Browse型Data-Aware控件的制作在MIS系统中,使用得最常见的当属数据感知控件了。学习如何编写自已的组件,一条很重要的原则就是从自己熟悉的组件入手,派生出新的合乎自己要求的控件。...
  • jian704
  • jian704
  • 2007年09月01日 21:35
  • 389

Data-Browse型Data-Aware控件的制作

  • zgqtxwd
  • zgqtxwd
  • 2008年05月01日 00:19
  • 98

如何制作一个ActiveX控件,并注册和发布,用于web上!(2)

我们在Demo中加入ShowMessage方法:  public void ShowMessage(string msg)  {      if(msg != null)      {        ...
  • wubala
  • wubala
  • 2006年08月10日 09:34
  • 4018

VC6.0 MFC 使用AddFlow画流程图

一 下载AddFlow 首先先下载AddFlow的ActiveX版本,我使用 的下载地址为:http://www.evget.com/product/3208 二 在VC6.0下建立工程 我建立的...
  • lllkey
  • lllkey
  • 2014年04月02日 17:42
  • 3321

mfc之ocx控件制作

一、控件有属性,事件和方法。mfc把它封装了两个接口。        属性,是对外公布的类成员变量,添加属性可以很方便使用者,如js,php,swf等网页或其他对控件外观或值进行方便的修改。让 o...
  • startear520
  • startear520
  • 2015年02月03日 14:49
  • 525

ACTIVEX控件的制作

1,新建MFC ACTIVEX CONTROLWIZARD工程,名为Clock,选择空的工程 ,新建一个Clock.cpp源文件2.再CClockCtrl类中添加WM_CREATE和WM_TIMERA...
  • ct_hero0902
  • ct_hero0902
  • 2007年04月05日 16:00
  • 750

利用QT制作自定义控件

1.         首先利用QT crearot 创建一个自定义控件项目,在创建的过程中要指明创建的类和创建的类的实例名称。这样在以后使用的过程中可以直接使用。此处还得指明icon图标文件为了在de...
  • qqyanchong
  • qqyanchong
  • 2011年04月29日 16:17
  • 4504

在C#中制作组合控件

在C#中制作组合控件丽水市汽车运输集团有限公司信息中心 苟安廷我们通常通过文本框、组合框等控件获取用户的数据输入,为告诉用户当前需要输入的内容,通常还要在上面加一个提示用的标签,如:姓名 ...
  • gatr
  • gatr
  • 2005年02月03日 10:39
  • 4923

C#制作activeX控件

背景 最近需要做web实时播放摄像头视频的管理网站,而设备提供的接口则是需要提供控件句柄,java语言获取控件句柄不太会,只好考虑利用C#将控件做成activeX嵌入网页中。 开发步骤 1.利用...
  • qqliveapple
  • qqliveapple
  • 2015年12月23日 19:49
  • 887

WPF 定义自己的控件

最近在研究怎么制作自己的控件,制作好了之后给别人用,别人只需要修改控件的相关属性就可以适应他的需求,而无需去修改控件的模板。先上图再解释。 以下是我自己制作的控件截图: 温度计: 模拟微信文...
  • lishuangquan1987
  • lishuangquan1987
  • 2017年05月18日 19:41
  • 534
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Data-Browse型Data-Aware控件的制作
举报原因:
原因补充:

(最多只允许输入30个字)