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

📄 rm_dset.pas

📁 进销存管理 编译环境Delphi7+Win2000 用到的控件 ReportMachine2.6 InfoPower4000Pro_vcl7 RxLib2.7 SkinEngine 3
💻 PAS
字号:

{*****************************************}
{                                         }
{            Report Machine v2.0          }
{             Report dataset              }
{                                         }
{*****************************************}

unit RM_dset;

interface

{$I RM.inc}

uses
  SysUtils, Windows, Messages, Classes;

type
  TRMRangeBegin = (rbFirst, rbCurrent);
  TRMRangeEnd = (reLast, reCurrent, reCount);
  TRMCheckEOFEvent = procedure(Sender: TObject; var Eof: Boolean) of object;
  TRMRecordChangedType = (rmrcFirst, rmrcNext, rmrcPrior);

  { TRMDataset }
  TRMDataset = class(TComponent)
  protected
		FChildDatasets: TList;
    FRangeBegin: TRMRangeBegin;
    FRangeEnd: TRMRangeEnd;
    FRangeEndCount: Integer;
    FOnFirst, FOnNext, FOnPrior: TNotifyEvent;
    FOnCheckEOF: TRMCheckEOFEvent;
    FOnAfterFirst: TNotifyEvent;
    FRecNo: Integer;
		procedure RecordChanged(aType: TRMRecordChangedType);
    procedure AddChildDataset(aDataset: TRMDataset);
    procedure RemoveChildDataset(aDataset: TRMDataset);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Init; virtual;
    procedure Exit; virtual;
    procedure First; virtual;
    procedure Next; virtual;
    procedure Prior; virtual;
    function Eof: Boolean; virtual;
    property RangeBegin: TRMRangeBegin read FRangeBegin write FRangeBegin default rbFirst;
    property RangeEnd: TRMRangeEnd read FRangeEnd write FRangeEnd default reLast;
    property RangeEndCount: Integer read FRangeEndCount write FRangeEndCount default 0;
    property RecNo: Integer read FRecNo;
    property OnCheckEOF: TRMCheckEOFEvent read FOnCheckEOF write FOnCheckEOF;
    property OnFirst: TNotifyEvent read FOnFirst write FOnFirst;
    property OnNext: TNotifyEvent read FOnNext write FOnNext;
    property OnPrior: TNotifyEvent read FOnPrior write FOnPrior;
  end;

  { TRMUserDataset }
  TRMUserDataset = class(TRMDataset)
  private
  protected
  public
  published
    property RangeBegin;
    property RangeEnd;
    property RangeEndCount;
    property OnCheckEOF;
    property OnFirst;
    property OnNext;
    property OnPrior;
  end;

implementation

{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{ TRMDataSet }
constructor TRMDataSet.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  RangeBegin := rbFirst;
  RangeEnd := reLast;
	FChildDatasets := TList.Create;
  FOnAfterFirst := nil;
end;

destructor TRMDataSet.Destroy;
begin
	FChildDatasets.Free;
  Inherited Destroy;
end;
  
procedure TRMDataSet.Init;
begin
end;

procedure TRMDataSet.Exit;
begin
end;

procedure TRMDataSet.First;
begin
  FRecNo := 0;
	RecordChanged(rmrcFirst);
  if Assigned(FOnFirst) then FOnFirst(Self);
end;

procedure TRMDataSet.Next;
begin
  Inc(FRecNo);
  if not ((FRangeEnd = reCount) and (FRecNo >= FRangeEndCount)) then
  begin
		RecordChanged(rmrcNext);
	  if Assigned(FOnNext) then FOnNext(Self);
  end;
end;

procedure TRMDataSet.Prior;
begin
  Dec(FRecNo);
	RecordChanged(rmrcPrior);
  if Assigned(FOnPrior) then FOnPrior(Self);
end;

function TRMDataSet.Eof: Boolean;
begin
  Result := False;
  if (FRangeEnd = reCount) and (FRecNo >= FRangeEndCount) then Result := True;
  if Assigned(FOnCheckEOF) then FOnCheckEOF(Self, Result);
end;

procedure TRMDataSet.RecordChanged(aType: TRMRecordChangedType);
var
	i: Integer;
begin
	for i := 0 to FChildDatasets.Count - 1 do
  begin
  	case aType of
    	rmrcFirst: TRMDataSet(FChildDatasets[i]).First;
    	rmrcNext: TRMDataSet(FChildDatasets[i]).Next;
    	rmrcPrior: TRMDataSet(FChildDatasets[i]).Prior;
    end;
  end;
end;

procedure TRMDataset.AddChildDataset(aDataset: TRMDataset);
begin
	if FChildDatasets.IndexOf(aDataset) < 0 then
  	FChildDatasets.Add(aDataset);
end;

procedure TRMDataset.RemoveChildDataset(aDataset: TRMDataset);
var
	liIndex: Integer;
begin
	liIndex := FChildDatasets.IndexOf(aDataset);
  if liIndex >= 0 then
  	FChildDatasets.Delete(liIndex);
end;

end.

⌨️ 快捷键说明

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