首页  编辑  

一个函数集

Tags: /超级猛料/Alogrith.算法和数据结构/源代码/   Date Created:

unit MyLib;

interface

uses

 classes, Printers, DBGrids, Graphics, Sysutils, Windows, Forms, DB, Grids,

 Dialogs, ComObj, Controls,StdCtrls;

type

 TPrnOut = class(TObject)

   procedure PrintHeader(s:string);

   procedure PrintFoot(s:string);

   procedure PrintLine(x1,y1,x2,y2:integer);

   procedure PrintRow(Items:TStringList;rowDBGrid:TDBGrid);

   procedure PrintColumns(colDBGrid:TDBGrid);

   procedure PrintRecords(recDBGrid:TDBGrid);

   procedure PrintPart(MDBG,PDBG:TDBGrid);

   procedure SingleDBGPrint(DBgrid:TDBGrid;Header,Footer:string);

   procedure DoubleDBGPrint(MainDBG,PartDBG:TDBGrid;Header,Footer:string);

 private

   { Private declarations }

   strHead,strFoot:string;

   iPage:integer;

   iWordWidth,iWordHeight:integer;  //单位字宽与字高

   iAmount:integer;

   iPageHeight,iPageWidth:integer;  //有效打印区域高度与宽度

   PixelsInInchX:integer;

   {Number of pixels in 1/10 of an inch.This is used for lin spacing}

   TenthsOfInchPixelsY: Integer;

 public

   { Public declarations }

 end;

{TStrGridPrn}

type

 TStrGridPrn = class(TObject)

   procedure PrintHeader(s:string);

   procedure PrintFoot(s:string);

   procedure PrintLine(x1,y1,x2,y2:integer);

   procedure PrintRow(Items:TStringList;StrGrid:TStringGrid);

   procedure PrintColumns(StrGrid:TStringGrid);

   procedure PrintRecords(StrGrid:TStringGrid);

   procedure StrGridPrint(StrGrid:TStringGrid;Header,Footer:string);

 private

   { Private declarations }

   strHead,strFoot:string;

   iPage:integer;

   iWordWidth,iWordHeight:integer;  //单位字宽与字高

   iAmount:integer;

   iPageHeight,iPageWidth:integer;  //有效打印区域高度与宽度

   PixelsInInchX:integer;

   {Number of pixels in 1/10 of an inch.This is used for lin spacing}

   TenthsOfInchPixelsY: Integer;

 public

   { Public declarations }

 end;

type

 TRMB = Class(TObject)

   Function BigRBM(sn:Double):String;

 private

   { Private declarations }

 public

   { Public declarations }

 end;

type

 TDBExcel =class(TObject)

   procedure DBToExcel(DBGrid:TDBGrid);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

{我的自编函数集}

function StrFormat(ch:Char;s:string;len,index:integer):string;

//格式化一个字符串s,在index处加字符ch,使其长度len,

funCtion FormatStr(ch,s:string;Len:Integer):string;

//在字符串S前加若干个CH使期长度变为LEN

function CharInStr(ch:char;s:string):integer;

//计算字符串s里字符ch的数量

function IsNumeric(s:string):Boolean;

{判断字符串是否可以转换成数值。返回True表示可以}

function ClearSpace(s:string):string;

{清除字符串中的所有空格}

function IsEndOfMonth(Date:TDateTime):Boolean;

{判断Date是否为月末最后一天}

function IsEndOfYear(Date:TDateTime):Boolean;

{判断Date是否为年末最后一天}

function GetOSInfo:string;

{获取操作系统信息}

procedure StrGridMove(sg:TStringGrid;FromIndex,ToIndex:Integer);

{移动字符串栅格行}

procedure StrGridDel(strgrd:TStringGrid;id:Integer);

{删除一行}

function RunSQL:String;

{生成万能查询语句}

(*procedure RunFile(FileName,paramer,path:string);

{运行文件,fn为文件名,pm为参数,出错则显示信息}

*)

function ToTime(DateTime:TDateTime;day,hour,minute,second:{加减量}integer):TDateTime;

//加减时间

