⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sctvar.pas

📁 suite component ace report
💻 PAS
📖 第 1 页 / 共 3 页
字号:
unit SctVar;

{ ----------------------------------------------------------------
  Ace Reporter
  Copyright 1995-1998 SCT Associates, Inc.
  Written by Kevin Maher, Steve Tyrakowski
  ---------------------------------------------------------------- }

interface
{$I ace.inc}

uses  {$IFDEF WIN32} windows, {$ELSE} wintypes, winprocs, {$ENDIF}
  SysUtils, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, sctdata
  {$ifdef AceBDE} ,db,dbCtrls
     {$ifndef VCL130PLUS} ,dbtables {$endif}
  {$endif}
  ;

type

TSctVar = class;

{ TGetDataEvent }
  TGetDataEvent = procedure (oVar: TSctvar) of object;

{ TSctUpdateMode }
  TSctUpdateMode = (umNeedUpdate, umUpdating, umNoUpdate);

{ TSctVarId }
  TSctVarId = (vidAbstract, vidDBVar, vidExprVar, vidTotalVar, vidAutoDataVar
                 , vidDateTimeVar, vidPageVar);

{ TSctLevel }
TSctLevel = class(TControl)
private
  FLevel: Integer;
  FIsHeader: Boolean;
protected
  procedure SetParent(AParent: TWinControl); override;
  function GetPage: TComponent; virtual;

  procedure DefineProperties(Filer: TFiler); override;
  procedure ReadIsHeader(Reader: TReader);
  procedure WriteIsHeader( Writer: TWriter);
public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;
  property Level: Integer read FLevel write FLevel;
  property Page: TComponent read GetPage;

  property IsHeader: Boolean read FIsHeader write FIsHeader default False;

published
end;


{ TSctvar }
TSctVar = class(TControl)
private
  FDataLast, FDataNow: TSctData;
  FAutovar: Boolean;

  FDataType: TSctDataTypes;
  FUpdateMode: TSctUpdateMode;
  FUpdateLevel: TSctLevel;
  FId: TSctVarId;
  FActive: Boolean;
  FInitialized: Boolean;
  FRunning: Boolean;
protected
  procedure SetName(const NewName: TComponentName); override;
  procedure SetParent(AParent: TWinControl); override;
  procedure Loaded; override;
  procedure SetRunning(lRun: Boolean);

  procedure Notification(AComponent: TComponent;
    Operation: TOperation); override;

  function GetIsNull: Boolean;
  procedure SetIsNull(n: Boolean);

  function GetAsString: String; virtual;
  function GetAsInteger: Integer; virtual;
  function GetAsFloat: Double; virtual;
  function GetAsDateTime: TDateTime; virtual;
  function GetAsBoolean: Boolean; virtual;
  function GetAsStream: TStream; virtual;
  function GetAsStrings: TStrings; virtual;

  procedure SetAsString( value: String); virtual;
  procedure SetAsInteger( value: Integer); virtual;
  procedure SetAsFloat( value: Double); virtual;
  procedure SetAsDateTime( value: TDateTime); virtual;
  procedure SetAsBoolean( value: Boolean); virtual;
  procedure SetAsStream( value: TStream); virtual;
  procedure SetAsStrings( Value: TStrings); virtual;

  function GetDataType: TSctDataTypes; virtual;
  function getdatanow: TSctData; virtual;
  function getdata: TSctData; virtual;
  function getactive: Boolean; virtual;

  procedure DefineProperties(Filer: TFiler); override;
  procedure ReadAutoVar(Reader: TReader);
  procedure WriteAutoVar( Writer: TWriter);
  procedure ReadID(Reader: TReader);
  procedure WriteID( Writer: TWriter);

  procedure SetUpdateLevel(ul: TSctLevel);

  procedure SetDataType(dt: TSctDataTypes);
