VCL类学习之(九) TDataModule

TDataModule centralizes the handling of nonvisual components in an application.
Unit
Classes
Description
Use a TDataModule object in an application to provide a location for centralized handling of nonvisual components. Typically these are data access components, such as TSQLDataSet, and TSQLConnection. DataModules are not limited to data access components, they can also contain other nonvisual components, such as TTimer, TOpenDialog, or TImageList).
At design time a TDataModule object provides a visual container into which a developer can place nonvisual components, set their properties, and write event handlers for them. To create a data module at design time, choose File | New Data Module.
In the unit file for the data module a developer may also place any business rules that are to be applied to the application.
To make the data module available to another unit in the application, select that unit, then choose File|Use Unit (when working in Delphi) or File|Include Unit Header (when working in C++) to add the data module to the uses clause for the unit.
  1. { TDataModule }
  2.   TDataModule = class(TComponent)
  3.   private
  4.     FDesignSize: TPoint;
  5.     FDesignOffset: TPoint;
  6.     FOnCreate: TNotifyEvent;
  7.     FOnDestroy: TNotifyEvent;
  8.     FOldCreateOrder: Boolean;
  9.     procedure ReadHeight(Reader: TReader);
  10.     procedure ReadHorizontalOffset(Reader: TReader);
  11.     procedure ReadVerticalOffset(Reader: TReader);
  12.     procedure ReadWidth(Reader: TReader);
  13.     procedure WriteWidth(Writer: TWriter);
  14.     procedure WriteHorizontalOffset(Writer: TWriter);
  15.     procedure WriteVerticalOffset(Writer: TWriter);
  16.     procedure WriteHeight(Writer: TWriter);
  17.   protected
  18.     procedure DoCreate; virtual;
  19.     procedure DoDestroy; virtual;
  20.     procedure DefineProperties(Filer: TFiler); override;
  21.     procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
  22.     function HandleCreateException: Boolean; dynamic;
  23.     procedure ReadState(Reader: TReader); override;
  24.   public
  25.     constructor Create(AOwner: TComponent); override;
  26.     constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); virtual;
  27.     destructor Destroy; override;
  28.     procedure AfterConstruction; override;
  29.     procedure BeforeDestruction; override;
  30.     property DesignOffset: TPoint read FDesignOffset write FDesignOffset;
  31.     property DesignSize: TPoint read FDesignSize write FDesignSize;
  32.   published
  33.     property OldCreateOrder: Boolean read FOldCreateOrder write FOldCreateOrder;
  34.     property OnCreate: TNotifyEvent read FOnCreate write FOnCreate;
  35.     property OnDestroy: TNotifyEvent read FOnDestroy write FOnDestroy;
  36.   end;
  37. { TDataModule }
  38. constructor TDataModule.Create(AOwner: TComponent);
  39. begin
  40.   GlobalNameSpace.BeginWrite;
  41.   try
  42.     CreateNew(AOwner);
  43.     if (ClassType <> TDataModule) and not (csDesigning in ComponentState) then
  44.     begin
  45.       if not InitInheritedComponent(Self, TDataModule) then
  46.         raise EResNotFound.CreateFmt(SResNotFound, [ClassName]);
  47.       if OldCreateOrder then DoCreate;
  48.     end;
  49.   finally
  50.     GlobalNameSpace.EndWrite;
  51.   end;
  52. end;
  53. procedure TDataModule.AfterConstruction;
  54. begin
  55.   if not OldCreateOrder then DoCreate;
  56. end;
  57. constructor TDataModule.CreateNew(AOwner: TComponent; Dummy: Integer);
  58. begin
  59.   inherited Create(AOwner);
  60.   if Assigned(AddDataModule) and (Dummy >= 0then
  61.     AddDataModule(Self);
  62. end;
  63. procedure TDataModule.BeforeDestruction;
  64. begin
  65.   GlobalNameSpace.BeginWrite;
  66.   Destroying;
  67.   RemoveFixupReferences(Self, '');
  68.   if not OldCreateOrder then DoDestroy;
  69. end;
  70. destructor TDataModule.Destroy;
  71. begin
  72.   if not (csDestroying in ComponentState) then GlobalNameSpace.BeginWrite;
  73.   try
  74.     if OldCreateOrder then DoDestroy;
  75.     if Assigned(RemoveDataModule) then
  76.       RemoveDataModule(Self);
  77.     inherited Destroy;
  78.   finally
  79.     GlobalNameSpace.EndWrite;
  80.   end;
  81. end;
  82. procedure TDataModule.DoCreate;
  83. begin
  84.   if Assigned(FOnCreate) then
  85.   try
  86.     FOnCreate(Self);
  87.   except
  88.     if not HandleCreateException then
  89.       raise;
  90.   end;
  91. end;
  92. procedure TDataModule.DoDestroy;
  93. begin
  94.   if Assigned(FOnDestroy) then
  95.   try
  96.     FOnDestroy(Self);
  97.   except
  98.     if Assigned(ApplicationHandleException) then
  99.       ApplicationHandleException(Self);
  100.   end;
  101. end;
  102. procedure TDataModule.DefineProperties(Filer: TFiler);
  103. var
  104.   Ancestor: TDataModule;
  105.   function DoWriteWidth: Boolean;
  106.   begin
  107.     Result := True;
  108.     if Ancestor <> nil then Result := FDesignSize.X <> Ancestor.FDesignSize.X;
  109.   end;
  110.   function DoWriteHorizontalOffset: Boolean;
  111.   begin
  112.     if Ancestor <> nil then
  113.       Result := FDesignOffset.X <> Ancestor.FDesignOffset.else
  114.       Result := FDesignOffset.X <> 0;
  115.   end;
  116.   function DoWriteVerticalOffset: Boolean;
  117.   begin
  118.     if Ancestor <> nil then
  119.       Result := FDesignOffset.Y <> Ancestor.FDesignOffset.else
  120.       Result := FDesignOffset.Y <> 0;
  121.   end;
  122.   function DoWriteHeight: Boolean;
  123.   begin
  124.     Result := True;
  125.     if Ancestor <> nil then Result := FDesignSize.Y <> Ancestor.FDesignSize.Y;
  126.   end;
  127. begin
  128.   inherited DefineProperties(Filer);
  129.   Ancestor := TDataModule(Filer.Ancestor);
  130.   Filer.DefineProperty('Height', ReadHeight, WriteHeight, DoWriteHeight);
  131.   Filer.DefineProperty('HorizontalOffset', ReadHorizontalOffset,
  132.     WriteHorizontalOffset, DoWriteHorizontalOffset);
  133.   Filer.DefineProperty('VerticalOffset', ReadVerticalOffset,
  134.     WriteVerticalOffset, DoWriteVerticalOffset);
  135.   Filer.DefineProperty('Width', ReadWidth, WriteWidth, DoWriteWidth);
  136. end;
  137. procedure TDataModule.GetChildren(Proc: TGetChildProc; Root: TComponent);
  138. var
  139.   I: Integer;
  140.   OwnedComponent: TComponent;
  141. begin
  142.   inherited GetChildren(Proc, Root);
  143.   if Root = Self then
  144.     for I := 0 to ComponentCount - 1 do
  145.     begin
  146.       OwnedComponent := Components[I];
  147.       if not OwnedComponent.HasParent then Proc(OwnedComponent);
  148.     end;
  149. end;
  150. function TDataModule.HandleCreateException: Boolean;
  151. begin
  152.   if Assigned(ApplicationHandleException) then
  153.   begin
  154.     ApplicationHandleException(Self);
  155.     Result := True;
  156.   end
  157.   else
  158.     Result := False;
  159. end;
  160. procedure TDataModule.ReadState(Reader: TReader);
  161. begin
  162.   FOldCreateOrder := not ModuleIsCPP;
  163.   inherited ReadState(Reader);
  164. end;
  165. procedure TDataModule.ReadWidth(Reader: TReader);
  166. begin
  167.   FDesignSize.X := Reader.ReadInteger;
  168. end;
  169. procedure TDataModule.ReadHorizontalOffset(Reader: TReader);
  170. begin
  171.   FDesignOffset.X := Reader.ReadInteger;
  172. end;
  173. procedure TDataModule.ReadVerticalOffset(Reader: TReader);
  174. begin
  175.   FDesignOffset.Y := Reader.ReadInteger;
  176. end;
  177. procedure TDataModule.ReadHeight(Reader: TReader);
  178. begin
  179.   FDesignSize.Y := Reader.ReadInteger;
  180. end;
  181. procedure TDataModule.WriteWidth(Writer: TWriter);
  182. begin
  183.   Writer.WriteInteger(FDesignSize.X);
  184. end;
  185. procedure TDataModule.WriteHorizontalOffset(Writer: TWriter);
  186. begin
  187.   Writer.WriteInteger(FDesignOffset.X);
  188. end;
  189. procedure TDataModule.WriteVerticalOffset(Writer: TWriter);
  190. begin
  191.   Writer.WriteInteger(FDesignOffset.Y);
  192. end;
  193. procedure TDataModule.WriteHeight(Writer: TWriter);
  194. begin
  195.   Writer.WriteInteger(FDesignSize.Y);
  196. end;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值