procedure TimeMinus(dt1,dt2:TDateTime;var Day,Hour,Minute,Second:Integer);

//求两时间差值,返回日、时、分、秒。

funCtion InputStr(t,p,DefaultValue:string;Pass:Boolean):string;

//类似于InputBox

implementation

uses RunSQL,ShellAPI;

{我的函数}

funCtion InputStr(t,p,DefaultValue:string;Pass:Boolean):string;

var

 Form:TForm;

 edit:TEdit;

 btnOK,btnCancel:TButton;

begin

 Form :=TForm.Create(Application);

 with Form do

 begin

   BorderStyle :=bsDialog;

   FormStyle :=fsStayOnTop;

   with Font do

   begin

     Height :=-14;

     Name :='宋体';

     Size :=11;

     Pitch :=fpDefault;

     style :=[];

   end;

   Height :=151;

   Width :=293;

   Position :=poDesktopCenter;

   Caption :=t;

   with TLabel.Create(Form) do

   begin

     Parent := Form;

     Top :=16;

     Left :=24;

     Caption :=p;

   end;

   Edit :=TEdit.Create(Form);

   with Edit do

   begin

     Parent := Form;

     Top :=40;

     Left :=24;

     Width :=241;

     Text :=DefaultValue;

     if pass then PasswordChar :='*'

     else PasswordChar :=#0;

     SelectAll;

   end;

   btnOK :=TButton.Create(Form);

   with btnOK do

   begin

     Parent := Form;

     Top := 88;

     Left := 58;

     Caption :='确定(&O)';

     ModalResult :=mrOK;

     Default :=True;

   end;

   btnCancel :=TButton.Create(Form);

   with btnCancel do

   begin

     Parent := Form;

     Top := 88;

     Left := 154;

     Caption :='取消(&C)';

     ModalResult :=mrCancel;

   end;

   if ShowModal=mrOK then

   begin

     Result := Edit.Text;

   end;

   Free;

 end;

end;

procedure TimeMinus(dt1,dt2:TDateTime;var Day,Hour,Minute,Second:Integer);

var

 d:Real;

 h,m,s:integer;

 hh1,mm1,ss1,ms1,hh2,mm2,ss2,ms2:word;

begin

 try

   {两个时间差}

   DecodeTime(dt1,hh1,mm1,ss1,ms1);

   DecodeTime(dt2,hh2,mm2,ss2,ms2);

 except

   Exit;

 end;

 d:=int(dt1-dt2);

 h:=hh1;

 m:=mm1;

 s:=ss1;

 if s<ss2 then

 begin

   m:=m-1;

   s:=s+60;

 end;

 if m<mm2 then

 begin

   h:=h-1;

   m:=m+60;

 end;

 if h<hh2 then

 begin

   d :=d-1;

   h:=h+24;

 end;

 {返回day,hour,minute,second}

 day :=round(d);

 hour :=h-hh2;

 minute :=m-mm2;

 second :=s-ss2;

end;

function ToTime(DateTime:TDateTime;day,hour,minute,second:{加减量}integer):TDateTime;

var

 hh,mm,ss,ms:word;

 hx,mx,sx:integer;  //新时间值

 dt:TDate;

begin

 dt :=DateTime;

 DecodeTime(DateTime,hh,mm,ss,ms);

 hx:=hh;

 mx:=mm;

 sx:=ss;

 {秒}

 sx:=sx+second;

 if sx<0 then

 begin

   minute :=minute + (sx div 60)-1;

   sx :=60 +(sx mod 60);

 end

 else if sx>=60 then

 begin

   minute :=minute+(sx div 60);

   sx :=sx mod 60;

 end;

 {分}

 mx :=mx+minute;

 if mx<0 then

 begin

   hour :=hour+(mx div 60)-1;

   mx :=60+(mx mod 60);

 end

 else if mx>=24 then

 begin

   hour :=hour+(mx div 60);

   mx :=mx mod 60;

 end;

 {时}

 hx :=hx+hour;

 if hx<0 then

 begin

   day :=day+(hx div 24)-1;

   hx :=24+(hx mod 24);

 end

 else if hx>=24 then

 begin

   day :=day+(hx div 24);

   hx :=hx mod 24;

 end;

 {天}

 dt :=dt+day;

 DateTime :=StrToDateTime(DateToStr(dt)+' '+IntToStr(hx)+':'+IntToStr(mx)+

 ':'+IntToStr(sx)+':');

 Result :=DateTime;

