• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Delphi关于StringGrid的公用模块[转]

原作者: [db:作者] 来自: [db:来源] 收藏 邀请


Posted on 2011-04-02 11:36 xun*2 阅读(353) 评论(0) 编辑 收藏
unit SGridFunction;   
{*******************************************  
模块名称:StringGrid操作函数模块  
编写者:Tony  
开始日期:2006年12月05日  
版本号:v1.0.7  
********************************************}   
interface   
uses   
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,SConnect,   
  Dialogs, Global, Grids, DBGrids, DB, DBClient, WinSkinData, StdCtrls,   
  Buttons, ExtCtrls, ComCtrls, ComObj, Clipbrd, ADODB;   
  //成功提示框   
  //AMsg: 成功提示信息   
  procedure SuccessMsgbox(AMsg: String);   
  //错误提示框   
  //AMsg: 错误提示信息   
  procedure ErrorMsgbox(AMsg: String);   
  //询问提示框   
  //strMsg:询问信息   
  function AskMsgbox(AMsg: String): Boolean;   
  //信息提示框   
  //AMsg: 提示信息   
  procedure InfoMsgbox(AMsg: String);   
  //导出数据到Excel   
  //ASGrid:需要导出的StringGrid   
  //ExcelModalPath: 报表模版全路径,为空则新建工作簿   
  //ExcelFileName: Excel文件的默认文件名   
  //AGridStartCol, AGridStartRow: StringGrid的起始列和行,从0开始   
  //AExcelStartCol, AExcelStartRow: Excel的起始列和行,从1开始   
  procedure ExportToExcel(ASGrid: TStringGrid; ExcelModalPath, ExcelFileName: String;   
    AGridStartCol, AGridStartRow, AExcelStartCol, AExcelStartRow: Integer);   
  //取得某一列数据的最大长度   
  //ASgrid: 目标StringGrid   
  //ACol: 目标列,从0开始   
  //AStartRow: 起始行,从0开始   
  function GetColMaxDataLength(ASGrid: TStringGrid; ACol, AStartRow: Integer): Integer;   
  //根据数据长度自动设置指定列的列宽   
  //ASgrid: 目标StringGrid   
  //ACol: 目标列,从0开始   
  procedure SetOneColWidth(ASGrid: TStringGrid; ACol: Integer);   
  //根据数据长度自动设置全部列的列宽   
  //ASgrid: 目标StringGrid   
  procedure SetAllColWidth(ASGrid: TStringGrid);   
  //显示ClientDataSet中的数据   
  //ASgrid: 目标StringGrid   
  //ACDSet: 包含数据的ClientDataSet   
  //AGridStartCol, AGridStartRow: StringGrid的起始列和行,从0开始   
  procedure ShowClientDataSetData(ASGrid: TStringGrid; ACDSet: TClientDataSet;   
    AGridStartCol, AGridStartRow: Integer);   
  //显示ADOQuery中的数据   
  //ASgrid: 目标StringGrid   
  //AQuery: 包含数据的ADOQuery   
  //AGridStartCol, AGridStartRow: StringGrid的起始列和行,从0开始   
  procedure ShowQueryData(ASGrid: TStringGrid; AQuery: TADOQuery;   
    AGridStartCol, AGridStartRow: Integer);   
  //判断是否含有数据   
  //true: 包含数据   
  //false: 不包含数据   
  //ASgrid: 目标StringGrid   
  //AStartCol, AStartRow: 起始列和行,从0开始   
  function HaveData(ASGrid: TStringGrid; AStartCol, AStartRow: Integer): Boolean;   
  //取得9位以内整数位数   
  //>=1: 该整型数的长度   
  //0: 空值   
  //-1: 长度超过9位   
  //ANumber: 需要判断位数的整型数   
  function GetIntegerNumberLength(ANumber: Integer): Integer;   
  //为指定的序号列赋值   
  //序号编号从1开始   
  //ASGrid: 目标StringGrid   
  //ACol: 目标列,从0开始   
  //AStartRow: 起始行,从0开始   
  procedure SetNumberFields(ASGrid: TStringGrid; ACol, AStartRow: Integer);   
  //设置指定的列的对齐方式为右对齐   
  //实现方式为在数据左边补空格,所以取数据时应注意去掉空格   
  //ASGrid: 目标StringGrid   
  //ACol: 目标列,从0开始   
  //AStartRow: 起始行,从0开始   
  procedure SetColAlignRight(ASGrid: TStringGrid; ACol, AStartRow: Integer);   
  //设置指定行的左边距   
  //ASGrid: 目标StringGrid   
  //ARow: 目标行,从0开始   
  procedure SetRowLeftSpace(ASGrid: TStringGrid; ARow, SpaceLength: Integer);   
  //设置指定行的最小右边距   
  //ASGrid: 目标StringGrid   
  //ARow: 目标行,从0开始   
  procedure SetRowMinRightSpace(ASGrid: TStringGrid; ARow, SpaceLength: Integer);   
  //设置指定行的最小边距   
  //ASGrid: 目标StringGrid   
  //ARow: 目标行,从0开始   
  procedure SetRowMinSpaceWidth(ASGrid: TStringGrid; ARow, SpaceLength: Integer);   
  //获得当前X坐标所在的列   
  //ASGrid: 目标StringGrid   
  //AX: 坐标的X值   
  function GetColByCX(ASGrid: TStringGrid; AX: Integer): Integer;    
  //获得当前Y坐标所在的行   
  //ASGrid: 目标StringGrid   
  //AY: 坐标的Y值   
  function GetRowByCY(ASGrid: TStringGrid; AY: Integer): Integer;   
  //获得当前坐标所处的单元格的行列值   
  //ASGrid: 目标StringGrid   
  //AX, AY: 坐标的X,Y值   
  //ACol, ARow: 单元格的列,行索引,从0开始   
  procedure GetCellByCoordinate(ASGrid: TStringGrid; AX, AY: Integer;   
    out ACol, ARow: Integer);   
  //填充空的单元格为指定值   
  //ASGrid: 目标StringGrid   
  //AStartCol, AStartRow: 开始列和行,从0开始   
  //AEndCol, AEndRow: 结束列和行   
  //AValue: 填充值   
  procedure SetSpaceCells(ASGrid: TStringGrid; AStartCol, AStartRow,   
    AEndCol, AEndRow: Integer; AValue:String);   
