adbtempl.pas
来自「delphi编程控件」· PAS 代码 · 共 898 行 · 第 1/2 页
PAS
898 行
unit adbtempl;
(*
COPYRIGHT (c) RSD Software 1997 - 98
All Rights Reserved.
*)
{$I aclver.inc}
interface
uses Classes, SysUtils, Windows, Graphics, DB, Controls, TypInfo
{$IFDEF DELPHI4}, DsgnIntf{$ENDIF};
type
TAutoRepository = class;
TAutoRepositoryChild = class;
TAutoDBDefControl = class;
TAutoDefDataSets = class;
TAutoDefDataSet = class;
TAutoDefFields = class;
TAutoDefField = class(TCollectionItem)
private
FFieldName : String;
FDBDefControl : TAutoDBDefControl;
function GetField : TField;
procedure SetDBDefControl(Value : TAutoDBDefControl);
procedure SetFieldName(Value : String);
function GetDefDataSet : TAutoDefDataSet;
public
constructor Create(Collection : TCollection); override;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
property DefDataSet : TAutoDefDataSet read GetDefDataSet;
property Field : TField read GetField;
published
property DataField : String read FFieldName write SetFieldName;
property DBDefControl : TAutoDBDefControl read FDBDefControl write SetDBDefControl;
end;
TAutoDefFields = class(TCollection)
private
FOwner : TAutoDefDataSet;
function GetItem(Index : Integer) : TAutoDefField;
procedure SetItem(Index : Integer; Value : TAutoDefField);
protected
procedure Update(Item: TCollectionItem); override;
public
constructor Create(AOwner : TAutoDefDataSet);
function Add : TAutoDefField;
function GetDefField(DataField : String) : TAutoDefField;
property Items[Index : Integer] : TAutoDefField read GetItem
write SetItem; default;
end;
TAutoDefDataSet = class(TCollectionItem)
private
FDataSet : TDataSet;
FDefFields : TAutoDefFields;
Destroying : Boolean;
function GetDefFieldCount : Integer;
procedure SetDataSet(Value : TDataSet);
procedure SetDefFields(Value : TAutoDefFields);
public
constructor Create(Collection : TCollection); override;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
property Count : Integer read GetDefFieldCount;
published
property DataSet : TDataSet read FDataSet write SetDataSet;
property DefFields : TAutoDefFields read FDefFields
write SetDefFields;
end;
TAutoDefDataSets = class(TCollection)
private
FOwner : TAutoRepository;
function GetItem(Index : Integer) : TAutoDefDataSet;
procedure SetItem(Index : Integer; Value : TAutoDefDataSet);
protected
procedure Update(Item: TCollectionItem); override;
procedure RemoveDataSet(ADataSet : TDataSet);
public
constructor Create(AOwner : TAutoRepository);
function GetDefDataSet(ADataSet : TDataSet) : TAutoDefDataSet;
function Add : TAutoDefDataSet;
property Items[Index : Integer] : TAutoDefDataSet read GetItem write SetItem; default;
end;
TAutoRepositoryChild = class(TComponent)
private
FRepository : TAutoRepository;
FOnChangeName : TNotifyEvent;
procedure SetRepository(Value : TAutoRepository);
protected
procedure ReadState(Reader: TReader); override;
procedure SetParentComponent(AParent: TComponent); override;
procedure SetName(const Value: TComponentName); override;
function GetDataSet : TDataSet; dynamic;
procedure RemoveFromRepository(Value : TAutoRepository); virtual; abstract;
procedure AddToRepository(Value : TAutoRepository); virtual; abstract;
public
function GetParentComponent : TComponent; override;
function HasParent: Boolean; override;
property Repository : TAutoRepository read FRepository write SetRepository;
property OnChangeName : TNotifyEvent read FOnChangeName write FOnChangeName;
end;
TAutoDBDefControlClass = class of TAutoDBDefControl;
TAutoDBDefControlType = (adctUnknown, adctMaskEdit, adctBtnEdit, adctMemo,
adctImage, adctListBox, adctComboBox, adctCheckBox,
adctRadioGroup, adctLookupListBox, adctLookupComboBox,
adctReference, adctDate{, adctDateTime}, adctTime,
adctSpinImage, adctImageCombo, adctImageList, adctCustomControl);
TAutoDBDefParentType = (adptUnknown, adptGrid, adptPanel, adptFilter);
TAutoDBDefControl = class(TAutoRepositoryChild)
private
protected
FDefControlType : TAutoDBDefControlType;
FIsDefault : Boolean;
procedure RemoveFromRepository(Value : TAutoRepository); override;
procedure AddToRepository(Value : TAutoRepository); override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function CreateDBControl(AParent : TWinControl; ADataSource : TDataSource;
AField : String) : TWinControl; virtual;
function CreateGridInplaceControl(AParent : TWinControl; ADataSource : TDataSource;
AField : String) : TWinControl; virtual;
function CreateFilterControl(AParent : TWinControl; AField : TField) : TWinControl; virtual;
function CreateLocateControl(AParent : TWinControl; AField : TField;
ACaseInsensitive : Boolean) : TWinControl; virtual;
procedure DestroyControl(Value : TWinControl); virtual;
function GetFilterControlValue(AControl : TWinControl) : Variant; virtual;
procedure SetFilterControlValue(AControl : TWinControl; Value : Variant); virtual;
function UseMaxGridHeight : Boolean; virtual;
procedure DrawOnGridCanvas(ACanvas : TCanvas; AFont : TFont; ARect : TRect;
AAlignment : TAlignment; AField : TField; Selected : Boolean); virtual;
property DBDefControlType : TAutoDBDefControlType read FDefControlType;
property IsDefault : Boolean read FIsDefault;
end;
TAutoRepositoryDeleteDefFieldEvent = procedure(Sender : TObject;
DefField : TAutoDefField) of object;
TAutoRepository = class(TComponent)
private
FListDefControls : TList;
FListDefGrids : TList;
FListDefPanels : TList;
FLinks : TList;
FDefDataSets : TAutoDefDataSets;
FOnDeleteDefField : TAutoRepositoryDeleteDefFieldEvent;
function GetDefDataSetCount : Integer;
function GetDBDefControlCount : Integer;
function GetGridTemplateCount : Integer;
function GetPanelTemplateCount : Integer;
function GetDBDefControl(Index : Integer) : TAutoDBDefControl;
function GetGridTemplate(Index : Integer) : TAutoRepositoryChild;
function GetPanelTemplate(Index : Integer) : TAutoRepositoryChild;
procedure SetDefDataSets(Value : TAutoDefDataSets);
procedure AddDBDefControl(ADBDefControl : TAutoDBDefControl);
procedure DestroyDBDefControls;
procedure RemoveDBDefControl(ADBDefControl : TAutoDBDefControl);
procedure RemoveDBDefControlFields(ADBDefControl : TAutoDBDefControl);
protected
{$IFDEF DELPHI3_0}
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
{$ELSE}
procedure GetChildren(Proc: TGetChildProc); override;
{$ENDIF}
procedure SetName(const Value: TComponentName); override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
public
{$IFDEF DELPHI4}
Designer : IFormDesigner;
{$ELSE}
Designer : Pointer;
{$ENDIF}
DesignerForm : TComponent;
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
function CreateDBDefControl(AControlType : TAutoDBDefControlType) : TAutoDBDefControl;
procedure AddObjectLink(AControl : TObject);
procedure DestroyObjectLink(AControl : TObject);
function CreateGridTemplate : TAutoRepositoryChild;
procedure AddGridTemplate(AGridTemplate : TAutoRepositoryChild);
procedure DestroyGridTemplates;
procedure RemoveGridTemplate(AGridTemplate : TAutoRepositoryChild);
function CreatePanelTemplate : TAutoRepositoryChild;
procedure AddPanelTemplate(APanelTemplate : TAutoRepositoryChild);
procedure DestroyPanelTemplates;
procedure RemovePanelTemplate(APanelTemplate : TAutoRepositoryChild);
function GetGridTemplateByDataSet(ADataSet : TDataSet) : TAutoRepositoryChild;
procedure GetGridTemplatesByDataSet(ADataSet : TDataSet; AList : TList);
function GetPanelTemplateByDataSet(ADataSet : TDataSet) : TAutoRepositoryChild;
procedure GetPanelTemplatesByDataSet(ADataSet : TDataSet; AList : TList);
property DefDataSetCount : Integer read GetDefDataSetCount;
property DBDefControlCount : Integer read GetDBDefControlCount;
property GridTemplateCount : Integer read GetGridTemplateCount;
property PanelTemplateCount : Integer read GetPanelTemplateCount;
property DBDefControls[Index : Integer] : TAutoDBDefControl read GetDBDefControl;
property GridTemplates[Index : Integer] : TAutoRepositoryChild read GetGridTemplate;
property PanelTemplates[Index : Integer] : TAutoRepositoryChild read GetPanelTemplate;
published
property DefDataSets : TAutoDefDataSets read FDefDataSets write SetDefDataSets;
property OnDeleteDefField : TAutoRepositoryDeleteDefFieldEvent
read FOnDeleteDefField write FOnDeleteDefField;
end;
implementation
uses adefctrl, adbgrid, adbpanel;
{TAutoDefField}
constructor TAutoDefField.Create(Collection : TCollection);
begin
inherited Create(Collection);
end;
destructor TAutoDefField.Destroy;
Var
Repository : TAutoRepository;
begin
if((DefDataSet <> Nil) And Not DefDataSet.Destroying
And (DefDataSet.Collection <> Nil)) then begin
Repository := TAutoDefDataSets(DefDataSet.Collection).FOwner;
if(Repository <> Nil) And Not (csDestroying in Repository.ComponentState)
And Assigned(Repository.FOnDeleteDefField) then
Repository.FOnDeleteDefField(Repository, self);
end;
inherited Destroy;
end;
procedure TAutoDefField.Assign(Source: TPersistent);
Var
dbDef : TAutoDefField;
begin
if(Source is TAutoDefField) then begin
dbDef := TAutoDefField(Source);
DataField := dbDef.DataField;
DBDefControl := dbDef.DBDefControl;
end else inherited Assign(Source);
end;
function TAutoDefField.GetDefDataSet : TAutoDefDataSet;
begin
if(Collection <> Nil) And (TAutoDefFields(Collection).FOwner <> Nil) then
Result := TAutoDefFields(Collection).FOwner
else Result := Nil;
end;
function TAutoDefField.GetField : TField;
Var
DS : TDataSet;
begin
Result := Nil;
if(FFieldName = '') then exit;
if(Collection <> Nil) then
DS := TAutoDefFields(Collection).FOwner.DataSet
else DS := Nil;
if(DS <> Nil)then
Result := DS.FindField(FFieldName);
end;
procedure TAutoDefField.SetDBDefControl(Value : TAutoDBDefControl);
begin
//TODO make the cheks on compability fieldtype and control
if(Value <> FDBDefControl) then begin
FDBDefControl := Value;
//TODO set notification about the changes
end;
end;
procedure TAutoDefField.SetFieldName(Value : String);
begin
if(Field = Nil) then begin
FFieldName := Value;
//TODO set notification about the changes
end;
end;
{TAutoDefFields}
constructor TAutoDefFields.Create(AOwner : TAutoDefDataSet);
begin
inherited Create(TAutoDefField);
FOwner := AOwner;
end;
function TAutoDefFields.Add : TAutoDefField;
begin
Result := TAutoDefField(inherited Add);
end;
procedure TAutoDefFields.Update(Item: TCollectionItem);
begin
// TODO
end;
function TAutoDefFields.GetItem(Index : Integer) : TAutoDefField;
begin
Result := TAutoDefField(inherited Items[Index]);
end;
procedure TAutoDefFields.SetItem(Index : Integer; Value : TAutoDefField);
begin
Items[Index].Assign(Value);
end;
function TAutoDefFields.GetDefField(DataField : String) : TAutoDefField;
Var
i : Integer;
begin
Result := Nil;
for i := 0 to Count - 1 do
if(CompareStr(DataField, Items[i].DataField) = 0) then begin
Result := Items[i];
break;
end;
end;
{TAutoDefDataSet}
constructor TAutoDefDataSet.Create(Collection : TCollection);
begin
inherited Create(Collection);
FDefFields := TAutoDefFields.Create(self);
Destroying := False;
end;
destructor TAutoDefDataSet.Destroy;
begin
Destroying := True;
FDefFields.Free;
inherited Destroy;
end;
procedure TAutoDefDataSet.Assign(Source: TPersistent);
Var
DefDS : TAutoDefDataSet;
begin
if(Source is TAutoDefDataSet) then begin
DefDS := TAutoDefDataSet(Source);
DataSet := DefDS.DataSet;
SetDefFields(DefDS.DefFields);
end
else inherited Assign(Source);
end;
function TAutoDefDataSet.GetDefFieldCount : Integer;
begin
Result := FDefFields.Count;
end;
procedure TAutoDefDataSet.SetDataSet(Value : TDataSet);
begin
if(FDataSet <> Value) then begin
if(FDataSet <> Nil) then
FDefFields.Clear;
FDataSet := Value;
end;
end;
procedure TAutoDefDataSet.SetDefFields(Value : TAutoDefFields);
begin
FDefFields.Assign(Value);
end;
{TAutoDefDataSets}
constructor TAutoDefDataSets.Create(AOwner : TAutoRepository);
begin
inherited Create(TAutoDefDataSet);
FOwner := AOwner;
end;
procedure TAutoDefDataSets.Update(Item: TCollectionItem);
begin
//TODO send notification
end;
procedure TAutoDefDataSets.RemoveDataSet(ADataSet : TDataSet);
Var
i : Integer;
ADefDataSet : TAutoDefDataSet;
begin
ADefDataSet := Nil;
for i := 0 to Count - 1 do
if(Items[i].DataSet = ADataSet) then begin
ADefDataSet := Items[i];
break;
end;
if(ADefDataSet <> Nil) then
ADefDataSet.Free;
end;
function TAutoDefDataSets.Add : TAutoDefDataSet;
begin
Result := TAutoDefDataSet(inherited Add);
end;
function TAutoDefDataSets.GetItem(Index : Integer) : TAutoDefDataSet;
begin
Result := TAutoDefDataSet(inherited Items[Index]);
end;
procedure TAutoDefDataSets.SetItem(Index : Integer; Value : TAutoDefDataSet);
begin
Items[Index].Assign(Value);
end;
function TAutoDefDataSets.GetDefDataSet(ADataSet : TDataSet) : TAutoDefDataSet;
Var
i : Integer;
begin
Result := Nil;
for i := 0 to Count - 1 do
if(Items[i].DataSet = ADataSet) then begin
Result := Items[i];
break;
end;
end;
{TAutoRepositoryChild}
function TAutoRepositoryChild.GetDataSet : TDataSet;
begin
Result := Nil;
end;
function TAutoRepositoryChild.GetParentComponent : TComponent;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?