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

📄 unpersonreportdisplay.pas

📁 本产品是开发LISTVIEW相关功能的可定制产品
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{**********************************************************************
                           通用报表显示定制类
名称:       报表显示需求参数定制程序
目的:      按照用户要求设制报表显示名称、需要显示的列、显示的顺序
功能:      按照用户要求设制报表显示名称、需要显示的列、显示的顺序
作者:      邓普德
版权:      成都四方信息技术有限公司
使用限制:  最多显示25列,且列名来自于指定数据库
定义时间:  2003-10-27
修改时间:
**********************************************************************}
unit unPersonReportDisplay;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, ExtCtrls, StdCtrls, Buttons, Menus,DB,DBTables, ImgList,Variants,
  Spin,unCDefine;
  {Self Define}

type
  TfrmPersonReportDisplay = class(TForm)
    miTV: TImageList;
    ImageList1: TImageList;
    Panel1: TPanel;
    spDown: TSpeedButton;
    spSaveDB: TSpeedButton;
    spUp: TSpeedButton;
    spAllUp: TSpeedButton;
    GroupBox2: TGroupBox;
    lvDisplayDetail: TListView;
    GroupBox3: TGroupBox;
    lvTableDetail: TListView;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    StatusBar1: TStatusBar;
    procedure FormCreate(Sender: TObject);
    procedure spDownClick(Sender: TObject);
    procedure spSaveDBClick(Sender: TObject);
    procedure spUpClick(Sender: TObject);
    procedure spAllUpClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure lvTableDetailClick(Sender: TObject);
    procedure lvDisplayDetailClick(Sender: TObject);
    procedure ComboBox1KeyPress(Sender: TObject; var Key: Char);
    procedure ComboBox2KeyPress(Sender: TObject; var Key: Char);
    procedure N10Click(Sender: TObject);
    procedure N12Click(Sender: TObject);
    procedure spRefreshClick(Sender: TObject);
    procedure lvDisplayDetailColumnClick(Sender: TObject;
      Column: TListColumn);
    procedure lvTableDetailColumnClick(Sender: TObject;
      Column: TListColumn);
    procedure spExitClick(Sender: TObject);
    procedure lvTableDetailDblClick(Sender: TObject);
    procedure lvDisplayDetailDblClick(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
  private
    sFormName,sFormCaption,sDiscription: string;
    nRowSelected:Integer;
    bReShow:boolean;//是否需要重新显示
    aShowColum:array of string;//按顺序保存显示列名称
    nShowNum:integer;//从数组中取得的显示数量
    procedure Refresh;
    function bAgreeDel(const FormCaption,
      DisplayColumnCaption: string): boolean;
    procedure SelectShow;
    procedure ChangeShowCloumn(const GoUp: boolean);
  public
    procedure IniShow(FormCaption: String);
    Function Execute:boolean;
  end;

var
  frmPersonReportDisplay: TfrmPersonReportDisplay;

implementation

uses
  unCDM, UnReportInfo, unCSort;

{$R *.DFM}
procedure TfrmPersonReportDisplay.FormCreate(Sender: TObject);
begin
  bReShow:=False;
  nShowNum:=0;
end;

// 取消/删除的定制列
procedure TfrmPersonReportDisplay.spDownClick(Sender: TObject);
var nWidth:Integer;
    sTemp:string;//用于防止列过长而临时生成的一个变量
begin
  IF ((lvDisplayDetail.ItemIndex<0)
     OR (lvDisplayDetail.ItemIndex>lvDisplayDetail.Items.Count))THEN
  begin
     StatusBar1.Panels.Items[1].Text := '请选择你要取消/删除的定制列!';
     EXIT;
  end;
//  sFormCaption:= TRIM(lvReportName.Items[nOldSelectRow].Caption);
  sTemp:=lvDisplayDetail.Items[lvDisplayDetail.ItemIndex].Caption;
  if bAgreeDel(sFormCaption,sTemp)=False then
  begin
    if ((MessageDlg('   该列已被选择打印输出,您确认不显示该列吗?' ,
        mtConfirmation ,[mbYes,mbNo] ,0) <> mrYes)) then
    begin
      StatusBar1.Panels.Items[1].Text := '取消操作';
      exit;
    end;
  end;
 // begin
  sTemp:=lvDisplayDetail.Items[lvDisplayDetail.ItemIndex].SubItems[0];
  nWidth:=StrToInt(sTemp);
  StatusBar1.Panels.Items[1].Text := '取消显示列:'
                    +lvDisplayDetail.Items[lvDisplayDetail.ItemIndex].Caption;
  lvDisplayDetail.Items[lvDisplayDetail.ItemIndex].Delete;

end;

//存盘
procedure TfrmPersonReportDisplay.spSaveDBClick(Sender: TObject);
var qQryDB:TQuery;
    i:integer;
begin
  StatusBar1.Panels[1].Text := '正在保存修改和刷新显示,请稍后......';
  Application.ProcessMessages;
  bReShow:=False;
  if lvDisplayDetail.Items.Count=nShowNum then//判断出
  begin
    for i:=0 to nShowNum-1 do//判断是否有变化
    begin
      if aShowColum[i]<>lvDisplayDetail.Items[i].Caption then
         Break;
    end;
    if i=nShowNum then
    begin
      close;
      Exit;
    end;
  end;
  bReShow:=True;//此种情况都需要重新刷新显示
  qQryDB:=TQuery.Create(nil);
  qQryDB.DatabaseName:=CDM.dbData.DatabaseName;
  qQryDB.SessionName:=CDM.dbData.SessionName;  qQryDB.Close;
  qQryDB.Sql.Clear;
  //删掉该员工该窗体设置的历史数据
  qQryDB.sql.Add('DELETE FROM SFRJPERSONDISPLAY WHERE (STAFFID='''
  +sUserID+''') AND SFRJPERSONDISPLAY.TABLEDETAILID IN'
  +' ( SELECT SFRJTABLEDETAIL.TABLEDETAILID FROM SFRJTABLEDETAIL '
  +'WHERE FORMCAPTION='''+sFormCaption+''')');
  qQryDB.ExecSQL;
  i:=0;
  //循环写入当前的显示字段信息
  while i< lvDisplayDetail.Items.Count do
  begin
    qQryDB.Close;
    qQryDB.sql.Clear;
    qQryDB.sql.Add('INSERT INTO SFRJPERSONDISPLAY(STAFFID,TABLEDETAILID,DISPLAYTAB)');
    qQryDB.sql.Add(' VALUES('''
     +sUserID+''','+lvDisplayDetail.Items[i].SubItems[1]
     +','+IntToStr(i)+')');
    qQryDB.ExecSql;
    i:=i+1;
  end;
  qQryDB.Close;
  qQryDB.Free;
  qQryDB:=nil;
  StatusBar1.Panels.Items[1].Text := '定制显示方案保存成功!';
  close;
end;

//选取一行,最多不得超过25行
procedure TfrmPersonReportDisplay.spUpClick(Sender: TObject);
var j,i,nWidth:integer;
begin
  try
    if lvDisplayDetail.Items.Count>25 then
    begin
       StatusBar1.Panels.Items[1].Text := '本显示定制最多支持25列,请调整!';
       EXIT;
    end;
    If ((lvTableDetail.ItemIndex<0)
       OR (lvTableDetail.ItemIndex>lvTableDetail.Items.Count))Then
    begin
       StatusBar1.Panels.Items[1].Text := '请选择你要定制的列!';
       EXIT;
    end;
    nRowSelected:=lvTableDetail.ItemIndex;
    SelectShow;//选取该行到右边
    StatusBar1.Panels.Items[1].Text := '选择显示列名称:'
                                     +lvTableDetail.Items[nRowSelected].Caption;
  except;
  end;
END;

//选取一行信息的具体实现
procedure TfrmPersonReportDisplay.SelectShow;
var i,nWidth:Integer;
    sCaption,StrSerial:String;
begin
  i:=nRowSelected;
  if(i>=0)then
  begin
    sCaption:=lvTableDetail.Items[i].Caption;
    nWidth:=StrToInt(lvTableDetail.Items[i].SubItems[0]);
    StrSerial:=lvTableDetail.Items[i].SubItems[1];
    //合乎要求继续
    i:=0;
    while i< lvDisplayDetail.Items.Count do
    begin
        if(lvDisplayDetail.Items[i].Caption =sCaption)then
          break;
        i:=i+1;
    end;
    if(i = lvDisplayDetail.Items.Count)then
    begin
        lvDisplayDetail.items.BeginUpdate;
        with lvDisplayDetail.Items.Add do//加入到右边列中
        begin
            Caption:=sCaption;
            SubItems.Add(IntToStr(nWidth));
            SubItems.Add(StrSerial);
        end;
        lvDisplayDetail.items.EndUpdate;
    end
    else
       Application.MessageBox('   你选择的显示列已经存在,请检查是否重复!',
                                                            '系统信息管理窗',0);
  end;
  StatusBar1.Panels.Items[1].Text := '添加显示列成功';
end;
//取消存盘前的操作
procedure TfrmPersonReportDisplay.spAllUpClick(Sender: TObject);
var qQryDB:TQuery;
begin
  qQryDB:=TQuery.Create(nil);
  qQryDB.DatabaseName:=CDM.dbData.DatabaseName;
  qQryDB.SessionName:=CDM.dbData.SessionName;  with qQryDB do
  begin
      Close;//选择要显示的字段LISTVIEW初始化
      SQL.Clear;
      SQL.Add('SELECT A.TABLEDETAILID,DISPLAYTAB,'
      +'CAPTION,WIDTH,FORMCAPTION FROM SFRJPERSONDISPLAY A,SFRJTABLEDETAIL B ');
      SQL.Add('WHERE (A.STAFFID='''+sUserID+''') '
      +'AND (A.TABLEDETAILID=B.TABLEDETAILID) AND (FORMCAPTION='''
      +sFormCaption+''' )ORDER BY DISPLAYTAB ASC');
      Open;
      First;

  //在个性化中无显示内容时以统一的显示为准 begin
      if qQryDB.RecordCount<=0 then//只有当有查询的记录数时才执行下面的操作
      begin
        qQryDB.Close;//选择要显示的字段LISTVIEW初始化
        qQryDB.SQL.Clear;
        qQryDB.SQL.Add('SELECT INARYSERIALID,DISPLAYTAB,CAPTION,B.TABLEDETAILID,'
          +' COLUMNNAME,WIDTH,DATATYPE FROM SFRJDISPLAYDETAIL A,SFRJTABLEDETAIL B '
          +'WHERE (A.TABLEDETAILID=B.TABLEDETAILID) AND (FORMCAPTION='''+sFormCaption
      +''') ORDER BY DISPLAYTAB ASC');
        qQryDB.Open;
        qQryDB.First;
      end;

      lvDisplayDetail.items.BeginUpdate;
      lvDisplayDetail.items.Clear;
      While not Eof do//重新写入
      begin
        with lvDisplayDetail.Items.Add do
        begin
          Caption:=FieldByName('CAPTION').AsString;
          SubItems.Add(FieldByName('WIDTH').Asstring);
          SubItems.Add(FieldByName('TABLEDETAILID').Asstring);
          Next ;
        end;
      end;
      lvDisplayDetail.items.endupdate;
      qQryDB.Close;
      qQryDB.Free;
      qQryDB:=nil;
   END;
end;

//窗体关闭,并清空相应LISTVIEW
procedure TfrmPersonReportDisplay.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  lvTableDetail.Items.Clear;
  lvDisplayDetail.Items.Clear;
end;

procedure TfrmPersonReportDisplay.BitBtn1Click(Sender: TObject);
var i,nWidth:Integer;
    sCaption,StrSerial:String;
begin
    i:=nRowSelected;
    if(i>=0)then
    begin
        sCaption:=lvTableDetail.Items[i].Caption;

⌨️ 快捷键说明

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