end;

funCtion FormatStr(ch,s:string;Len:Integer):string;

//在字符串S前加若干个CH使期长度变为LEN

begin

 while (len-length(s)>0) do s:=ch+s;

 Result :=s;

end;

function StrFormat(ch:Char;s:string;len,index:integer):string;

begin

 while Len>=Length(s) do

   Insert(ch,s,index);

 Result :=s;

end;

function CharInStr(ch:char;s:string):integer;

//计算字符串s里字符ch的数量

var

   i,count:integer;

begin

   count:=0;

   for i:=1 to length(s) do

       if s[i]=ch then inc(count);

   Result:=count;

end;

{判断数值}

function IsNumeric(S:string):Boolean;

var

 i:integer;

begin

 Result :=True;

 for i:=1 to Length(s) do

 begin

   if (s[i] in ['0'..'9','.','+','-']) then

   begin

     if i>1 then

       if (s[i]='+') or (s[i]='-') then Result :=False;

   end

   else Result :=false;

 end;  //for

 if CharInStr('.',s)>1 then Result :=False;

end;

{清除空格}

function ClearSpace(s:string):string;

begin

 while pos(' ',s)>0 do

   delete(s,pos(' ',s),1);

 Result:=s;

end;

//判断Date是否为月末最后一天

function IsEndOfMonth(Date:TDateTime):Boolean;

var

 yy,mm,dd:Word;

begin

 DecodeDate(Date,yy,mm,dd);

 inc(mm);

 if mm=13 then

 begin

   inc(yy);

   mm :=1;

 end;

 Result :=(EncodeDate(yy,mm,1)-Date<1);

end;

//判断Date是否为年末最后一天

function IsEndOfYear(Date:TDateTime):Boolean;

var

 yy,mm,dd:Word;

begin

 DecodeDate(Date,yy,mm,dd);

 Result :=(EncodeDate(yy+1,1,1)-Date<1);

end;

{获取操作系统信息}

function GetOSInfo:string;

var

 Platform: string;

 BuildNumber: Integer;

begin

 case Win32Platform of

   VER_PLATFORM_WIN32_WINDOWS:

     begin

       Platform := 'Windows 95/98';

       BuildNumber := Win32BuildNumber and $0000FFFF;

     end;

   VER_PLATFORM_WIN32_NT:

     begin

       Platform := 'Windows NT';

       BuildNumber := Win32BuildNumber;

     end;

     else

     begin

       Platform := 'Windows';

       BuildNumber := 0;

     end;

 end;

 if (Win32Platform = VER_PLATFORM_WIN32_WINDOWS) or

   (Win32Platform = VER_PLATFORM_WIN32_NT) then

 begin

   if Win32CSDVersion = '' then

     Result := Format('%s %d.%d (Build %d)', [Platform, Win32MajorVersion,

       Win32MinorVersion, BuildNumber])

   else

     Result := Format('%s %d.%d (Build %d: %s)', [Platform, Win32MajorVersion,

       Win32MinorVersion, BuildNumber, Win32CSDVersion]);

 end

 else

   Result := Format('%s %d.%d', [Platform, Win32MajorVersion,

     Win32MinorVersion])

end;

procedure StrGridMove(sg:TStringGrid;FromIndex,ToIndex:Integer);

var

 lst:TStringList;

 i,id,x:integer;

begin

 lst :=TStringList.Create;

 id:=ToIndex;  //目标指针

 if FromIndex>=ToIndex then x:=1 else x:=-1;  //判断指针下移还上移

 with sg do

 begin

   while id<>FromIndex do

   begin

     lst.clear;

     for i:=0 to ColCount-1 do

       lst.Add(Cells[i,id]);

     for i:=0 to ColCount-1 do

       Cells[i,id] :=Cells[i,FromIndex];

     for i:=0 to ColCount-1 do

       Cells[i,FromIndex] :=lst.Strings[i];

     id :=id+x; //指针转移(x=-1 or x=1)

   end;

 end;

 lst.Free;

