afforms.pas

来自「delphi编程控件」· PAS 代码 · 共 1,231 行 · 第 1/3 页

PAS
1,231
字号
unit afforms;
(*
 COPYRIGHT (c) RSD Software 1997 - 98
 All Rights Reserved.
*)

interface

uses Classes, SysUtils, Windows, Controls, adbtempl, stdctrls, DB, Graphics,
  ExtCtrls, ComCtrls, Forms;

{$I aclver.inc}

type
TCustomAutoFilterForm = class;
TAutoFilterFields = class;
TAutoFilterField = class;

TFilterFieldValue = (ffvFont, ffvAlignment, ffvCaption);
TFilterFieldValues = set of TFilterFieldValue;

TFilterFieldClass = class of TAutoFilterField;

TAutoFilterField = class(TCollectionItem)
private
  FField : TField;
  FFieldName : string;
  FFont : TFont;
  FAlignment : TAlignment;
  FCaption : String;
  FAssignedValues : TFilterFieldValues;

  function GetAlignment : TAlignment;
  function GetCaption : String;
  function GetField : TField;
  function GetFont : TFont;

  function GetDBDefControl : TAutoDBDefControl;

  function IsAlignmentStored : Boolean;
  function IsCaptionStored : Boolean;
  function IsFontStored : Boolean;

  procedure SetAlignment(Value : TAlignment);
  procedure SetCaption(Value : String);
  procedure SetField(Value : TField);
  procedure SetFieldName(const Value : String);
  procedure SetFont(Value : TFont);
protected
  function  GetFilterForm : TCustomAutoFilterForm;
  procedure RefreshDefaultFont;
public
  constructor Create(Collection : TCollection); override;
  destructor Destroy; override;
  procedure Assign(Source : TPersistent); override;

  function DefaultAlignment : TAlignment;
  function DefaultCaption : String;
  function DefaultFont : TFont;

  procedure RestoreDefaults;

  property AssignedValues : TFilterFieldValues read FAssignedValues;
  property DBDefControl : TAutoDBDefControl read GetDBDefControl;
  property Field : TField read GetField write SetField;
  property FilterForm : TCustomAutoFilterForm read GetFilterForm;
published
  property  Alignment : TAlignment read GetAlignment write SetAlignment
     stored IsAlignmentStored;
  property Caption : String read GetCaption write SetCaption stored IsCaptionStored;
  property FieldName : String read FFieldName write SetFieldName;
  property Font : TFont read GetFont write SetFont stored IsFontStored;
end;

TAutoFilterFields = class(TCollection)
private
  FFilterForm : TCustomAutoFilterForm;

  function GetField(Index : Integer): TAutoFilterField;
  procedure SetField(Index : Integer; Value : TAutoFilterField);
public
  constructor Create(AFilterForm : TCustomAutoFilterForm);
  function Add : TAutoFilterField;
  procedure Assign(Source: TPersistent); override;
  procedure RestoreDefaults;
  procedure RebuildFields;
  property FilterForm : TCustomAutoFilterForm read FFilterForm;
  property Items[Index : Integer]: TAutoFilterField read GetField write SetField; default;
end;

TAutoFilterFormCloseEvent = procedure(Sender : TObject; AClose : Boolean) of object;

TFilterTabControl = class(TTabControl);
TFilterScrollBox = class(TScrollBox);

TCustomAutoFilterForm = class(TComponent)
private
  FCaption : String;
  FDataSet : TDataSet;
  FActive : Boolean;
  FFilterFields : TAutoFilterFields;
  FLabelAlignment : TAlignment;
  FLabelFont : TFont;
  FRepository : TAutoRepository;
  TabControl : TFilterTabControl;
  ScrollBox : TFilterScrollBox;
  FMaxPageNumber : Integer;
  FShowEvent : TNotifyEvent;
  FCloseEvent : TAutoFilterFormCloseEvent;

  function GetIsFilterForm : Boolean;
  procedure SetActive(Value : Boolean);
  procedure SetDataSet(Value : TDataSet);
  procedure SetLabelFont(Value : TFont);
  procedure SetFilterFields(Value : TAutoFilterFields);
