📄 singlebillframe.pas
字号:
{*************************************************************************
模块名称:Frame 应用基类(单表)
名称: BFrameWork
功能说明:单个记录集操作
入口数据:DataSet:当前表单的数据集;DataSource:数据源控件(在调用FrameShow时传入)
出口数据:
作者 :
修改记录:2000/8/2/ 马少杰
附加说明:事件:FormCreate:调用FrameCreate
事件:FormShow:调用FrameShow
事件:DataSourceStateChange:调用DataSet_StateChange
事件:FormKeyDown调用FormKeyDown
其他函数:TabToNextControl 移动光标到下一控件;
编译器说明:
*************************************************************************}
unit SingleBillFrame;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
jpeg, ExtCtrls, StdCtrls, Buttons, ImgList, ComCtrls, ToolWin, Menus,
Mask, Db, DBTables, Wwlocate, DBActns, dbclient, ActnList, wwDialog;
type
TSingleBillFrame = class(TFrame)
MainMenu: TPopupMenu;
ImageList1: TImageList;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
enableImage: TImageList;
Panel1: TPanel;
CoolBar1: TCoolBar;
wwLocateDialog1: TwwLocateDialog;
ActionList1: TActionList;
DataSetCancel1: TDataSetCancel;
DataSetDelete1: TDataSetDelete;
DataSetFirst1: TDataSetFirst;
DataSetInsert1: TDataSetInsert;
DataSetLast1: TDataSetLast;
DataSetNext1: TDataSetNext;
DataSetPost1: TDataSetPost;
DataSetPrior1: TDataSetPrior;
DataSetRefresh1: TDataSetRefresh;
ToolBar2: TToolBar;
BtnFirst: TToolButton;
BtnPrior: TToolButton;
BtnNext: TToolButton;
BtnLast: TToolButton;
BtnSearch: TToolButton;
ToolButton14: TToolButton;
BtnNew: TToolButton;
BtnDelete: TToolButton;
BtnSave: TToolButton;
ToolButton13: TToolButton;
BtnHelp: TToolButton;
BtnExit: TToolButton;
ToolButton1: TToolButton;
BtnCancel: TToolButton;
{-----------------------------------------------------------------------
功能:设置First、Prior、Next、Last按钮的Enabled属性.
入口参数:PriorEnabled:设置First,Prior按钮的Enabled属性.
NextEnabled:设置Nextt,Last按钮的Enabled属性.
-----------------------------------------------------------------------}
procedure ControlButtons (PriorEnabled,NextEnabled: Boolean );
{定位到记录集的第一条记录}
Procedure DataSet_First(DataSet:TDataSet);
{定位到记录集的下一条记录}
Procedure DataSet_Next(DataSet:TDataSet);
{定位到记录集的前一条记录}
Procedure DataSet_Prior(DataSet:TDataSet);
{定位到记录集的最后一条记录}
Procedure DataSet_Last(DataSet:TDataSet);
{增加记录}
Procedure DataSet_Insert(DataSet:TDataSet);
{删除记录}
Procedure DataSet_Delete(DataSet:TDataSet);
{将数据修改提交到数据库}
Procedure DataSet_Post(DataSet:TDataSet);
{取消数据更改}
Procedure DataSet_Cancel(DataSet:TDataSet);
{刷新数据}//未用
Procedure DataSet_Refresh(DataSet:TDataSet);
{在记录集状态发生变化时执行,控制各按钮的可使用与否}//未用
Procedure DataSet_StateChange(DataSet:TDataSet);
{显示错误信息}
procedure ShowException;
//masj
Procedure SaveToLocal(DataSet:TDataSet);
procedure SaveToRemote(DataSet:TdataSet);
procedure BtnFirstClick(Sender: TObject);
procedure BtnPriorClick(Sender: TObject);
procedure BtnNextClick(Sender: TObject);
procedure BtnLastClick(Sender: TObject);
procedure BtnSaveClick(Sender: TObject);
procedure BtnNewClick(Sender: TObject);
procedure BtnDeleteClick(Sender: TObject);
procedure BtnCancelClick(Sender: TObject);
procedure BtnHelpClick(Sender: TObject);
procedure BtnSearchClick(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
private
{ Private declarations }
procedure SetDataSource(DataSource: TDataSource);
public
{ Public declarations }
property DataSource : TDataSource write SetDataSource;
function ProcessExit:boolean;
end;
implementation
{$R *.DFM}
uses GlobalUnit, SystemConstUnit;
var
MainDataSet: TDataSet; //与Frame相关的主记录集
procedure TSingleBillFrame.SetDataSource(DataSource: TDataSource);
begin
MainDataSet := DataSource.DataSet;
wwLocateDialog1.DataSource := DataSource;
//DBFinder1.DataSet := DataSource.DataSet;
end;
//masj
Procedure TSingleBillFrame.SaveToLocal(DataSet:TDataSet);
begin
if DataSet.State in [ dsInsert, dsEdit ] then
DataSet.Post;
end;
procedure TSingleBillFrame.SaveToRemote(DataSet:TdataSet);
begin
//masj 增加存盘失败的事件函数,来处理存盘异常情况
if DataSet is TClientDataSet then
begin
if (TClientDataSet(DataSet).ChangeCount > 0)
and (TClientDataSet(DataSet).ApplyUpdates(-1) > 0) then
TClientDataSet(DataSet).CancelUpdates;
end;
end;
procedure TSingleBillFrame.ControlButtons(PriorEnabled,NextEnabled: Boolean );
begin
BtnFirst.Enabled := PriorEnabled;
BtnPrior.Enabled := PriorEnabled;
BtnNext.Enabled := NextEnabled;
BtnLast.Enabled := NextEnabled;
end;
procedure TSingleBillFrame.DataSet_First(DataSet:TDataSet);
begin
if DataSet<>nil then
begin
if DataSet.State in [ dsInsert, dsEdit ] then
begin
if not Global.AccessDialog.ShowYesNo(ASKSAVE,DLG_SELECT_TITLE) then
begin
DataSet.Cancel;
DataSet.First;
end
else DataSet_Post(DataSet);
end
else
DataSet.First;
ControlButtons ( false, true );
end;
end;
procedure TSingleBillFrame.DataSet_Prior(DataSet:TDataSet);
begin
//执行Prior时,Last,Next,First,Prior按钮状态.
if DataSet<>nil then
begin
if DataSet.State in [ dsInsert, dsEdit ] then
begin
if not Global.AccessDialog.ShowYesNo(ASKSAVE,DLG_SELECT_TITLE) then
begin
DataSet.Cancel;
DataSet.Prior;
end
else DataSet_Post(DataSet);
end
else
DataSet.Prior;
if not DataSet.Bof then
ControlButtons(True,True)
else
ControlButtons(False, True );
end;
end;
procedure TSingleBillFrame.DataSet_Next(DataSet:TDataSet);
begin
//执行Next时,Last,Next,First,Prior按钮状态.
if DataSet<>nil then
begin
if DataSet.State in [ dsInsert, dsEdit ] then
begin
if not Global.AccessDialog.ShowYesNo(ASKSAVE,DLG_SELECT_TITLE) then
begin
DataSet.Cancel;
DataSet.Next;
end
else DataSet_Post(DataSet);
end
else
DataSet.Next;
//masj Eof 对于三层的是否有问题?
if not DataSet.Eof then
ControlButtons (True, True)
else
controlButtons(True,False);
end;
end;
procedure TSingleBillFrame.DataSet_Last(DataSet:TDataSet);
begin
//执行Last时,Last,Next,First,Prior按钮状态.
if DataSet<>nil then
begin
ControlButtons ( true, false );
if DataSet.State in [ dsInsert, dsEdit ] then
begin
if not Global.AccessDialog.ShowYesNo(ASKSAVE,DLG_SELECT_TITLE) then
begin
DataSet.Cancel;
//masj 考虑Last会不会Down 所有的数据到Local ?
DataSet.Last;;
end
else DataSet_Post(DataSet);
end
else
//masj 考虑Last会不会Down 所有的数据到Local ?
DataSet.Last;
end;
end;
procedure TSingleBillFrame.DataSet_Insert(DataSet:TDataSet);
begin
//Insert状态时置Post,Cancel按钮置为true.
if DataSet<>nil then
begin
DataSet.Insert;
BtnNew.Enabled := false;
BtnSave.Enabled := true;
BtnCancel.Enabled := true;
end;
end;
procedure TSingleBillFrame.DataSet_Delete(DataSet:TDataSet);
begin
//Delete状态时置Post为false,Cancel按钮置为false.
if ((DataSet<>nil) and (not DataSet.IsEmpty)) then
begin
if not Global.AccessDialog.ShowYesNo(ASKDELETE,DLG_SELECT_TITLE) then
Exit;
DataSet.Delete;
DataSet_Post(DataSet);
BtnNew.Enabled := true;
BtnSave.Enabled := false;
BtnCancel.Enabled := false;
end;
end;
Procedure TSingleBillFrame.DataSet_Post(DataSet:TDataSet);
begin
//Post状态时置Post为false,Cancel按钮置为false.
if DataSet<>nil then
begin
SaveToLocal(DataSet);
SaveToRemote(DataSet);
BtnSave.Enabled := false;
BtnCancel.Enabled := false;
BtnNew.Enabled := true;
end;
end;
Procedure TSingleBillFrame.DataSet_Cancel(DataSet:TDataSet);
begin
//Cance状态时置Post为false,Cancel按钮置为false.
inherited;
if DataSet<>nil then
begin
if DataSet.State in [dsInsert,dsEdit] then
DataSet.Cancel;//释放本地数据.
if (TClientDataSet(DataSet).ChangeCount > 0) then
TClientDataSet(DataSet).CancelUpdates;
BtnSave.Enabled := false;
BtnCancel.Enabled := false;
BtnNew.Enabled := true;
end;
end;
Procedure TSingleBillFrame.DataSet_Refresh(DataSet:TDataSet);
begin
if DataSet<>nil then
begin
if DataSet.State in [ dsInsert, dsEdit ] then
begin
if not Global.AccessDialog.ShowYesNo(ASKSAVE,DLG_SELECT_TITLE) then
DataSet.Cancel
else
DataSet_Post(DataSet);
end;
DataSet.Refresh;
//masj: Close and Open for Refresh?
// DataSet.Close;
// DataSet.Open;
end;
End;
Procedure TSingleBillFrame.DataSet_StateChange(DataSet:TDataSet);
var
Enabled: Boolean;
begin
//如果DataSourceState为编辑状态,保存按钮置为true.
//注意:在改变DataSet的时候会触发两次此事件.
if (DataSet<>nil) then
begin
Enabled := ( DataSet.State in [ dsInsert, dsEdit ] );
BtnSave.Enabled := Enabled;
BtnCancel.Enabled := Enabled;
BtnNew.Enabled := not Enabled;
end;
end;
procedure TSingleBillFrame.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if shift=[ssCtrl] then
case Key of
vk_Prior : DataSet_Prior(MainDataSet);
vk_Next : DataSet_Next(MainDataSet);
vk_Home : DataSet_First(MainDataSet);
vk_End : DataSet_Last(MainDataSet);
Ord('A') : begin DataSet_Insert(MainDataSet); Key := 0; end;
Ord('D') : begin DataSet_Delete(MainDataSet); Key := 0; end;
Ord('S') : begin DataSet_Post(MainDataSet); Key := 0; end;
Ord('Z') : begin DataSet_Cancel(MainDataSet); Key := 0; end;
end;
end;
procedure TSingleBillFrame.ShowException;
var
Msg:string;
Explain:String;
begin
if ExceptObject is EAbort then Exit;
Msg:=SAVEERROR;
Explain:=Exception(ExceptObject).Message;
if Pos(KEY_VIOLATION, Explain) > 0 then
Explain:=SAVEERRORITEM;
MessageDlg(Msg+Explain, mtError , [mbOk], 0);
end;
function TSingleBillFrame.ProcessExit: boolean;
begin
result := False;
if MainDataSet <> nil then
begin
//处理未保存数据
if (MainDataSet.State in [dsInsert,dsEdit]) or
(TClientDataSet(MainDataSet).ChangeCount > 0) then
begin
if not Global.AccessDialog.ShowYesNo(ASKSAVE,DLG_SELECT_TITLE) then
begin
MainDataSet.Cancel;
end
else begin
DataSet_Post(MainDataSet);
result := True;
end;
end;
MainDataSet.Close;
MainDataSet := nil;
wwLocateDialog1.DataSource := nil;
end;
end;
procedure TSingleBillFrame.BtnFirstClick(Sender: TObject);
begin
DataSet_First(MainDataSet);
end;
procedure TSingleBillFrame.BtnPriorClick(Sender: TObject);
begin
DataSet_Prior(MainDataSet);
end;
procedure TSingleBillFrame.BtnNextClick(Sender: TObject);
begin
DataSet_Next(MainDataSet);
end;
procedure TSingleBillFrame.BtnLastClick(Sender: TObject);
begin
DataSet_Last(MainDataSet);
end;
procedure TSingleBillFrame.BtnSearchClick(Sender: TObject);
begin
//znc:最好替换成自己的控件TDBFinder
//DBFinder1.ShowFinderForm;
//znc:目前DBFinder不支持三层!
if wwLocateDialog1.DataSource <> nil then
wwLocateDialog1.Execute;
end;
procedure TSingleBillFrame.BtnNewClick(Sender: TObject);
begin
DataSet_Insert(MainDataSet);
end;
procedure TSingleBillFrame.BtnDeleteClick(Sender: TObject);
begin
DataSet_Delete(MainDataSet);
end;
procedure TSingleBillFrame.BtnSaveClick(Sender: TObject);
begin
DataSet_Post(MainDataSet);
end;
procedure TSingleBillFrame.BtnCancelClick(Sender: TObject);
begin
DataSet_Cancel(MainDataSet);
end;
procedure TSingleBillFrame.BtnHelpClick(Sender: TObject);
begin
Showmessage('For Help');
//DataSet_Refresh(MainDataSet);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -