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

📄 rm_dbset.pas

📁 中小企业管理系统------ ERP系统原代码
💻 PAS
字号:

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

unit RM_dbset;

interface

{$I RM.inc}

uses
  SysUtils, Windows, Messages, Classes, RM_DBRel, RM_DSet, DB;

type
 { TRMDBDataSet }
  TRMDBDataSet = class(TRMDataset)
  private
    FMasterDataset: TRMDataset;
    FDataSet: TDataSet;
    FDataSource: TDataSource;
    FOpenDataSource, FCloseDataSource: Boolean;
    FOnOpen, FOnClose: TNotifyEvent;
    FBookmark: TBookmark;
    FEof: Boolean;
    procedure SetDataSet(Value: TDataSet);
    procedure SetDataSource(Value: TDataSource);
    procedure SetMasterDataset(Value: TRMDataset);
  protected
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Init; override;
    procedure Exit; override;
    procedure First; override;
    procedure Next; override;
    procedure Prior; override;
    procedure MoveBy(Distance: Integer);
    procedure Open;
    procedure Close;
    function Eof: Boolean; override;
    function GetDataSet: TDataSet;
  published
    property MasterDataset: TRMDataset read FMasterDataset write SetMasterDataset;
    property CloseDataSource: Boolean read FCloseDataSource write FCloseDataSource default False;
    property DataSet: TDataSet read FDataSet write SetDataSet;
    property DataSource: TDataSource read FDataSource write SetDataSource;
    property OpenDataSource: Boolean read FOpenDataSource write FOpenDataSource default True;
    property RangeBegin;
    property RangeEnd;
    property RangeEndCount;
    property OnCheckEOF;
    property OnClose: TNotifyEvent read FOnClose write FOnClose;
    property OnFirst;
    property OnNext;
    property OnPrior;
    property OnOpen: TNotifyEvent read FOnOpen write FOnOpen;
  end;

implementation

uses RM_Class;

type
  EDSError = class(Exception);

  THackRMDataSet = class(TRMDataset)
  end;


{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{ TRMDBDataSet }

constructor TRMDBDataSet.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FOpenDataSource := True;
  FMasterDataSet := nil;
end;

destructor TRMDBDataSet.Destroy;
begin
  MasterDataSet := nil;
  inherited Destroy;
end;

procedure TRMDBDataSet.Notification(AComponent: TComponent; Operation: TOperation);
begin
  inherited Notification(AComponent, Operation);
  if Operation = opRemove then
  begin
    if AComponent = FDataSource then
      FDataSource := nil
    else if AComponent = FDataSet then
      FDataSet := nil
    else if AComponent = FMasterDataset then
      FMasterDataSet := nil;
  end;
end;

procedure TRMDBDataSet.SetDataSet(Value: TDataSet);
begin
  FDataSet := Value;
  FDataSource := nil;
end;

procedure TRMDBDataSet.SetDataSource(Value: TDataSource);
begin
  FDataSource := Value;
  if Value <> nil then
    FDataSet := nil;
end;

procedure TRMDBDataSet.SetMasterDataset(Value: TRMDataset);
begin
  if Value = Self then
    Exit;
  if FMasterDataSet <> nil then
    THackRMDataSet(FMasterDataSet).RemoveChildDataset(Self);
  FMasterDataset := Value;
  if FMasterDataSet <> nil then
    THackRMDataSet(FMasterDataSet).AddChildDataset(Self);
end;

function TRMDBDataSet.GetDataSet: TDataSet;
begin
  if (FDataSource <> nil) and (FDataSource.DataSet <> nil) then
    Result := TDataSet(FDataSource.DataSet)
  else if FDataSet <> nil then
    Result := TDataSet(FDataSet)
  else
  begin
    raise EDSError.Create('Unable to open dataset ' + Name);
    Result := nil;
  end;
end;

procedure TRMDBDataSet.Init;
begin
  Open;
  if FBookmark <> nil then
    GetDataSet.FreeBookMark(FBookmark);
  FBookmark := GetDataSet.GetBookmark;
 //	if CurPage.CanDisableControls then
 //	  RMDisableDBControls(TDataSet(GetDataSet));
  FEof := False;
end;

procedure TRMDBDataSet.Exit;
begin
  try
    if FBookMark <> nil then
    begin
      if (FRangeBegin = rbCurrent) or (FRangeEnd = reCurrent) then
        GetDataSet.GotoBookmark(FBookMark);
      GetDataSet.FreeBookMark(FBookmark);
    end;
  finally
    FBookMark := nil;
 //  RMEnableDBControls(TDataSet(GetDataSet));
    Close;
  end;
end;

procedure TRMDBDataSet.First;
begin
  if FRangeBegin = rbFirst then
    GetDataSet.First
  else if FRangeBegin = rbCurrent then
    GetDataSet.GotoBookMark(FBookmark);
  FEof := False;
  inherited First;
end;

procedure TRMDBDataSet.Next;
var
  b: TBookmark;
begin
  FEof := False;
  if FRangeEnd = reCurrent then
  begin
    b := GetDataSet.GetBookMark;
    if RMIsBookmarksEqual(GetDataSet, b, FBookmark) then
      FEof := True;
    GetDataSet.FreeBookMark(b);
    if not FEof then
    begin
      GetDataSet.Next;
      inherited Next;
    end;
    System.Exit;
  end;
  GetDataSet.Next;
  inherited Next;
end;

procedure TRMDBDataSet.MoveBy(Distance: Integer);
begin
  GetDataSet.MoveBy(Distance);
end;

procedure TRMDBDataSet.Prior;
begin
  GetDataSet.Prior;
  inherited Prior;
end;

function TRMDBDataSet.Eof: Boolean;
begin
  Result := inherited Eof or GetDataSet.Eof or FEof;
end;

procedure TRMDBDataSet.Open;
begin
  if FOpenDataSource then
    GetDataSet.Open;
  if Assigned(FOnOpen) then
    FOnOpen(Self);
end;

procedure TRMDBDataSet.Close;
begin
  if Assigned(FOnClose) then
    FOnClose(Self);
  if FCloseDataSource then
    GetDataSet.Close;
end;

end.



//此源码由程序太平洋收集整理发布,任何人都可自由转载,但需保留本站信息
//╭⌒╮┅~ ¤ 欢迎光临程序太平洋╭⌒╮
//╭⌒╭⌒╮╭⌒╮~╭⌒╮  ︶  ,︶︶
//,︶︶︶︶,''︶~~ ,''~︶︶  ,''
//╔ ╱◥███◣═╬╬╬╬╬╬╬╬╬╗
//╬ ︱田︱田 田 ︱          ╬
//╬       http://www.5ivb.net ╬
//╬  ╭○╮●                     ╬
//╬  /■\/■\                    ╬
//╬   <| ||    有希望,就有成功! ╬
//╬                 ╬
//╚╬╬╬╬╬╬╬╬╬╬╗  ╔╬╬╬╬╝
//
//说明:
//专业提供VB、.NET、Delphi、ASP、PB源码下载
//包括:程序源码,控件,商业源码,系统方案,开发工具,书籍教程,技术文档

⌨️ 快捷键说明

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