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

📄 rm_dbset.pas

📁 report machine 2.3 功能强大
💻 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 = class(TRMDataset)
  private
    FDataSet: TDataSet;
    FDataSource: TDataSource;
    FOpenDataSource, FCloseDataSource: Boolean;
    FOnOpen, FOnClose: TNotifyEvent;
    FBookmark: TBookmark;
    FEof: Boolean;
    procedure SetDataSet(Value: TDataSet);
    procedure SetDataSource(Value: TDataSource);
  protected
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  public
    constructor Create(AOwner: TComponent); override;
    procedure Init; override;
    procedure Exit; override;
    procedure First; override;
    procedure Next; override;
    procedure Prior; override;
    procedure Open;
    procedure Close;
    function Eof: Boolean; override;
    function GetDataSet: TDataSet;
  published
    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);

{=============================================================================}
{=============================================================================}
{ TRMDBDataSet }
constructor TRMDBDataSet.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FOpenDataSource := True;
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;
  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;

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;
  FBookmark := GetDataSet.GetBookmark;
//	if CurPage.CanDisableControls then
//	  RMDisableDBControls(TDataSet(GetDataSet));
  FEof := False;
end;

procedure TRMDBDataSet.Exit;
begin
  if FBookMark <> nil then
  begin
    if (FRangeBegin = rbCurrent) or (FRangeEnd = reCurrent) then
	    GetDataSet.GotoBookmark(FBookMark);
    GetDataSet.FreeBookMark(FBookmark);
  end;
  FBookMark := nil;
//  RMEnableDBControls(TDataSet(GetDataSet));
  Close;
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.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.

⌨️ 快捷键说明

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