implementation   
//----------------------------------------------------------------------------//   
//成功提示框   
//----------------------------------------------------------------------------//   
procedure SuccessMsgbox(AMsg: String);   
begin   
  Application.MessageBox(Pchar(AMsg), '完成', MB_ICONINFORMATION + MB_OK);   
end;   
//----------------------------------------------------------------------------//   
//错误提示框   
//----------------------------------------------------------------------------//   
procedure ErrorMsgbox(AMsg: String);   
begin   
  Application.MessageBox(Pchar(AMsg), '错误', MB_ICONSTOP + MB_OK);   
end;   
//----------------------------------------------------------------------------//   
//询问提示框   
//----------------------------------------------------------------------------//   
function AskMsgbox(AMsg: String): Boolean;   
begin   
  if Application.MessageBox(Pchar(AMsg), '确认',   
    MB_ICONQUESTION + MB_YESNO) = IDYES then   
  begin   
    result := true;   
  end   
  else begin   
    result := false;   
  end;   
end;   
//----------------------------------------------------------------------------//   
//消息提示框   
//----------------------------------------------------------------------------//   
procedure InfoMsgbox(AMsg: String);   
begin   
  Application.MessageBox(Pchar(AMsg), '提示', MB_ICONINFORMATION + MB_OK);   
end;   
//----------------------------------------------------------------------------//   
//导出数据到Excel   
//----------------------------------------------------------------------------//   
procedure ExportToExcel(ASGrid: TStringGrid; ExcelModalPath, ExcelFileName: String;   
    AGridStartCol, AGridStartRow, AExcelStartCol, AExcelStartRow: Integer);   
var      
  ExcelApp: Variant;   
  ColIndex, RowIndex: Integer;   
  OneRowData: String; //单行数据   
  DataList: TStringList; //所有数据   
  SaveDlg: TSaveDialog; //保存对话框   
  SaveExcelFilePath: String; //Excel文件的保存路径   