end;

procedure StrGridDel(strgrd:TStringGrid;id:Integer);

{删除一行}

var

 i,j:integer;

begin

 with strgrd do

 begin

   if id<1 then exit;

   for i:=id to RowCount-1 do

     for j:=0 to colCount-1 do

     begin

       cells[j,i] :='';

       if i<>RowCount-1 then

         cells[j,i] :=cells[j,i+1]

     end;

   if RowCount>2 then RowCount :=RowCount-1;

 end;

end;

function RunSQL:String;

begin

 frmRunSQL.ShowModal;

 if frmRunSQL.ModalResult=1 then

 begin

   Result :=frmRunSQL.SQLString;

 end;

 frmRunSQL.close;

 frmRunSQL.Free;

end;

(*

procedure RunFile(FileName,paramer,path:string);

var

 Resulr:THandle;

begin

 result:=ShellExecute(Handle,nil,PChar(FileName),

 PChar(paramer),PChar(path),SW_SHOW);

 case Result of

 0:Application.MessageBox('操作系统内存资源不足!',PChar('打开文件'+FileName),MB_OK+MB_ICONError);

 ERROR_FILE_NOT_FOUND:

   Application.MessageBox('文件找不到!',PChar('打开文件'+FileName),MB_OK+MB_ICONError);

 ERROR_PATH_NOT_FOUND:

   Application.MessageBox('路径找不到!',PChar('打开文件'+FileName),MB_OK+MB_ICONError);

 ERROR_BAD_FORMAT:

   Application.MessageBox('文件执行格式错误,不能打开!',PChar('打开文件'+FileName),MB_OK+MB_ICONError);

 SE_ERR_ASSOCINCOMPLETE:

   Application.MessageBox('文件名错误!',PChar('打开文件'+FileName),MB_OK+MB_ICONError);

 else

   Application.MessageBox('文件运行错误!',PChar('打开文件'+FileName),MB_OK+MB_ICONError);

 end;

end;

       *)

{TPrnOut}

procedure TPrnOut.PrintHeader(s:string);

begin

 {页头打印}

 if s='' then s :='<无标题>';

 With Printer do

 begin

   with Canvas.Font do

   begin

     Size :=12;

     Name:='宋体';

   end;

   if (not Aborted) then

     Canvas.TextOut((PageWidth div 2)-(Canvas.TextWidth(s) div 2),0,s);

   iAmount :=iAmount+Canvas.TextHeight(s)*2;

 end;

end;

procedure TPrnOut.PrintFoot(s:string);

var

 str:string;

begin

 {页脚打印}

 if s='' then str:=s+'第'+IntToStr(iPage)+'页'

 else str:= s +'  '+'第'+IntToStr(iPage)+'页';

 With Printer do

   if (not Aborted) then

     Canvas.TextOut((PageWidth div 2)-(Canvas.TextWidth(str) div 2),

     (iPageHeight-iWordHeight),str);

 iAmount :=0;

 iPage :=iPage+1;

end;

procedure TPrnOut.PrintLine(x1,y1,x2,y2:integer);

begin

 with Printer.Canvas do

 begin

   MoveTo(x1,y1);

   LineTo(x2,y2);

 end;

end;

procedure TPrnOut.PrintRow(Items:TStringList;rowDBGrid:TDBGrid);

var

 OutRect:TRect;

 i:integer;

 Inches:Double;