protected
  function GetFilter : String;
  procedure BeforeShow; virtual;
  procedure DataSetChanged; virtual;

  property Active : Boolean read FActive write SetActive;
  property Caption : String read FCaption write FCaption;
public
  constructor Create(AOwner : TComponent); override;
  destructor Destroy; override;
  procedure Notification(AComponent: TComponent; Operation: TOperation); override;

  procedure CloseUp(Accept : Boolean); virtual;
  procedure Show;

  property DataSet : TDataSet read FDataSet write SetDataSet;
  property FilterFields : TAutoFilterFields read FFilterFields write SetFilterFields;
  property LabelAlignment : TAlignment read FLabelAlignment write FLabelAlignment;
  property LabelFont : TFont read FLabelFont write SetLabelFont;
  property Repository : TAutoRepository read FRepository write FRepository;
  property OnShow : TNotifyEvent read FShowEvent write FShowEvent;
  property OnClose : TAutoFilterFormCloseEvent read FCloseEvent write FCloseEvent;


  property IsFilterForm : Boolean read GetIsFilterForm;
end;

TAutoLocateForm = class(TCustomAutoFilterForm)
public
  procedure CloseUp(Accept : Boolean); override;
published
  property Active;
  property Caption;
  property DataSet;
  property FilterFields;
  property LabelAlignment;
  property LabelFont;
  property Repository;
  property OnShow;
  property OnClose;
end;

TAutoFilterForm = class;

TAutoFilterFormDataLink = class(TDataLink)
private
  FFilterForm : TAutoFilterForm;
protected
  procedure ActiveChanged; override;
end;

TAutoFilterForm = class(TCustomAutoFilterForm)
private
  FListValues : TList;
  FDataLink : TAutoFilterFormDataLink;
  FDataSource : TDataSource;

  procedure SaveFieldValues;
  procedure RestoreFieldValues;
  procedure ClearValues;  
protected
  procedure BeforeShow; override;
  procedure DataSetChanged; override;  
public
  constructor Create(AOwner : TComponent); override;
  destructor Destroy; override;
  procedure CloseUp(Accept : Boolean); override;
published
  property Active;
  property Caption;
  property DataSet;
  property FilterFields;
  property LabelAlignment;
  property LabelFont;
  property Repository;
  property OnShow;
  property OnClose;
end;

implementation

uses agraphic, autostrs, adefctrl, audbstrs
  {$IFNDEF DELPHI3_0}, DBTables {$ENDIF};

Const
  FormBorderSize = 10;
  FormComboBoxWidth = 75;

type
TAutoFilterFieldValue = class
public
  Field : TField;
  PageIndex : Integer;
  ComboIndex : Integer;
  Value1 : Variant;
  Value2 : Variant;  
end;  

{TAutoFilterField}
constructor TAutoFilterField.Create(Collection : TCollection);
begin
  inherited Create(Collection);

  FCaption := LoadStr(ACDB_NEWFIELD);
  FFont := TFont.Create;
  RestoreDefaults;
end;

destructor TAutoFilterField.Destroy;
begin
  FFont.Free;
  inherited Destroy;
end;

procedure TAutoFilterField.Assign(Source : TPersistent);
Var
  AField : TAutoFilterField;
begin
  if(Source is TAutoFilterField) then begin
    AField := Source as TAutoFilterField;
    FField := AField.FField;
    FFieldName := AField.FFieldName;
    FFont.Assign(AField.FFont);
    FAlignment := AField.FAlignment;
    FCaption := AField.FCaption;
    FAssignedValues := AField.FAssignedValues;
  end else inherited Assign(Source);
end;

function  TAutoFilterField.DefaultAlignment : TAlignment;
begin
  if Assigned(Field) then
    Result := FField.Alignment
  else
    Result := FilterForm.LabelAlignment;
end;

function  TAutoFilterField.DefaultCaption : String;
begin
  if Assigned(Field) then
    Result := FField.DisplayLabel
  else Result := LoadStr(ACDB_NEWFIELD);
end;

function  TAutoFilterField.DefaultFont : TFont;
begin
  Result := FilterForm.LabelFont;
end;

procedure TAutoFilterField.RestoreDefaults;
begin
  FAssignedValues := [];
  RefreshDefaultFont;
  FAlignment := DefaultAlignment;
end;

