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;

你可能感兴趣的:(VCL类学习之(九) TDataModule)