begin

 OutRect.Left :=50;

 OutRect.Top :=iAmount;

 With Printer.Canvas do

 begin

   for i := 0 to Items.Count -1 do

   begin

     Inches :=LongInt(Items.Objects[i])*0.1;

     OutRect.Right :=OutRect.Left + Round(PixelsInInchx * Inches);

     if OutRect.Right>iPageWidth then

     begin

       {换行打印}

       OutRect.Left :=70;

       OutRect.Right :=70+OutRect.Left + Round(PixelsInInchx * Inches);

       iAmount := iAmount + iWordHeight;

       OutRect.Top := iAmount;

     end;

     {换页}

     if (iAmount+iWordHeight)>(iPageHeight-iWordHeight) then

     begin

       PrintFoot('');   //打印页脚

       iAmount :=0;

       if not Printer.Aborted then

         Printer.NewPage;

       PrintHeader('');

       PrintColumns(rowDBGrid);  //打印列头

       OutRect.Left :=70;

       OutRect.Right :=70+OutRect.Left + Round(PixelsInInchx * Inches);

       iAmount := iAmount + iWordHeight;

       OutRect.Top := iAmount;

     end;

     if not printer.Aborted then

       TextRect(OutRect,OutRect.Left,OutRect.Top,Items[i]);

     OutRect.Left :=OutRect.Right;

   end;

 end;

 iAmount :=iAmount + iWordHeight+2;

end;

procedure TPrnOut.PrintColumns(colDBGrid:TDBGrid);

var

 lst:TStringList;

 i:integer;

begin

 {打印列标题}

 lst :=TStringList.Create;

 try

   {获取打印机字的大小}

   with printer.Canvas do

   begin

     Font.Style :=[fsBold,fsUnderline];

     iWordWidth :=TextWidth('x');

     iWordHeight :=TextHeight('x');

   end;

   for i:=0 to colDBGrid.Columns.Count-1 do

     lst.AddObject(colDBGrid.Columns[i].Title.Caption,

     Pointer((colDBGrid.Columns[i].Width div 10)+2));

   PrintRow(lst,colDBGrid);

   Printer.Canvas.Font.Style :=[];

 Except

   lst.Free;

   printer.EndDoc;

 end;

end;

procedure TPrnOut.PrintRecords(recDBGrid:TDBGrid);

var

 lst:TStringList;

 i:integer;

begin

 {打印记录}

 lst :=TStringList.Create;

 try

   with recDBGrid.DataSource.DataSet do

   begin

     First;

     While (not Eof) or Printer.Aborted do

     begin

       Application.ProcessMessages;

       for i:=0 to recDBGrid.Columns.Count-1 do

         lst.AddObject(recDBGrid.Columns[i].Field.DisplayText,

         Pointer((recDBGrid.Columns[i].Width div 10)+2));

       PrintRow(lst,recDBGrid);  //行打印

       lst.Clear;

       Next;

     end;

   end;

 finally

   lst.Free;

 end;

end;

procedure TPrnOut.PrintPart(MDBG,PDBG:TDBGrid);

var

 lst:TStringList;

 i:integer;

begin

 lst :=TStringList.Create;

 try

   with MDBG.DataSource.DataSet do

   begin

     First;

     While (not Eof) do

     begin

       Application.ProcessMessages;

       for i:=0 to FieldDefs.Count-1 do

         lst.AddObject(MDBG.Columns[i].Field.DisplayText,

         Pointer((MDBG.Columns[i].Width div 10)+2));

       PrintRow(lst,MDBG);  //行打印

       lst.Clear;

       PrintColumns(PDBG);

       PrintRecords(PDBG);

       Next;

     end;

   end;

 finally

   lst.Free;

 end;

end;

procedure TPrnOut.SingleDBGPrint(DBGrid:TDBGrid;

 Header,Footer:string);

begin

 screen.Cursor :=crHourglass;

 strHead :=Header;

 strFoot :=Footer;

 iPage :=1;

 {单表打印}

 try

   with Printer do

   begin

     PixelsInInchX :=GetDeviceCaps(Handle,LOGPIXELSX);

     TenthsOfInchPixelsY :=GetDeviceCaps(Printer.Handle,LOGPIXELSY) div 10;

     iPageHeight :=PageHeight;

     iPageWidth :=PageWidth;    //减去左右边距

     Canvas.Font.Size :=11;

     BeginDoc;

   end;

   {打印页头}

   PrintHeader(Header);

   {打印标题栏:粗体,下划线}

   PrintColumns(DBGrid);

   {循环打印记录}

   PrintRecords(DBGrid);

   {打印页脚:页码}

   PrintFoot(Footer);

 finally

   printer.EndDoc;

   screen.Cursor :=crDefault;

 end;

