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.
- { TDataModule }
- TDataModule = class(TComponent)
- private
- FDesignSize: TPoint;
- FDesignOffset: TPoint;
- FOnCreate: TNotifyEvent;
- FOnDestroy: TNotifyEvent;
- FOldCreateOrder: Boolean;
- procedure ReadHeight(Reader: TReader);
- procedure ReadHorizontalOffset(Reader: TReader);
- procedure ReadVerticalOffset(Reader: TReader);
- procedure ReadWidth(Reader: TReader);
- procedure WriteWidth(Writer: TWriter);
- procedure WriteHorizontalOffset(Writer: TWriter);
- procedure WriteVerticalOffset(Writer: TWriter);
- procedure WriteHeight(Writer: TWriter);
- protected
- procedure DoCreate; virtual;
- procedure DoDestroy; virtual;
- procedure DefineProperties(Filer: TFiler); override;
- procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
- function HandleCreateException: Boolean; dynamic;
- procedure ReadState(Reader: TReader); override;
- public
- constructor Create(AOwner: TComponent); override;
- constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); virtual;
- destructor Destroy; override;
- procedure AfterConstruction; override;
- procedure BeforeDestruction; override;
- property DesignOffset: TPoint read FDesignOffset write FDesignOffset;
- property DesignSize: TPoint read FDesignSize write FDesignSize;
- published
- property OldCreateOrder: Boolean read FOldCreateOrder write FOldCreateOrder;
- property OnCreate: TNotifyEvent read FOnCreate write FOnCreate;
- property OnDestroy: TNotifyEvent read FOnDestroy write FOnDestroy;
- end;
- { TDataModule }
- constructor TDataModule.Create(AOwner: TComponent);
- begin
- GlobalNameSpace.BeginWrite;
- try
- CreateNew(AOwner);
- if (ClassType <> TDataModule) and not (csDesigning in ComponentState) then
- begin
- if not InitInheritedComponent(Self, TDataModule) then
- raise EResNotFound.CreateFmt(SResNotFound, [ClassName]);
- if OldCreateOrder then DoCreate;
- end;
- finally
- GlobalNameSpace.EndWrite;
- end;
- end;
- procedure TDataModule.AfterConstruction;
- begin
- if not OldCreateOrder then DoCreate;
- end;
- constructor TDataModule.CreateNew(AOwner: TComponent; Dummy: Integer);
- begin
- inherited Create(AOwner);
- if Assigned(AddDataModule) and (Dummy >= 0) then
- AddDataModule(Self);
- end;
- procedure TDataModule.BeforeDestruction;
- begin
- GlobalNameSpace.BeginWrite;
- Destroying;
- RemoveFixupReferences(Self, '');
- if not OldCreateOrder then DoDestroy;
- end;
- destructor TDataModule.Destroy;
- begin
- if not (csDestroying in ComponentState) then GlobalNameSpace.BeginWrite;
- try
- if OldCreateOrder then DoDestroy;
- if Assigned(RemoveDataModule) then
- RemoveDataModule(Self);
- inherited Destroy;
- finally
- GlobalNameSpace.EndWrite;
- end;
- end;
- procedure TDataModule.DoCreate;
- begin
- if Assigned(FOnCreate) then
- try
- FOnCreate(Self);
- except
- if not HandleCreateException then
- raise;
- end;
- end;
- procedure TDataModule.DoDestroy;
- begin
- if Assigned(FOnDestroy) then
- try
- FOnDestroy(Self);
- except
- if Assigned(ApplicationHandleException) then
- ApplicationHandleException(Self);
- end;
- end;
- procedure TDataModule.DefineProperties(Filer: TFiler);
- var
- Ancestor: TDataModule;
- function DoWriteWidth: Boolean;
- begin
- Result := True;
- if Ancestor <> nil then Result := FDesignSize.X <> Ancestor.FDesignSize.X;
- end;
- function DoWriteHorizontalOffset: Boolean;
- begin
- if Ancestor <> nil then
- Result := FDesignOffset.X <> Ancestor.FDesignOffset.X else
- Result := FDesignOffset.X <> 0;
- end;
- function DoWriteVerticalOffset: Boolean;
- begin
- if Ancestor <> nil then
- Result := FDesignOffset.Y <> Ancestor.FDesignOffset.Y else
- Result := FDesignOffset.Y <> 0;
- end;
- function DoWriteHeight: Boolean;
- begin
- Result := True;
- if Ancestor <> nil then Result := FDesignSize.Y <> Ancestor.FDesignSize.Y;
- end;
- begin
- inherited DefineProperties(Filer);
- Ancestor := TDataModule(Filer.Ancestor);
- Filer.DefineProperty('Height', ReadHeight, WriteHeight, DoWriteHeight);
- Filer.DefineProperty('HorizontalOffset', ReadHorizontalOffset,
- WriteHorizontalOffset, DoWriteHorizontalOffset);
- Filer.DefineProperty('VerticalOffset', ReadVerticalOffset,
- WriteVerticalOffset, DoWriteVerticalOffset);
- Filer.DefineProperty('Width', ReadWidth, WriteWidth, DoWriteWidth);
- end;
- procedure TDataModule.GetChildren(Proc: TGetChildProc; Root: TComponent);
- var
- I: Integer;
- OwnedComponent: TComponent;
- begin
- inherited GetChildren(Proc, Root);
- if Root = Self then
- for I := 0 to ComponentCount - 1 do
- begin
- OwnedComponent := Components[I];
- if not OwnedComponent.HasParent then Proc(OwnedComponent);
- end;
- end;
- function TDataModule.HandleCreateException: Boolean;
- begin
- if Assigned(ApplicationHandleException) then
- begin
- ApplicationHandleException(Self);
- Result := True;
- end
- else
- Result := False;
- end;
- procedure TDataModule.ReadState(Reader: TReader);
- begin
- FOldCreateOrder := not ModuleIsCPP;
- inherited ReadState(Reader);
- end;
- procedure TDataModule.ReadWidth(Reader: TReader);
- begin
- FDesignSize.X := Reader.ReadInteger;
- end;
- procedure TDataModule.ReadHorizontalOffset(Reader: TReader);
- begin
- FDesignOffset.X := Reader.ReadInteger;
- end;
- procedure TDataModule.ReadVerticalOffset(Reader: TReader);
- begin
- FDesignOffset.Y := Reader.ReadInteger;
- end;
- procedure TDataModule.ReadHeight(Reader: TReader);
- begin
- FDesignSize.Y := Reader.ReadInteger;
- end;
- procedure TDataModule.WriteWidth(Writer: TWriter);
- begin
- Writer.WriteInteger(FDesignSize.X);
- end;
- procedure TDataModule.WriteHorizontalOffset(Writer: TWriter);
- begin
- Writer.WriteInteger(FDesignOffset.X);
- end;
- procedure TDataModule.WriteVerticalOffset(Writer: TWriter);
- begin
- Writer.WriteInteger(FDesignOffset.Y);
- end;
- procedure TDataModule.WriteHeight(Writer: TWriter);
- begin
- Writer.WriteInteger(FDesignSize.Y);
- end;