public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;
  procedure UpdateData; virtual;
  procedure UpdateLast; virtual;
  procedure ReverseUpdate; virtual;
  procedure Initialize; virtual;
  property Initialized: Boolean read FInitialized write FInitialized;
  property Running: Boolean read FRunning write SetRunning;
  property DataNow: TSctData read getdatanow write FDataNow;
  property DataLast: TSctData read FDataLast write FDataLast;
  property Data: TSctData read getdata;

  property AsString: String read GetAsString write SetAsString;
  property AsInteger: Integer read GetAsInteger write SetAsInteger;
  property AsFloat: Double read GetAsFloat write SetAsFloat;
  property AsDateTime: TDateTime read GetAsDateTime write SetAsDateTime;
  property AsBoolean: Boolean read GetAsBoolean write SetAsBoolean;
  property AsStream: TStream read GetAsStream write SetAsStream;
  property AsStrings: TStrings read GetAsStrings write SetAsStrings;

  property IsNull: Boolean read GetIsNull write SetIsNull;

  property DataType: TSctDataTypes read GetDataType write SetDataType;
  property UpdateMode: TSctUpdateMode read FUpdateMode write FUpdateMode;
  property Active: Boolean read getactive write FActive;

  property Cursor;

  property AutoVar: Boolean read FAutoVar write FAutoVar;
  property Id: TSctVarId read FId write FId;
  property UpdateLevel: TSctLevel read FUpdateLevel write SetUpdateLevel;
  procedure Reset; virtual;
  procedure ResetData; virtual;
published
end;

{$ifdef AceBDE}

{ TSctdbvar }
  TSctDBVar = class(TSctvar)
  private
    FFieldNo: Integer;
    FDataField: String;
    FDataLink: TFieldDataLink;
{    FField: TField;}
    procedure ActiveChange(Sender: TObject);
    function GetDataField: string;
    function GetDataSource: TDataSource;
    function GetField: TField;
    procedure SetDataField(const Value: string);
    procedure SetDataSource(Value: TDataSource);

  protected
    procedure Notification(AComponent: TComponent;
      Operation: TOperation); override;

    function GetDataType: TSctDataTypes; override;
    function GetFieldDataType: TFieldType; virtual;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure UpdateData; override;
    property Field: TField read GetField;
    procedure Initialize; override;
    property FieldDataType: TFieldType read GetFieldDataType;
  published
    property DataField: string read GetDataField write SetDataField;
    property DataSource: TDataSource read GetDataSource write SetDataSource;
    property UpdateLevel;
  end;
{$endif}

{ TSctExprvar }
  TSctExprVar = class(TSctvar)
  private
    FOnGetData: TGetDataEvent;
  protected
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure UpdateData; override;
  published
    property DataType;
    property OnGetData: TGetDataEvent read FOnGetData write FOnGetData;
    property UpdateLevel;
  end;

{ TSctDateTimeVar }
  TSctDateTimeVar = class(TSctVar)
  private
  protected
    procedure Loaded; override;
  public
    constructor Create(AOwner: TComponent); override;
    procedure Initialize; override;
  published
    property UpdateLevel;
  end;

{ TSctPageVar }
  TSctPageVar = class(TSctVar)
  private
  protected
    procedure Loaded; override;
  public
    constructor Create(AOwner: TComponent); override;
    procedure UpdateData; override;
  published
    property UpdateLevel;
  end;

{ TSctTotalvar }
  TSctTotalvar = class(TSctvar)
  private
    FVariable: TSctvar;
    FDataNowList, FDataLastList: TList;
    FResetNowList, FResetLastList: TList;
    FIgnoreNulls: Boolean;
  protected
    function GetDataNow: TSctData; override;
    procedure Notification(AComponent: TComponent;
            Operation: TOperation); override;
    function GetActive: Boolean; override;
    procedure SetVariable(V: TSctvar);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure UpdateData; override;
    function GetDataType: TSctDataTypes; override;
    procedure Initialize; override;

    procedure ResetLevel(Level: TSctLevel);
    procedure UpdateLast; override;
    procedure ReverseUpdate; override;
    procedure UpdateAtlevel(Level: TSctLevel);
    function Getlevel(level: TSctLevel; TotalType: TSctTotalType): TSctFloat;
    function GetLevelNow(Level: TSctLevel; TotalType: TSctTotalType): TSctFloat;
    function GetLevelLast(Level: TSctLevel; TotalType: TSctTotalType): TSctFloat;
    procedure AddLevels;
    procedure DeleteLevels;
    property DataNowList: TList read FDataNowList write FDataNowList;
    property DataLastList: TList read FDataLastList write FDataLastList;
    property ResetNowList: TList read FResetNowList write FResetNowList;
    property ResetLastList: TList read FResetLastList write FResetLastList;
    procedure Reset; override;
    procedure ResetAtlevel(Level: TSctLevel);
    procedure ResetData; override;
    procedure ResetMarkedLevel(Level: TSctLevel);
  published
    property Variable: TSctvar read FVariable write SetVariable;
    property UpdateLevel;
    property IgnoreNulls: Boolean read FIgnoreNulls write FIgnoreNulls default False;
  end;