end;

procedure TPrnOut.DoubleDBGPrint(MainDBG,PartDBG:TDBGrid;

 Header,Footer:string);

begin

 screen.Cursor :=crHourglass;

 iPage :=1;

 {明细表打印}

 try

   with Printer do

   begin

     PixelsInInchX :=GetDeviceCaps(Handle,LOGPIXELSX);

     TenthsOfInchPixelsY :=GetDeviceCaps(Printer.Handle,LOGPIXELSY) div 10;

     iPageHeight :=PageHeight;

     iPageWidth :=PageWidth;    //减去左右边距

     Canvas.Font.Size :=11;

     BeginDoc;

   end;

   {打印页头}

   PrintHeader(Header);

   {打印标题栏:粗体,下划线}

   PrintColumns(MainDBG);

   {循环打印记录}

   PrintPart(MainDBG,PartDBG);

   {打印页脚:页码}

   PrintFoot(Footer);

   {新页起始:重复上面工作}

 finally

   printer.EndDoc;

   screen.Cursor :=crDefault;

 end;

end;

{TStrGridPrn}

procedure TStrGridPrn.PrintHeader(s:string);

begin

 {页头打印}

 if s='' then s :='<无标题>';

 With Printer do

 begin

   with Canvas.Font do

   begin

     Size :=12;

     Name:='宋体';

   end;

   if (not Aborted) then

     Canvas.TextOut((PageWidth div 2)-(Canvas.TextWidth(s) div 2),0,s);

   iAmount :=iAmount+Canvas.TextHeight(s)*2;

 end;

end;

procedure TStrGridPrn.PrintFoot(s:string);

var

 str:string;

begin

 {页脚打印}

 if s='' then str:=s+'第'+IntToStr(iPage)+'页'

 else str:= s +'  '+'第'+IntToStr(iPage)+'页';

 With Printer do

   if (not Aborted) then

     Canvas.TextOut((PageWidth div 2)-(Canvas.TextWidth(str) div 2),

     (iPageHeight-iWordHeight),str);

 iAmount :=0;

 iPage :=iPage+1;

end;

procedure TStrGridPrn.PrintLine(x1,y1,x2,y2:integer);

begin

 with Printer.Canvas do

 begin

   MoveTo(x1,y1);

   LineTo(x2,y2);

 end;

end;

procedure TStrGridPrn.PrintRow(Items:TStringList;StrGrid:TStringGrid);

var

 OutRect:TRect;

 i:integer;

 Inches:Double;

begin

 OutRect.Left :=50;

 OutRect.Top :=iAmount;

 With Printer.Canvas do

 begin

   for i := 0 to Items.Count -1 do

   begin

     Inches :=LongInt(Items.Objects[i])*0.1;

     OutRect.Right :=OutRect.Left + Round(PixelsInInchx * Inches);

     if OutRect.Right>iPageWidth then

     begin

       {换行打印}

       OutRect.Left :=70;

       OutRect.Right :=70+OutRect.Left + Round(PixelsInInchx * Inches);

       iAmount := iAmount + iWordHeight;

       OutRect.Top := iAmount;

     end;

     {换页}

     if (iAmount+iWordHeight)>(iPageHeight-iWordHeight) then

     begin

       PrintFoot('');   //打印页脚

       iAmount :=0;

       if not Printer.Aborted then

         Printer.NewPage;

       PrintHeader('');

       PrintColumns(StrGrid);  //打印列头

       OutRect.Left :=70;

       OutRect.Right :=70+OutRect.Left + Round(PixelsInInchx * Inches);

       iAmount := iAmount + iWordHeight;

       OutRect.Top := iAmount;

     end;

     if not printer.Aborted then

       TextRect(OutRect,OutRect.Left,OutRect.Top,Items[i]);

     OutRect.Left :=OutRect.Right;

   end;

 end;

 iAmount :=iAmount + iWordHeight+2;

end;

procedure TStrGridPrn.PrintColumns(StrGrid:TStringGrid);

var

 lst:TStringList;

 i:integer;

