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

📄 singlebillframe.pas

📁 实达企业在线EOL源码
💻 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 + -