implementation

uses sctrep, sctctrl, sctutil, sctconst, acememoU, typinfo;

{$IFDEF WIN32}
  {$WARNINGS OFF}
{$ENDIF}

{ TSctLevel }
constructor TSctLevel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FLevel := 0;
  FIsHeader := False;
end;

destructor TSctLevel.destroy;
begin
  inherited Destroy;
end;

function TSctLevel.GetPage: TComponent;
begin
  result := Parent;
end;

procedure TSctLevel.SetParent(AParent: TWinControl);
begin
  if AParent <> Parent then
  begin
    if AParent <> nil Then
    begin
      if AParent is TSctPage Then
      begin
        TSctPage(AParent).InsertLevel(self);
        inherited SetParent(AParent);
      end else Abort;
    end else
    begin
      if Parent <> nil Then TSctPage(Parent).RemoveLevel(self);
      inherited SetParent(AParent);
    end;
  end;
end;

procedure TSctLevel.DefineProperties(Filer: TFiler);
begin
  inherited DefineProperties(Filer);
  Filer.DefineProperty('IsHeader', readisheader, writeisheader, FIsHeader);
end;
procedure TSctLevel.ReadIsHeader(Reader: TReader);
begin
  FIsHeader := Reader.ReadBoolean;
end;
procedure TSctLevel.WriteIsHeader( Writer: TWriter);
begin
  Writer.WriteBoolean(FIsHeader);
end;


{ TSctvar }
constructor TSctvar.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FDataNow := nil;
  FDataLast := nil;
  visible := False;
  AutoVar := False;
  FDataType := dtypeUnknown;
{  UpdateMode := umNeedUpdate;}
  UpdateMode := umNoUpdate;
  FUpdateLevel := nil;
  FId := vidAbstract;
  FActive := True;
  FInitialized := False;
  FRunning := False;
end;

destructor TSctvar.Destroy;
begin
  if FDataNow <> nil Then FDataNow.Free;
  if FDataLast <> nil Then FDataLast.Free;
  FDataNow := nil;
  FDataLast := nil;
  inherited destroy;
end;

procedure TSctvar.Reset;
begin
  DataNow.Reset;
end;

procedure TSctVar.SetName(const NewName: TComponentName);
begin
  inherited SetName(NewName);
  if Parent <> nil then
  begin
    TSctGroupPage(Parent).UpdatePageManager;
  end;
end;

procedure TSctvar.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
  inherited Notification(AComponent, Operation);
  if (AComponent is TSctLevel) Then
  begin
    if (Operation = opRemove) And (FUpdateLevel = TSctLevel(AComponent)) Then
      FUpdateLevel := nil;
  end;
end;

procedure TSctVar.SetUpdateLevel(ul: TSctLevel);
begin
  if ul <> FUpdateLevel then
  begin
    FUpdateLevel := ul;
    if Parent <> nil then TSctGroupPage(Parent).VarChanged;
  end;
end;

procedure TSctVar.SetDataType(dt: TSctDataTypes);
begin
  if dt <> FDataType then
  begin
    FDataType := dt;
    if Parent <> nil then TSctGroupPage(Parent).VarChanged;
  end;
end;



function TSctvar.getactive: Boolean;
begin
  result := FActive;
end;

procedure TSctVar.SetRunning(lRun: Boolean);
begin
  if lRun <> FRunning then
  begin
    FRunning := lRun;
    if Not FRunning then Initialize;
  end;
end;

procedure TSctvar.Loaded;
begin
  if updatelevel = nil Then
  begin
    if parent is TSctGrouppage Then
    begin
      updatelevel := TSctGrouppage(parent).detail.Updatelevel;
    end;
  end;
  inherited Loaded;
end;

procedure TSctvar.SetParent(AParent: TWinControl);
begin
  if AParent <> Parent then
  begin
    if AParent <> nil Then
    begin
      if AParent is TSctPage Then
      begin
        TSctPage(AParent).InsertVar(self);
      end;
      inherited SetParent(AParent);
    end else
    begin
      if Parent <> nil Then

⌨️ 快捷键说明

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