begin

 {打印列标题}

 lst :=TStringList.Create;

 try

   {获取打印机字的大小}

   with printer.Canvas do

   begin

     Font.Style :=[fsBold,fsUnderline];

     iWordWidth :=TextWidth('x');

     iWordHeight :=TextHeight('x');

   end;

   for i:=0 to StrGrid.ColCount-1 do

     lst.AddObject(StrGrid.Cells[i,0],

     Pointer((StrGrid.ColWidths[i] div 10)+2));

   PrintRow(lst,StrGrid);

   Printer.Canvas.Font.Style :=[];

 Except

   lst.Free;

   printer.EndDoc;

 end;

end;

procedure TStrGridPrn.PrintRecords(StrGrid:TStringGrid);

var

 lst:TStringList;

 i,iRow:integer;

begin

 {打印记录}

 lst :=TStringList.Create;

 try

   for iRow :=1 to StrGrid.RowCount-1 do

   begin

     Application.ProcessMessages;

     for i:=0 to StrGrid.ColCount-1 do

       lst.AddObject(StrGrid.Cells[i,iRow],

       Pointer((StrGrid.ColWidths[i] div 10)+2));

     PrintRow(lst,StrGrid);  //行打印

     lst.Clear;

   end;

 finally

   lst.Free;

 end;

end;

procedure TStrGridPrn.StrGridPrint(StrGrid:TStringGrid;

 Header,Footer:string);

begin

 screen.Cursor :=crHourglass;

 strHead :=Header;

 strFoot :=Footer;

 iPage :=1;

 {单表打印}

 try

   with Printer do

   begin

     PixelsInInchX :=GetDeviceCaps(Handle,LOGPIXELSX);

     TenthsOfInchPixelsY :=GetDeviceCaps(Printer.Handle,LOGPIXELSY) div 10;

     iPageHeight :=PageHeight;

     iPageWidth :=PageWidth;    //减去左右边距

     Canvas.Font.Size :=11;

     BeginDoc;

   end;

   {打印页头}

   PrintHeader(Header);

   {打印标题栏:粗体,下划线}

   PrintColumns(StrGrid);

   {循环打印记录}

   PrintRecords(StrGrid);

   {打印页脚:页码}

   PrintFoot(Footer);

 finally

   printer.EndDoc;

   screen.Cursor :=crDefault;

 end;

end;

{TRMB}

function TRMB.BigRBM(sn:Double):String;

var

 dx:array[1..14] of string;

 dd:array[0..9] of string;

 s,ss:string;

 L,i,n:integer;

 zero,plus:boolean;

begin

 {单位}

 dx[1]:='分';

 dx[2]:='角';

 dx[3]:='元';

 dx[4]:='拾';

 dx[5]:='佰';

 dx[6]:='仟';

 dx[7]:='万';

 dx[8]:='拾';

 dx[9]:='佰';

 dx[10]:='仟';

 dx[11]:='亿';

 dx[12]:='拾';

 dx[13]:='佰';

 dx[14]:='仟';

 {数值}

 dd[0]:='零';

 dd[1]:='壹';

 dd[2]:='贰';

 dd[3]:='叁';

 dd[4]:='肆';

 dd[5]:='伍';

 dd[6]:='陆';

 dd[7]:='柒';

 dd[8]:='捌';

 dd[9]:='玖';

 zero :=False;

 sn :=sn*100;  //把小数前两位转换成整数

 if sn<0 then   //取得符号标志值plus

 begin

   plus:=False;   //负数

   sn:=sn*(-1);  //变成正数

 end

 else if sn>0 then plus:=True

 else   //等于0

 begin

   Result :='零元整';

   exit;

 end;

 ss:=FloatToStr(int(sn)); //截取整数部份,再转换为字符串

 L:=length(ss);  //取得长度

 for i:=1 to L do

 begin

   n:=StrToInt(copy(ss,L-i+1,1));  //取得单个数字

   if n=0 then

   begin

     if (i=3) or (i=11) then s:=dx[i]+s  //元、亿前不写0

     else if (i=7) then

     begin

       if (StrToInt(Copy(ss,L-9,4))<>0) then

       begin

         if zero then s:=dx[i]+s //当千万至万不为0时,只写"万"

         else if (not zero) then s:=dx[i]+dd[n]+s;

       end

       else

       begin

         if not zero then s:=dd[n]+s;

       end;

     end

     else if (not zero) and (i>1) then s:=dd[n]+s;  //当后耐不是0并为整数位时,写0

     Zero :=True;

   end

   else

   begin

     s:=dd[n]+dx[i]+s;  //正常

     Zero:=False;

   end;

 end;

 if plus then Result :=s+'整'

 else Result :='负'+s+'整';

