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 + -
显示快捷键?