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

📄 unreportdisplay.pas

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

interface

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

type
  TfrmReportDisplay = class(TForm)
    StatusBar1: TStatusBar;
    GroupBox1: TGroupBox;
    Panel1: TPanel;
    Splitter1: TSplitter;
    GroupBox2: TGroupBox;
    Splitter2: TSplitter;
    GroupBox3: TGroupBox;
    spDown: TSpeedButton;
    spUp: TSpeedButton;
    spAllUp: TSpeedButton;
    lvDisplayDetail: TListView;
    lvTableDetail: TListView;
    miTV: TImageList;
    spSaveDB: TSpeedButton;
    GroupBox4: TPanel;
    GroupBox9: TGroupBox;
    Label3: TLabel;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    ComboBox1: TComboBox;
    Label2: TLabel;
    MainMenu1: TMainMenu;
    N5: TMenuItem;
    Bevel1: TBevel;
    lvReportName: TListView;
    N10: TMenuItem;
    N12: TMenuItem;
    ImageList1: TImageList;
    procedure Splitter2Moved(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure spDownClick(Sender: TObject);
    procedure spSaveDBClick(Sender: TObject);
    procedure spUpClick(Sender: TObject);
    procedure spAllUpClick(Sender: TObject);
    procedure lvReportNameClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure lvReportNameKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure lvTableDetailClick(Sender: TObject);
    procedure lvDisplayDetailClick(Sender: TObject);
    procedure N5Click(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 lvReportNameColumnClick(Sender: TObject;
      Column: TListColumn);
    procedure lvDisplayDetailColumnClick(Sender: TObject;
      Column: TListColumn);
    procedure lvTableDetailColumnClick(Sender: TObject;
      Column: TListColumn);
    procedure spExitClick(Sender: TObject);
  private
    sFormName,sFormCaption,sDiscription: string;
    nOldSelectRow,nRowSelected,nRowWidth:Integer;
    procedure Refresh;
    function bAgreeDel(const FormCaption,
      DisplayColumnCaption: string): boolean;
  end;

var
  frmReportDisplay: TfrmReportDisplay;

implementation

uses
  unCDM, UnReportInfo, unCSort;

{$R *.DFM}

procedure TfrmReportDisplay.Splitter2Moved(Sender: TObject);
begin
  spDown.Top := Splitter2.Top + 4;
  spSaveDB.Top := Splitter2.Top + 4;
  spUp.Top := Splitter2.Top + 4;
  spAllUp.Top := Splitter2.Top + 4;

  spDown.Left := Splitter2.Left + 91;
  spSaveDB.Left := Splitter2.Left + 125;
  spUp.Left := Splitter2.Left + 59;
  spAllUp.Left := Splitter2.Left + 179;
end;

procedure TfrmReportDisplay.FormCreate(Sender: TObject);
begin
    Refresh;//调用刷新LISVIEW
end;
//删除一个显示列
procedure TfrmReportDisplay.spDownClick(Sender: TObject);
var nWidth:Integer;
    sTemp:string;//用于防止列过长而临时生成的一个变量
begin
  if nOldSelectRow<0 then
  begin
       StatusBar1.Panels.Items[1].Text := '请选择你要查询的报表!';
       Exit;
  end;
  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].SubItems[0];
  if bAgreeDel(sFormCaption,sTemp)=False then
  begin
    if ((MessageDlg('   该列已被选择打印输出,您确认不显示该列吗?' ,
        mtConfirmation ,[mbYes,mbNo] ,0) <> mrYes)) then
    begin
      StatusBar1.Panels.Items[1].Text := '取消操作';
      exit;
    end;
  end;
  sTemp:=lvDisplayDetail.Items[lvDisplayDetail.ItemIndex].SubItems[1];
  nWidth:=StrToInt(sTemp);
  nRowWidth:=nRowWidth-nWidth;
  lvDisplayDetail.Items[lvDisplayDetail.ItemIndex].Delete;
  StatusBar1.Panels.Items[1].Text := '窗体名称:'+sFormCaption
     +',删除显示列成功';
end;
//保存选择
procedure TfrmReportDisplay.spSaveDBClick(Sender: TObject);
var qQryDB:TQuery;
    i:integer;
    sFormCaption,stemp1,stemp2:string;
begin
  i:=nOldSelectRow;//lvReportName.ItemIndex;
  sFormCaption:=TRIM(lvReportName.Items[i].Caption);
  qQryDB:=TQuery.Create(nil);
  qQryDB.DatabaseName:=CDM.dbData.DatabaseName;
  qQryDB.SessionName:=CDM.dbData.SessionName;
  qQryDB.Close;
  qQryDB.Sql.Clear;
  //保存前先删除历史显示
  qQryDB.sql.Add('DELETE FROM SFRJDISPLAYDETAIL '
  +'WHERE SFRJDISPLAYDETAIL.TABLEDETAILID IN '
  +'( SELECT SFRJTABLEDETAIL.TABLEDETAILID FROM SFRJTABLEDETAIL'
  +' WHERE FORMCAPTION='''+sFormCaption+''')');
  qQryDB.ExecSQL;
  qQryDB.Close;
  i:=0;
  while i< lvDisplayDetail.Items.Count do
  begin
    qQryDB.Close;
    qQryDB.sql.Clear;
    stemp1:=lvDisplayDetail.Items[i].SubItems[3];
    stemp2:=lvDisplayDetail.Items[i].Caption;
    qQryDB.sql.Add('INSERT INTO SFRJDISPLAYDETAIL(TABLEDETAILID,DISPLAYTAB)');
    qQryDB.sql.Add(' VALUES('+stemp1+','+stemp2+')');
    qQryDB.ExecSql;
    i:=i+1;
  end;
  qQryDB.Close;
  qQryDB.Free;
  qQryDB:=nil;
  StatusBar1.Panels.Items[1].Text:='定制显示内容保存成功!窗体名称:'+sFormCaption;
end;
//选取一条显示列
procedure TfrmReportDisplay.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;
    if nOldSelectRow<0 then
    begin
         StatusBar1.Panels.Items[1].Text := '请选择你要查询的报表!';
         Exit;
    end;
    GroupBox4.Visible:=False;
    i:=lvTableDetail.ItemIndex;
    if(i>=0)then
    begin
        nWidth:=StrToInt(lvTableDetail.Items[i].SubItems[0]);
    end;

    spUp.Enabled:=False;
    ComboBox1.Clear;
    j:=0;
    //需要判断该列是否已经选取
    for j:=1 to 25 do
    begin
        i:=0;
        while i< lvDisplayDetail.Items.Count do
        begin
            if lvDisplayDetail.Items[i].Caption=IntToStr(j)then
              break;
            i:=i+1;
        end;
        if i= lvDisplayDetail.Items.Count then
           ComboBox1.Items.Add(IntToStr(j));
    end;
    nRowSelected:=lvTableDetail.ItemIndex;
    ComboBox1.ItemIndex:=0;
    GroupBox4.Visible:=True;
    Label2.Caption:='选择列:'+lvTableDetail.Items[nRowSelected].Caption;
    StatusBar1.Panels.Items[1].Text := '窗体名称:'+sFormCaption
                 +',选择显示列名称:'+lvTableDetail.Items[nRowSelected].Caption;
  except;
  end;
END;

//取消刚才未存盘前的操作
procedure TfrmReportDisplay.spAllUpClick(Sender: TObject);
var qQryDB:TQuery;
    sFormCaption:string;
begin
  if nOldSelectRow<0 then
  begin
       StatusBar1.Panels.Items[1].Text := '请选择你要查询的报表!';
       Exit;
  end;
  sFormCaption:=lvReportName.Items[nOldSelectRow].Caption;
  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 SFRJDISPLAYDETAIL A,SFRJTABLEDETAIL B ');
    SQL.Add('WHERE A.TABLEDETAILID=B.TABLEDETAILID AND FORMCAPTION='''
             +sFormCaption+''' ORDER BY DISPLAYTAB ASC');
    Open;
    First;
    lvDisplayDetail.items.BeginUpdate;
    lvDisplayDetail.items.Clear;
    nRowWidth:=0;//显示列总宽度
    //恢复以前的显示字段信息
    While not Eof do
    begin
      with lvDisplayDetail.Items.Add do
      begin
        Caption:=FieldByName('DISPLAYTAB').AsString;
        SubItems.Add(FieldByName('CAPTION').AsString);
        SubItems.Add(FieldByName('WIDTH').Asstring);
        nRowWidth:=nRowWidth+FieldByName('WIDTH').AsInteger;
        SubItems.Add(sFormCaption);
        SubItems.Add(FieldByName('TABLEDETAILID').Asstring);
        Next ;
      end;
    end;
    lvDisplayDetail.items.endupdate;
    qQryDB.Close;
    qQryDB.Free;
    qQryDB:=nil;
  End;
  StatusBar1.Panels.Items[1].Text := '窗体名称:'+sFormCaption;
end;
//查看指定窗体的显示列信息
procedure TfrmReportDisplay.lvReportNameClick(Sender: TObject);
var qQryDB:TQuery;
    sFormCaption:string;
begin
  if nOldSelectRow=lvReportName.ItemIndex then
     Exit;
  GroupBox4.Visible:=False;
  spUp.Enabled:=True;
  spDown.Enabled:=True;
  spSaveDB.Enabled:=True;
  spAllUp.Enabled:=True;
  if ((lvReportName.ItemIndex<0)
     or(lvReportName.ItemIndex>lvReportName.Items.Count)) then
    exit;
  sFormCaption:=lvReportName.Items[lvReportName.ItemIndex].Caption;
  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 SFRJDISPLAYDETAIL A,SFRJTABLEDETAIL B ');
    SQL.Add('WHERE A.TABLEDETAILID=B.TABLEDETAILID AND FORMCAPTION='''
            +sFormCaption+''' ORDER BY DISPLAYTAB ASC');
    Open;
    First;
    lvDisplayDetail.items.BeginUpdate;
    lvDisplayDetail.items.Clear;
    nRowWidth:=0;//显示列总宽度
    //显示以前的显示字段信息
    While not Eof do
    begin
      with lvDisplayDetail.Items.Add do
      begin
        Caption:=FieldByName('DISPLAYTAB').AsString;
        SubItems.Add(FieldByName('CAPTION').AsString);
        SubItems.Add(FieldByName('WIDTH').Asstring);
        nRowWidth:=nRowWidth+FieldByName('WIDTH').AsInteger;
        SubItems.Add(sFormCaption);
        SubItems.Add(FieldByName('TABLEDETAILID').Asstring);
        Next ;
      end;
    end;
    lvDisplayDetail.items.endupdate;
    Close;//提供可以选择的字段LISTVIEW初始化
    SQL.Clear;
    SQL.Add('SELECT TABLEDETAILID,CAPTION,WIDTH,FORMCAPTION '
            +'FROM SFRJTABLEDETAIL A WHERE FORMCAPTION='''+sFormCaption
            +''' ORDER BY TABLEDETAILID');
    Open;
    First;
    lvTableDetail.items.BeginUpdate;
    lvTableDetail.items.Clear;
    //显示可提供显示的字段信息
    While not Eof do
    begin
      with lvTableDetail.Items.Add do

⌨️ 快捷键说明

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