end;

{ TDBExcel }

procedure TDBExcel.DBToExcel(DBGrid: TDBGrid);

var

 eclApp,WorkBook:Variant;  {声明为OLE Automation对象}

 xlsFileName:string;

 i,j:integer;

 sDlg :TSaveDialog;

begin

 screen.Cursor :=crHourglass;

 xlsFileName:='NoName.xls';

 try

   {创建OLE对象:Excel Application与WordBook}

   eclApp:=CreateOleObject('Excel.Application');

   WorkBook:=CreateOleObject('Excel.Sheet');

 Except

   screen.Cursor :=crDefault;

   Application.MessageBox('你的机器没有安装Microsoft Excel',

   '数据导出',MB_OK+MB_ICONWarning);

   Exit;

 End;

 {读出记录,并写入EXCEL}

 with DBGrid.DataSource.DataSet do

 begin

   if Active=False then

   begin

     Application.MessageBox('数据库没有打开!',

     '数据导出',MB_OK+MB_ICONWarning);

     Workbook.Close;

     EclApp.Quit;   //退出Excel Application

     {释放Variant变量}

     eclApp:=Unassigned;

     Exit;

   end;

   try

     WorkBook:=eclApp.workbooks.Add;

   Except

     screen.Cursor :=crDefault;

     Application.MessageBox('Excel工作表添加操作失败!',

     '数据导出',MB_OK+MB_ICONError);

     Workbook.Close;

     EclApp.Quit;   //退出Excel Application

     {释放Variant变量}

     eclApp:=Unassigned;

     Exit;

   end;

   {写标题}

   screen.Cursor :=crHourGlass;

   for i:=0 to DBGrid.Columns.Count-1 do

   begin

     try

       EclApp.Cells(1,i+1):=DBGrid.Columns[i].Title.Caption;

     except

       screen.Cursor :=crDefault;

       Application.MessageBox('数据写入Excel失败!',

       '数据导出',MB_OK+MB_ICONError);

       Workbook.Close;

       EclApp.Quit;   //退出Excel Application

       {释放Variant变量}

       eclApp:=Unassigned;

       screen.Cursor :=crDefault;

       Exit;

     end;

   end; //for i

   First;

   j:=2;

   {数据写入}

   While (not Eof) do

   begin

     for i:=0 to DBGrid.Columns.Count-1 do

     begin

       try

         EclApp.Cells(j,i+1):=DBGrid.Fields[i].DisplayText;

       except

         screen.Cursor :=crDefault;

         Application.MessageBox('数据写入Excel失败!',

         '数据导出',MB_OK+MB_ICONError);

         Workbook.Close;

         EclApp.Quit;   //退出Excel Application

         {释放Variant变量}

         eclApp:=Unassigned;

         screen.Cursor :=crDefault;

         Exit;

       end;

     end;  //for i

     next;

     j:=j+1;

   end;   //while

 end; //with DBGrid.

 screen.Cursor :=crDefault;

 sDlg :=TSaveDialog.Create(nil);

 sDlg.DefaultExt :='xls';

 sDlg.Filter :='Excel文件(*.xls)';

 sDlg.Title :='保存Excel文件';

 if sDlg.Execute then

 begin

   xlsFileName :=sDlg.FileName;

   WorkBook.SaveAS(xlsFileName);

 end;

 WorkBook.Saved:=True;  {已经保存:前面如没保存,则为放弃保存}

 WorkBook.close;

 EclApp.Quit;   //退出Excel Application

 {释放Variant变量}

 eclApp:=Unassigned;

 sDlg.Free;

 screen.Cursor :=crDefault;

end;

end.