begin   
  try   
    //没有数据时直接退出   
    if not HaveData(ASGrid, AGridStartCol, AGridStartRow) then   
    begin   
      InfoMsgBox('没有数据需要导出。');   
      exit;   
    end;   
    //选择保存路径   
    try   
      SaveDlg := TSaveDialog.Create(ASGrid); //创建保存窗口对象   
      SaveDlg.InitialDir := ExtractFilePath(Application.ExeName); //文件保存在当前目录   
      SaveDlg.Filter := 'Excel Files(*.xls)| *.xls'; //文件类型过滤   
      SaveDlg.FileName := ExcelFileName + VarToStr(date); //定义默认文件名   
      if SaveDlg.Execute then   
      begin   
        SaveExcelFilePath := SaveDlg.FileName; //保存文件路径   
      end   
      else begin   
        exit; //放弃导出   
      end;   
    finally   
      SaveDlg.Free; //释放对象   
    end;   
    //创建Excel对象   
    try   
      ExcelApp := CreateOleObject( 'Excel.Application' ); //创建新Excel对象   
    except   
      ErrorMsgBox('请确认您的机器已经安装 Microsoft Excel 。');   
      Exit;   
    end;   
    try   
      //打开Excel工作簿   
      try   
        //打开报表模版   
        if (excelModalPath <> null) and (excelModalPath <> '') then   
        begin   
          ExcelApp.WorkBooks.Open(ExcelModalPath);   
        end   
        //添加新工作簿   
        else begin   
          ExcelApp.WorkBooks.Add;   
          //设置列宽   
          for ColIndex := 0 to ASGrid.ColCount - AGridStartCol - 1 do   
          begin   
            //此处不能使用ASGrid.ColWidths[AGridStartCol + ColIndex];   
            ExcelApp.ActiveSheet.Columns[AExcelStartCol + ColIndex].ColumnWidth    
              := GetColMaxDataLength(ASGrid, AGridStartCol + ColIndex, AGridStartRow);   
          end;   
          //数字 NumberFormatLocal   =   "0.00_   "   
          //日期 NumberFormatLocal   =   "yyyy-m-d"   
          //时间 NumberFormatLocal   =   "[$-F400]h:mm:ss   AM/PM"   
          //文本 NumberFormatLocal   =   "@"   
          ExcelApp.Cells.NumberFormatLocal := '@'; //设置单元格为文本格式   
        end;   
        ExcelApp.WorkSheets[1].Activate; //设置第1个工作表为活动工作表   
        ExcelApp.Cells.Item[AExcelStartRow, AExcelStartCol].Select; //设定Excel起始单元格   
      except   
        ErrorMsgBox('无法打开报表模版:' + #13 + ExcelModalPath); //#13为回车换行   
        exit;   
      end;   
      try   
        //通过剪切板导出数据   
        try   
          //初始化DataList   
          DataList := TStringList.Create;   
          DataList.Clear;   
          //将数据保存到DataList   
          with ASGrid do   
          begin   
            //行   
            for RowIndex := AGridStartRow to RowCount - 1 do   
            begin   
              OneRowData := '';   
              //列   
              for ColIndex := AGridStartCol to ColCount - 1 do   
              begin   
                OneRowData := OneRowData + Trim(Cells[ColIndex, RowIndex]) + #9; //#9为制表符   
              end;   
              DataList.Add(OneRowData); //将该行数据添加到DataList   
            end;   
          end;   
          ClipBoard.AsText := DataList.Text; //将DataList中的数据拷贝到剪切板   
          ExcelApp.ActiveSheet.Paste; //将剪切板中的数据拷贝到Excel   
        finally   
          DataList.Free; //释放DataList   
          ClipBoard.Clear; //清空剪切板   
        end;      
        //保存Excel文件   
        ExcelApp.ActiveWorkbook.SaveAs(SaveExcelFilePath); //另存为到指定目录   
        SuccessMsgBox('成功将文件保存到:' + #13 + SaveExcelFilePath); //保存成功   
      finally   
        ExcelApp.DisplayAlerts := false; //不弹出保存提示对话框   
        ExcelApp.WorkBooks.Close; //关闭工作簿   
      end;   
    finally   
      ExcelApp.Quit; //关闭Excel进程   
      ExcelApp:= Unassigned; //释放ExcelApp   
    end;   
  except     
    On e: Exception do   
    begin   
      ErrorMsgbox(e.Message);   
    end;   
  end;     
end;   
//----------------------------------------------------------------------------//   
//取得某一列数据的最大长度   
//----------------------------------------------------------------------------//   
function GetColMaxDataLength(ASGrid: TStringGrid; ACol, AStartRow: Integer): Integer;   
var   
  ColIndex, RowIndex: Integer;   
  MaxColLength: Integer; //列数据的最大长度   
begin   
  MaxColLength := 0;   
  with ASGrid do   
  begin   
    //取得列数据的最大长度   
    for RowIndex := AStartRow to RowCount - 1 do   
    begin   
      if length(Cells[ACol, RowIndex]) > MaxColLength then   
      begin   
        MaxColLength:= length(Cells[ACol, RowIndex]);   
      end;   
    end;   
  end;   
  result := MaxColLength;   
end;   
//----------------------------------------------------------------------------//   
//根据数据长度自动设置指定列的列宽   
//----------------------------------------------------------------------------//   
procedure SetOneColWidth(ASGrid: TStringGrid; ACol: Integer);   
var   
  OneCharPixel: Integer; //一个字符所占的像素数   
  RightSpaceWidth: Integer; //右边距空隙   
begin   
  RightSpaceWidth := 3; //设置为3达到和左边距一致的效果   
  OneCharPixel := 6; //6对应9号字[*此处最好写成一个根据字号获得像素值的函数*]   
  ASGrid.ColWidths[ACol] := GetColMaxDataLength(ASGrid, ACol, 0) * OneCharPixel   
  + RightSpaceWidth;   
end;   
//----------------------------------------------------------------------------//   
//根据数据长度自动设置全部列的列宽   
//----------------------------------------------------------------------------//   
procedure SetAllColWidth(ASGrid: TStringGrid);   
var   
  ColIndex: Integer; //需要设置的列   
begin   
  for ColIndex := 0 to ASGrid.ColCount - 1 do   
  begin   
    SetOneColWidth(ASGrid, ColIndex);   
  end;   
end;   
//----------------------------------------------------------------------------//   
//显示ClientDataSet中的数据   
//----------------------------------------------------------------------------//   
procedure ShowClientDataSetData(ASGrid: TStringGrid; ACDSet: TClientDataSet; 

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Matlab的regionprops详解发布时间:2022-07-18
下一篇:
Delphi程序结构发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap