wsbrowse.pas

来自「企业ERP管理系统」· PAS 代码 · 共 592 行 · 第 1/2 页

PAS
592
字号
{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
unit Name: WSBrowse
  Author: Qiuliang
  Purpose:
  History:
  2002 - 10 - 28 Created
  Description:
一、创建数据游览窗体:
  1. 继承 TWSBrowseForm 创建新 Form
  2. 在该 Form 上放置需浏览的 DataSet,通过字段编辑器加入需使用的字段。填写每
    个字段的 DisplayLabel(中文标题)属性,并将不需要在 DBGrid 中显示出来的字段的
    Visible 置为 False(首要)
  3. 需要浏览多少个 DataSet 就在 PageControl 上创建多少页,并给每一个 TabSheet
    的Tag 属性赋唯一值, 并与DataSet 的 Tag 属性相对应;这样,当转到某一 TabSheet
    时 DBGrid 中就显示有相同 Tag 的 DataSet;
  4. 加入以下代码:
    //声明部分:
    protected
      function CreateEditForm: TWSEditForm; override;

    //函数实体部分:
    function TWSBrowseDemoForm.CreateEditForm: TWSEditForm;
    begin
      // 根据不同页创建编辑不同的窗体
      case PageControl.ActivePageIndex of
        0: Result := TWSEditDemoForm.Create(Application);
        1: Result := TWSEditDemoForm.Create(Application);
      end;
    end;

  5. //传多个参数给编辑窗口(可选)
      //在游览窗体:
    protected
      function GetEditParams: Variant; override; //重置取得参数函数

    function TWSBrowseDemoForm.GetEditParams: Variant;
    begin
      Result := VarArrayOf([DataSet.Fields[0].Value,
        DataSet.Fields[1].Value,
        DataSet.Fields[2].Value,
        DataSet.Fields[3].Value]);
    end;

    //在编辑窗体:
    function TWSEditDemoForm.Edit(const Params: Variant): Boolean;
    begin
      Panel1.Caption := Format('Params = %s', [VarToStr(Params[0])]) + '+' +
      Format('+%s', [VarToStr(Params[1])]) + '+' +
      Format('+%s', [VarToStr(Params[2])]) + '+' +
      Format('+%s', [VarToStr(Params[3])]);
      Result := ShowModal = mrOK;
    end;

二、创建数据编辑窗体:
  1. 继承 TWSEditForm 创建一个新的 Form
  2. 加入所需操作控件及代码
  3. 加入以下代码:
    //声明部分:
    public
      function Enter: Boolean; override;
      function Edit(const Params: Variant): Boolean; override;

    //函数实体部分:
    function TWSEditDemoForm.Edit(const Params: Variant): Boolean;
    begin
      Panel1.Caption := Format('Params = %s', [VarToStr(Params)]);
      //初始化界面
      Result := ShowModal = mrOK;
    end;

    function TWSEditDemoForm.Enter: Boolean;
    begin
      Result := ShowModal = mrOK;
    end;

补充说明:
  以上TWSEditDemoForm,TWSBrowseDemoForm为实际新创建的窗口类名;
  以上代码是继承后所必须写的代码(并且格式也不能变)!
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}

unit WSBrowse;

interface

{$I DEFINE.INC}

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ActnList, Grids, DBGrids, ExtCtrls, ComCtrls, TypInfo, QLDBFlt,
  QuickRpt, QRExtra, QLRptBld, StdCtrls, Buttons, WSEdit, QLDBGrid,
  ImgList, ToolWin, WSCstFrm, ADODB, Menus, QLDBCstVw;

type
  TWSBrowseForm = class(TWSCustomForm)
    ActionList: TActionList;
    AddNewAction: TAction;
    DataSource: TDataSource;
    DeleteAction: TAction;
    EditAction: TAction;
    ExportAction: TAction;
    FiltrateAction: TAction;
    PageControl: TPageControl;
    PrintAction: TAction;
    PrintPreviewAction: TAction;
    TabSheet1: TTabSheet;
    RefreshAction: TAction;
    DBGrid: TQLDBGrid;
    ToolBar: TToolBar;
    ExitAction: TAction;
    Panel1: TPanel;
    WsBrowsePop: TPopupMenu;
    wsbrowsepopnRename: TMenuItem;
    wsbrowsepopDelete: TMenuItem;
    CustomizeViewAction: TAction;
    ShowChartAction: TAction;
    procedure DBGridTitleClick(Column: TColumn);
    procedure DeleteActionExecute(Sender: TObject);
    procedure DeleteActionUpdate(Sender: TObject);
    procedure EditActionUpdate(Sender: TObject);
    procedure ExportActionExecute(Sender: TObject);
    procedure FiltrateActionExecute(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure PrintActionExecute(Sender: TObject);
    procedure PrintPreviewActionExecute(Sender: TObject);
    procedure TabSheetShow(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure RefreshActionExecute(Sender: TObject);
    procedure AddNewActionExecute(Sender: TObject);
    procedure EditActionExecute(Sender: TObject);
    procedure ExitActionExecute(Sender: TObject);
    procedure DBGridDblClick(Sender: TObject);
    procedure wsbrowsepopnRenameClick(Sender: TObject);
    procedure wsbrowsepopDeleteClick(Sender: TObject);
    procedure DBGridKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure CustomizeViewActionExecute(Sender: TObject);
    procedure ShowChartActionExecute(Sender: TObject);
  private
    FAllowSort: Boolean;
    FFilterDialogList: TList;
    FAvailableFields: string;
    function CreateQRBuilder: TQRBuilder;
    function ExecuteFilterDialog(ADataSet: TDataSet): Boolean;
    function GetDataSet: TDataSet;
    function GetNextTag: Integer;
  protected
    {{
    在打印 DBGrid 之前会调用 CreateReport
    来创建一个报表,之后会在该报表的基础上填充 DBGrid 的内容。

    默认情况下会创建一个 TQuickRep 类的报表,子类可 override
    该方法来创建合适的报表。
    }
    function CreateReport: TQuickRep; virtual;
    {{
    在创建了报表并且在报表上填充 DBGrid
    的内容之后,在打印输出之前会调用该方法以允许子类进一步控制报表的其他细节。
    }
    procedure InitReport(Report: TQuickRep); virtual;
    function CreateEditForm: TWSEditForm; virtual;
    function GetEditParams: Variant; virtual;
    procedure RefreshAvailableFields;
  public
    procedure Print(Preview: Boolean = False; ShowSetupDialog: Boolean = False);
    {{
    调用 RefreshDataSet 方法来刷新当前显示的 DataSet。
    }
    procedure RefreshDataSet;
    {{
    使用 AllowSort 来控制是否允许在用户用鼠标点击 DBGrid 的标题栏时自动对
    DataSet 进行排序。
    }
    property AllowSort: Boolean read FAllowSort write FAllowSort;
    {{
    读 DataSet 来取得当前所显示的数据集
    }
    property DataSet: TDataSet read GetDataSet;
  end;

implementation

uses CommonDM, WSUtils, WSSecurity, Clipbrd, WSCustomRpt, WSChart;

{$R *.dfm}

{
****************************** TBrowseForm ******************************
}

function TWSBrowseForm.CreateQRBuilder: TQRBuilder;
begin
  Result := TQLDBGridReportBuilder.Create(Self);
  with TQLDBGridReportBuilder(Result) do
  begin
    DBGrid := Self.DBGrid;
    AutoWidth := True;
    Report := CreateReport;
    AutoOrientation := False;
    Report.ReportTitle := Self.Caption;
  end;
end;

function TWSBrowseForm.CreateReport: TQuickRep;
begin
  Result := TWSCustomReport.Create(Self);
  Result.PreviewInitialState := wsMaximized;
end;

procedure TWSBrowseForm.DBGridTitleClick(Column: TColumn);
const
  IndexFieldNamesProp = 'IndexFieldNames';
var
  SortStr, OldSortStr: string;
begin
  if FAllowSort and (Column.Field <> nil) and IsPublishedProp(Column.Field.DataSet, IndexFieldNamesProp) then
    with Column do
    begin
      if Field.Lookup then SortStr := Field.KeyFields // Lookup 字段根据其关键字段排序
      else if Field.Calculated then
        // 计算字段不能排序
      else SortStr := Field.FieldName;
      OldSortStr := GetStrProp(Field.DataSet, IndexFieldNamesProp);
      if SortStr = OldSortStr then SortStr := SortStr + ' DESC';
      SetStrProp(Field.DataSet, IndexFieldNamesProp, SortStr);
    end;
end;

procedure TWSBrowseForm.DeleteActionExecute(Sender: TObject);
begin
  { DONE : 添加删除当前选定凭单的代码 }
  if DataSet.FieldByName('RecordState').AsString ='提交'
    then    showmessage('单据已经提交,不能删除!')
  else
  begin
    if MessageBox(Handle, '您真的要删除当前记录吗?',
      '请确认', MB_YESNO + MB_ICONQUESTION) = IDYES then
    begin
      with DataSet do
      begin
        Edit;
        FieldByName('RecordState').AsString := '删除';
        Post;
      end;
      RefreshDataSet;
    end;
  end;

end;

procedure TWSBrowseForm.DeleteActionUpdate(Sender: TObject);
begin
  TAction(Sender).Enabled := not DataSet.IsEmpty;
end;

procedure TWSBrowseForm.EditActionUpdate(Sender: TObject);
begin
  TAction(Sender).Enabled := not DataSet.IsEmpty;
end;

function TWSBrowseForm.ExecuteFilterDialog(ADataSet: TDataSet): Boolean;

  function GetFilterFields: string;
  var
    I: Integer;
  begin
    with ADataSet do
      for I := 0 to FieldCount - 1 do
          if Fields[I].Visible then Result := Result + Fields[I].FieldName + ';';
  end;

type
  TDataSetClass = class of TDataSet;
var
  I: Integer;
  Field: TField;
  FilterDialog, NewFilterDialog: TQLDBFilterDialog;
  FilterDataSet: TDataSet;
  S :string;

begin
  FilterDialog := nil;
  for I := 0 to FFilterDialogList.Count - 1 do
  begin
    if TQLDBFilterDialog(FFilterDialogList[I]).DataSet = ADataSet then
    begin
      FilterDialog := FFilterDialogList[I];
      Break;
    end;
  end;

  if FilterDialog = nil then
  begin
    FilterDialog := TQLDBFilterDialog.Create(Self);
    FilterDialog.DataSet := ADataSet;

⌨️ 快捷键说明

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