function  TAutoFilterField.GetFilterForm : TCustomAutoFilterForm;
begin
  Result := TAutoFilterFields(Collection).FilterForm;
end;

procedure TAutoFilterField.RefreshDefaultFont;
begin
  if Not (ffvFont in FAssignedValues) then
     FFont.Assign(DefaultFont);
end;

function  TAutoFilterField.GetAlignment : TAlignment;
begin
  if ffvAlignment in FAssignedValues then
    Result := FAlignment
  else Result := DefaultAlignment;
end;

function  TAutoFilterField.GetCaption : String;
begin
  if ffvCaption in FAssignedValues then
    Result := FCaption
  else Result := DefaultCaption;
end;

function  TAutoFilterField.GetField : TField;
begin
  if (FField = Nil) And (Length(FFieldName) > 0)
  And Assigned(FilterForm.DataSet) then
  with FilterForm.Dataset do
    if Active Or (Not DefaultFields) then
      SetField(FindField(FieldName));
  Result := FField;
end;

function  TAutoFilterField.GetFont : TFont;
begin
  if ffvFont in FAssignedValues then
    Result := FFont
  else Result := DefaultFont;
end;

function TAutoFilterField.GetDBDefControl : TAutoDBDefControl;
begin
  Result := adefctrl.GetDBDefControl(FilterForm.Repository, Field);
end;

function  TAutoFilterField.IsAlignmentStored : Boolean;
begin
  Result := (ffvAlignment in FAssignedValues) And (FAlignment <> DefaultAlignment);
end;

function  TAutoFilterField.IsCaptionStored : Boolean;
begin
  Result := (ffvCaption in FAssignedValues) And (FCaption <> DefaultCaption);
end;

function  TAutoFilterField.IsFontStored : Boolean;
begin
  Result := (ffvFont in FAssignedValues) And (FFont <> DefaultFont);
end;

procedure TAutoFilterField.SetAlignment(Value : TAlignment);
begin
  if Not ((ffvAlignment in FAssignedValues) And (Value = FAlignment)) then begin
    FAlignment := Value;
    Include(FAssignedValues, ffvAlignment);
  end;  
end;

procedure TAutoFilterField.SetCaption(Value : String);
begin
  if Not ((ffvCaption in FAssignedValues) And (Value = FCaption)) then begin
    FCaption := Value;
    Include(FAssignedValues, ffvCaption);
  end;
end;

procedure TAutoFilterField.SetField(Value : TField);
begin
  if FField = Value then exit;
  FField := Value;
  if Assigned(Value) then
    FFieldName := Value.FieldName;
end;

procedure TAutoFilterField.SetFieldName(const Value : String);
Var
  AField: TField;
begin
  AField := nil;
  if Assigned(FilterForm.DataSet) And (Length(Value) > 0)
  And Not (csLoading in FilterForm.ComponentState) then
   AField := FilterForm.DataSet.FindField(Value);
  FFieldName := Value;
  SetField(AField);
end;

procedure TAutoFilterField.SetFont(Value : TFont);
begin
  FFont.Assign(Value);
  Include(FAssignedValues, ffvFont);
end;

{TAutoFilterFields}
constructor TAutoFilterFields.Create(AFilterForm : TCustomAutoFilterForm);
begin
  inherited Create(TAutoFilterField);
  FFilterForm := AFilterForm;
end;

function TAutoFilterFields.Add : TAutoFilterField;
begin
  Result := TAutoFilterField(inherited Add);
end;

procedure TAutoFilterFields.Assign(Source: TPersistent);
Var
  AFields : TAutoFilterFields;
  AField : TAutoFilterField;
  i : Integer;
begin
  if(Source is TAutoFilterFields) then begin
    AFields := Source as TAutoFilterFields;
    Clear;
    for i := 0 to AFields.Count - 1 do begin
      AField := Add;
      AField.Assign(AFields[i]);
    end;
  end else inherited Assign(Source);
end;

function TAutoFilterFields.GetField(Index : Integer): TAutoFilterField;
begin
  Result := TAutoFilterField(inherited Items[Index]);
end;

procedure TAutoFilterFields.SetField(Index : Integer; Value : TAutoFilterField);
begin
  Items[Index].Assign(Value);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?