📄 rm_dbset.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 + -