娃娃鸭《Delphi 6集成开发环境》笔记VI
打印
1、TPrinter 对象
Delphi 中的TPrinter 类可以方便地实现通常的打印任务。通过Printer 全局函数可以返回
TPrinter 类的一个对象,该对象在Printers 单元中定义。可以把Printer 全局函数看作一个全局
变量,并利用这个全局变量来与打印机进行打印操作。
利用Printer 来实现打印的一般过程如下:
(1) 调用BeginDoc 过程向打印机发送一个打印作业(此时还没有在打印机上开始打
印)。
(2)通过一个Text 变量或调用Canvas 对象方法建立打印输出。
(3)调用EndDoc 过程结束当前的打印作业,该打印作业开始在打印机上打印。
(4)如果出现问题,调用Abort 过程取消当前打印的作业。
通常,在打印前要进行打印预览。在打印预览的时候,往往要将打印的结果在屏幕上显示出来。这时,就要注意屏幕的分辨率和打印机的分辨率的差别了。读取屏幕信息可以通过全局变量Screen 来实现,Screen 为TScreen 类的一个实例,在创建工程的时候就自动创建了,并在程序开始运行时读取了屏幕的一些设置信息。
值得注意的一点是TPrinter.Canvas。TPrinter.Canvas 对于窗体来说像一个画布,在它上面可以显示文本和图形。不同的是, TPrinter.Canvas 表示的是打印输出的画布,而非显示用的画布。大多数用来显示文本、图像和画图的程序可以用同一种方式来打印输出。
procedure TForm1.Button1Click(Sender: TObject); begin PrinterSetupDialog1.Execute; //选择输出的打印机以及其他打印控制选项 end;
procedure TForm1.Button2Click(Sender: TObject); var lines: integer; prntext: system.text; //将prntext声明为一个在system程序单元中定义的文本文件 begin if PrintDialog1.Execute then assignprn(prntext); //将prnsetup分配给打印机 rewrite(prntext); //调用rewrite函数,为输出打开已分配的文件 printer.Canvas.font := memo1.font; //把当前Memo1的字体指定给打印对象的Canvas的字体属性 for lines := 0 to memo1.lines.count - 1 do writeln(prntext, memo1.lines[lines]); //把Memo的内容写到打印机对象 System.close(prntext); end;
procedure TForm1.FormCreate(Sender: TObject); begin memo1.lines.loadfromfile('C:/doc/1.txt'); //在Form建立时读入文件C:/dos/os2.tx end; |
2、打印位图
打印位图也很简单。下面列出了相应代码。
procedure TBMPForm.mmiPrintClick(Sender:TObject)
begin
inherited;
with ImgMain.Picture.BitMap do
begin
Printer.BeginDoc;
Printer.Cavas.StretchDraw(Cavas.ClipRect,ImgMain.Picture.Bitmap);
Printer.EndCode;
end;
end;
3、打印TMemo 组件中的内容
事实上,用AssignPrn()来打印文本行相当简单。AssignPrn()可以为当前打印机分配一个文本文件变量,它与Rewrite()和CloseFile()等过程一起使用。下面几行代码说明了用法:
var
f:TextFile;
begin
AssignPrn(f);
try
Rewrite(f);
Writeln(f, 'Print the output');
finally
CloseFile(f);
end;
end;
向打印输出一行文字与向文件中输出一行文字一样,可以使用下面的语句:
Writeln(f,'This is my line of text');
4、打印RTF 格式的文本
RTF 格式文本的打印同样简单,只要调用一个方法就行了。相应代码如下所示:
procedure TMdiRtfForm.mmiPrintClick(Sender:TObject);
begin
inherited;
reMain.Print(Caption);
end;
5、获取显示当前打印机的分辨率
Windows 下的打印分辨率对打印程序有至关重要的作用,利用函数GetDeviceCaps()可以得到打印分辨率。
var
iHorizontal,iVertical:integer;
begin
iHorizontal:=GetDeviceCaps(printer.handle,LOGPIXELSX);
iVertical:= GetDeviceCaps(printer.handle,LOGPIXELSY);
ShowMessage('水平分辨率:'+inttostr(iHorizontal)+chr(12)+ '垂直分辨率:'+Inttostr(iVertical));
end;
6、尽量不要使用AssignPrn
尽管AssignPrn 简化了文本打印操作,是输出到打印机像输出到文件一样简单。但简单带来的是一系列不方便:用户无法知道当前打印的行数,无法准确控制行距,也无法灵活改变字体字型,所以最好使用Canvas 属性。
7、用打印机的点数做度量单位
var PointX:integer; PointY:integer; Begin PointX := GetDeviceCaps(printer.Handle,LOGPIXELSX); PointY := GetDeviceCaps(printer.Handle,LOGPIXELSY); Printer.Canvas.rectangle(0,0,PointX*1,PointY*2); End; |
8、获取默认打印机的信息
在Windows 的Win.ini 文件中有下面的一些配置信息:
[Window]
load=
run=
NullPort=None;
Device=HP LaserJet III,HPPCL5MS,LPT1:
…
其中windows 节的Device 键中默认打印机的信息,可以通过Windows API 函数
GetProfileString 获取该信息。函数GetProfileString 的原型如下:
DWORD GetProfileString(
LPCTSTR lpAppName, //指定节名的字符串
LPCTSTR lpKeyName, //指定键名的字符串
LPCTSTR lpDefault, //没有找到键名返回的字符串
LPCTSTR lpReturnString, //找到键名返回的字符串
DWORD nSize //lpReturnedString的字节数
);
文件管理
我们处理的文件通常分为三种:文本文件、类型文件和无类型文件。
文本文件指可被任意文本编辑器读取的ASCII文本。
类型文件指包含由程序员定义的数据类型的文件。
无类型文件包含了其他所有的类型,它是对包含任意格式或无格式数据的文件的统称。
1、文本文件(text file)
操作步骤如下:
1. 声明变量: var MyTextFile:Textfile; 2. 首先要打开此文本文件。 打开一个文件需要两步:首先是AssignFile() ,它可以将文件变量与一个文件关联起来。 例如: AssignFile(MyTextFile,’MyTextFile.txt’); 这时,可以进行第二步:打开文件。有三种方式可以打开文件:使用Rewrite 过程创建并打开文件;对于一个已存在的文件,此操作将使文件被覆盖;使用Reset 过程只读地打开一个文件;使用Append 过程可以向已存在的文件追加文本。注意Reset 将以可读写方式打开类型文件和无类型文件。 3. 使用CloseFile来关闭一个已打开的文件。 |
代码实例:分别以几种方式 var MyTextFile: Textfile; begin assignfile(MyTextfile, 'MyTextFile.txt'); reset(MyTextFile); // rewrite(MyTextFile);//append(MyTextFile); try {操作文件} finally CloseFile(MyTextFile); end; end; |
2、类型文件(typed file)
如果使用file 声明文件对象时使用了一定的类型,例如Byte、Integer 和用户自定义的类型等,则称定义的文件为类型文件。
TPerson = packed record FirstName:String[20]; LastName:String[20]; Age:Integer; SocialCode:Integer; end;
PersonFile:file of TPerson;
来读取单独一条TPersonRec 类型的记录 var PersonFile: file of TPerson; Person: TPerson; begin assignfile(PersonFile, 'PersonFile.dat'); reset(PersonFile); try if not Eof(PersonFile) then read(PersonFile, Person); finally CloseFile(PersonFile); end; end;
程序用来向文件中追加一条记录: var PersonFile: file of TPerson; Person: TPerson; begin assignfile(PersonFile, 'PersonFile.dat'); reset(PersonFile); seek(PersonFile, FileSize(PersonFile)); //为使文件指针的位置位于末尾,在写记 //录前调用了Seek 过程 try write(PersonFile, Person); finally CloseFile(PersonFile); end; end; |
3、无类型文件
个无类型文件的声明:
var
UnTypedFile:File;
对无类型文件数据的读写操作就可以利用数据块实现。可以利用BlockRead 从无类型文件读出数据,也可以利用BlockWrite 向无类型文件写入数据。这两个过程的声明如下:
procedure BlockRead(var F:File;var Buf;Count:Integer[;var Result:Integer]);
procedure BlockWrite(var F:File;var Buf;Count:Integer[;var Result:Integer]);
BlockRead 和BlockWrite 都至少有三个参数。第一个是无类型文件变量f;第二个是包含写入或读出的数据的缓冲区变量Buf;Count 则用来指定本次操作读写记录的数量。Result 是一个可选参数,当进行读操作时,它返回实际读取的记录数目;当进行写操作时,它返回实际写入的记录数目。如果Result 和Count 数值不一致则可能是磁盘空间不足。
何从一个文件中读取128 字节的一个记录: var UnTypedFile: file; Buf: array[0..128] of byte; Num: Integer; begin assignfile(UnTypedFile, 'UnTypedFile.dat'); reset(UnTypedFile); try BlockRead(UnTypedFile, Buf, 1, Num); finally CloseFile(UnTypedFile); end; end;
向文件中写一个128字节的记录: var UnTypedFile: file; Buf: array[0..128] of byte; Num: Integer; begin assignfile(UnTypedFile, 'UnTypedFile.dat'); reset(UnTypedFile); if FileExists('UnTypedFile.dat') then Reset(UnTypedFile) else Rewrite(UnTypedFile); try Seek(UnTypedFile, FileSize(UnTypedFile)); FillChar(Buf, SizeOf(buf), 'Y'); BlockWrite(UnTypedFile, Buf, 1, Num); finally CloseFile(UnTypedFile); end; end; |
4、文件对话框组件
1.TOpenDialog 组件 2.SaveDialog 3.OpenPictureDialog OpenPictureDialog 组件具体用法基本与OpenDialog 组件相同,只是对话框在显示的时候还多了一个可以预览图形的矩形区域。如果选中的图形文件可以被TPicture 类识别,则图形会在预览区域中显示。一般TPictrue 类可以识别.BMP、.ICO、.WMF 和.EMF 等类型的图形文件。 4.SavePictureDialog |
5、文件管理常用函数和过程
1.Append 过程 Append 过程为在一个已经存在的文件的最后添加文本做准备工作。 过程原型如下: procedure Append(var F: Text); 2.AssignFile 过程 AssignFile 过程将一个外部文件的文件名与一个file 类型的变量关联,对file 类型的变量进行初始化。 过程原型如下: procedure AssignFile(var F; FileName: string); 3.AssignPrn 过程 AssignPrn 将一个text file 变量与打印机关联,写向text file 变量的内容将直接送往打印机。过程原型如下: procedure AssignPrn(var F: Text); 4.CloseFile 过程 CloseFile 过程用来关闭文件,同时将文件记录盘上的文件与相关文件变量断开联系。过程原型如下: procedure CloseFile(var F); 注意: 通常将CloseFile 语句放在finally 语句块中执行,如6.1 节的例子中那样。这样,一旦文件操作代码出现异常也可以关闭文件。 5.DeleteFile 函数 Delete 函数将一个文件从记录盘上删除,如果文件不存在或无法删除,则返回False。函数原型如下: function DeleteFile(const FileName: string): Boolean; 6.Eof 函数 Eof函数判断是否到了文件的结尾。如果文件为空或当前位置在最后一个字符之后,则返回True;否则,返回False。 函数原型如下: function Eof [ (var F: Text) ]: Boolean; // 用于文本文件 function Eof(var F): Boolean; // 用于类型文件和无类型文件 7.Eoln 函数 Eoln 函数测试文件指针是否指向一行的最后,适用于文本文件。如果当前的位置在一行的末尾或Eof(F)函数返回的是True,则Eoln 返回的是True;否则,返回False。函数原型如下: function Eoln [(var F: Text) ]: Boolean; 8.Erase 过程 Erase 过程删除一个已经存在的文件。如果文件被打开,先关闭该文件再执行删除操作。 过程原型如下: procedure Erase(var F); 9.EileExists 函数 测试指定文件名的文件是否存在。如果文件存在,返回True;否则,返回False。函数原型如下: function FileExists(const FileName: string): Boolean; 10.FileGetAttr 函数 获取一个文件的属性设置。函数原型如下: function FileGetAttr(const FileName: string): Integer; 11.Write 过程 Write 过程用来向一个文件中添加内容。过程原型如下: procedure Write( [var F: Text; ] P1 [ , P2,..., Pn] ); // 文本文件 procedure Write(F, V1,...,Vn); // 有类型文件 12.Writeln 过程 Writeln 过程用来向文本文件中添加一行内容,即在写入内容后面有回车换行符。过程原型如下: procedure Writeln([ var F: Text; ] P1 [, P2, ...,Pn ] );
实例:拷贝: var SourceF, EndF: file; NRead, NWrite: integer; Buff: array[1..1024] of char; begin AssignFile(SourceF, Edit1.Text); Reset(SourceF, 1); AssignFile(EndF, Edit2.Text); Rewrite(EndF, 1); //显示文件大小信息 Edit3.Text := IntToStr(FileSize(SourceF)) + 'B'; repeat //从源文件向缓冲区读 BlockRead(SourceF, Buff, SizeOf(Buff), NRead); //从缓冲区向目标文件读 BlockWrite(EndF, Buff, SizeOf(Buff), NWrite); until (NRead = 0) or (NWrite <> NRead); CloseFile(SourceF); CloseFile(EndF); end; |
6、目录操作常用函数和过程
1.ChDir 过程 改变当前的目录。如果指定路径中包含有驱动器号(盘符),则相应地改变当前的驱动器。 过程原型如下: procedure ChDir(S: string); 2.CreateDir 函数 新建一个目录。如果创建成功,则返回True;否则,返回False。函数原型如下: function CreateDir(const Dir: string): Boolean; 3.DirectoryExists 函数 检测指定的目录是否存在。如果存在,函数则返回True;否则,返回False。函数原型如下: function DirectoryExists(Name: string): Boolean; 如果在参数Name中指定的不是绝对路径,则使用相对路径,默认在当前目录中进行查询。 4.ForceDirectories 函数 创建指定的目录。通常在创建一个目录的时候,其父级目录必须存在。但是使用 ForceDirectories创建目录的时候就没有这个限制,可以将所需的所有目录一次创建。如果创建成功,则函数返回True;如果有任何一个目录创建失败,则返回False。 函数原型如下: function ForceDirectories(Dir: string): Boolean; 5.GetCurrentDir 函数 获取当前的目录的绝对路径。函数原型如下: function GetCurrentDir: string; 6.GetDir 过程 获取指定驱动器中的当前目录。 过程原型如下: procedure GetDir(D: Byte; var S: string); 参数D 为指定的驱动器。当D 的数值为0 时,表示默认的驱动器;数值为1,表示A驱动器;数值为3,表示C 驱动器…… 如果指定的驱动器不存在,则参数S 的数值设置为当前的目录. 7.MkDir 过程 新建一个目录。过程原型如下: procedure MkDir(S: string); 8.RemoveDir 函数 删除一个存在的目录,目录必须为空。函数原型如下: function RemoveDir(const Dir: string): Boolean; 如果删除目录成功,则返回True;否则,返回False。 9.RmDir 过程 删除一个存在的目录,目录必须为空。过程原型如下: procedure RmDir(S: string); 10.SelectDirectory 函数 通过显示一个对话框来让用户选择一个目录。 注意:在使用前要在uses语句中添加包含FileCtrl的说明。 函数原型如下: function SelectDirectory(const Caption: string; const Root: WideString; out Directory: string): Boolean; overload; function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx: Longint): Boolean; overload; 11.SetCurrentDir 函数 设置系统的当前目录。函数原型如下: function SetCurrentDir(const Dir: string): Boolean; |
7、驱动器操作常用函数
1.DiskFree 函数 获取指定驱动器中剩余空间的字节数。 函数原型如下: function DiskFree(Drive: Byte): Int64; 2.DiskSize 函数 获取指定驱动器容量,单位为字节数。函数原型如下: function DiskSize(Drive: Byte): Int64; |
8、文件名操作常用函数
1.ExpandFileName 函数 将当前驱动器名(盘符)、路径名和指定的文件名合成一个绝对文件名。函数原型如下: function ExpandFileName(const FileName: string): string; 返回值为合成的绝对文件名。 2.ExpandUNCFileName 函数 获取一个以UNC 格式的包括网络驱动器名的绝对文件名。函数原型如下: function ExpandUNCFileName(const FileName: string): string; 3.ExtractFileDir 函数 从绝对文件名中获取目录名。函数原型如下: function ExtractFileDir(const FileName: string): string; 4.ExtractFileDrive 函数 从绝对文件名中获取驱动器号(盘号)。函数原型如下: function ExtractFileDrive(const FileName: string): string; 5.ExtractFileExt 函数 从绝对文件名中获取文件名的扩展名。函数原型如下: function ExtractFileExt(const FileName: string): string; 6.ExtractFileName 函数 从绝对文件名中获取文件名。函数原型如下: function ExtractFileName(const FileName: string): string; 7.ExtractFilePath 函数 从绝对文件名中获取路径名。函数原型如下: function ExtractFilePath(const FileName: string): string; 8.ExtractRelativePath 函数 从绝对文件名中获取相对于某一个路径的相对路径名。函数原型如下: function ExtractRelativePath(const BaseName, DestName: string): string; 9.ExtractShortPathName 函数 将长文件名转化成短文件名。函数原型如下: function ExtractShortPathName(const FileName: string): string; |