娃娃鸭《Delphi 6集成开发环境》笔记VI

来源:互联网 发布:淘宝卖书需要什么证 编辑:程序博客网 时间:2024/04/30 12:40

娃娃鸭《Delphi 6集成开发环境》笔记VI

打印

1TPrinter 对象

Delphi 中的TPrinter 类可以方便地实现通常的打印任务。通过Printer 全局函数可以返回

TPrinter 类的一个对象,该对象在Printers 单元中定义。可以把Printer 全局函数看作一个全局

变量,并利用这个全局变量来与打印机进行打印操作。

利用Printer 来实现打印的一般过程如下:

1 调用BeginDoc 过程向打印机发送一个打印作业(此时还没有在打印机上开始打

印)。

2)通过一个Text 变量或调用Canvas 对象方法建立打印输出。

3)调用EndDoc 过程结束当前的打印作业,该打印作业开始在打印机上打印。

4)如果出现问题,调用Abort 过程取消当前打印的作业。

 

通常,在打印前要进行打印预览。在打印预览的时候,往往要将打印的结果在屏幕上显示出来。这时,就要注意屏幕的分辨率和打印机的分辨率的差别了。读取屏幕信息可以通过全局变量Screen 来实现,Screen TScreen 的一个实例,在创建工程的时候就自动创建了,并在程序开始运行时读取了屏幕的一些设置信息。

值得注意的一点是TPrinter.CanvasTPrinter.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 声明文件对象时使用了一定的类型,例如ByteInteger 和用户自定义的类型等,则称定义的文件为类型文件。

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;第二个是包含写入或读出的数据的缓冲区变量BufCount 则用来指定本次操作读写记录的数量。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 等类型的图形文件。

4SavePictureDialog

 

5、文件管理常用函数和过程

1Append 过程

Append 过程为在一个已经存在的文件的最后添加文本做准备工作。

过程原型如下:

procedure Append(var F: Text);

2AssignFile 过程

AssignFile 过程将一个外部文件的文件名与一个file 类型的变量关联,对file 类型的变量进行初始化。

过程原型如下:

procedure AssignFile(var F; FileName: string);

3AssignPrn 过程

AssignPrn 将一个text file 变量与打印机关联,写向text file 变量的内容将直接送往打印机。过程原型如下:

procedure AssignPrn(var F: Text);

4CloseFile 过程

CloseFile 过程用来关闭文件,同时将文件记录盘上的文件与相关文件变量断开联系。过程原型如下:

procedure CloseFile(var F);

注意:

通常将CloseFile 语句放在finally 语句块中执行,如6.1 节的例子中那样。这样,一旦文件操作代码出现异常也可以关闭文件。

5DeleteFile 函数

Delete 函数将一个文件从记录盘上删除,如果文件不存在或无法删除,则返回False。函数原型如下:

function DeleteFile(const FileName: string): Boolean;

6Eof 函数

Eof函数判断是否到了文件的结尾。如果文件为空或当前位置在最后一个字符之后,则返回True;否则,返回False

函数原型如下:

function Eof [ (var F: Text) ]: Boolean; // 用于文本文件

function Eof(var F): Boolean; // 用于类型文件和无类型文件

7Eoln 函数

Eoln 函数测试文件指针是否指向一行的最后,适用于文本文件。如果当前的位置在一行的末尾或Eof(F)函数返回的是True,则Eoln 返回的是True;否则,返回False。函数原型如下:

function Eoln [(var F: Text) ]: Boolean;

8Erase 过程

Erase 过程删除一个已经存在的文件。如果文件被打开,先关闭该文件再执行删除操作。

过程原型如下:

procedure Erase(var F);

9EileExists 函数

测试指定文件名的文件是否存在。如果文件存在,返回True;否则,返回False。函数原型如下:

function FileExists(const FileName: string): Boolean;

10FileGetAttr 函数

获取一个文件的属性设置。函数原型如下:

function FileGetAttr(const FileName: string): Integer;

11Write 过程

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、目录操作常用函数和过程

1ChDir 过程

改变当前的目录。如果指定路径中包含有驱动器号(盘符),则相应地改变当前的驱动器。

过程原型如下:

procedure ChDir(S: string);

2CreateDir 函数

新建一个目录。如果创建成功,则返回True;否则,返回False。函数原型如下:

function CreateDir(const Dir: string): Boolean;

3DirectoryExists 函数

检测指定的目录是否存在。如果存在,函数则返回True;否则,返回False。函数原型如下:

function DirectoryExists(Name: string): Boolean;

如果在参数Name中指定的不是绝对路径,则使用相对路径,默认在当前目录中进行查询。

4ForceDirectories 函数

创建指定的目录。通常在创建一个目录的时候,其父级目录必须存在。但是使用

ForceDirectories创建目录的时候就没有这个限制,可以将所需的所有目录一次创建。如果创建成功,则函数返回True;如果有任何一个目录创建失败,则返回False

函数原型如下:

function ForceDirectories(Dir: string): Boolean;

5GetCurrentDir 函数

获取当前的目录的绝对路径。函数原型如下:

function GetCurrentDir: string;

6GetDir 过程

获取指定驱动器中的当前目录。

过程原型如下:

procedure GetDir(D: Byte; var S: string);

参数D 为指定的驱动器。当D 的数值为0 时,表示默认的驱动器;数值为1,表示A驱动器;数值为3,表示C 驱动器……

如果指定的驱动器不存在,则参数S 的数值设置为当前的目录.

7MkDir 过程

新建一个目录。过程原型如下:

procedure MkDir(S: string);

8RemoveDir 函数

删除一个存在的目录,目录必须为空。函数原型如下:

function RemoveDir(const Dir: string): Boolean;

如果删除目录成功,则返回True;否则,返回False

9RmDir 过程

删除一个存在的目录,目录必须为空。过程原型如下:

procedure RmDir(S: string);

10SelectDirectory 函数

通过显示一个对话框来让用户选择一个目录。

注意:在使用前要在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;

11SetCurrentDir 函数

设置系统的当前目录。函数原型如下:

function SetCurrentDir(const Dir: string): Boolean;

 

7、驱动器操作常用函数

1DiskFree 函数

获取指定驱动器中剩余空间的字节数。

函数原型如下:

function DiskFree(Drive: Byte): Int64;

2DiskSize 函数

获取指定驱动器容量,单位为字节数。函数原型如下:

function DiskSize(Drive: Byte): Int64;

 

8、文件名操作常用函数

1ExpandFileName 函数

将当前驱动器名(盘符)、路径名和指定的文件名合成一个绝对文件名。函数原型如下:

function ExpandFileName(const FileName: string): string;

返回值为合成的绝对文件名。

2ExpandUNCFileName 函数

获取一个以UNC 格式的包括网络驱动器名的绝对文件名。函数原型如下:

function ExpandUNCFileName(const FileName: string): string;

3ExtractFileDir 函数

从绝对文件名中获取目录名。函数原型如下:

function ExtractFileDir(const FileName: string): string;

4ExtractFileDrive 函数

从绝对文件名中获取驱动器号(盘号)。函数原型如下:

function ExtractFileDrive(const FileName: string): string;

5ExtractFileExt 函数

从绝对文件名中获取文件名的扩展名。函数原型如下:

function ExtractFileExt(const FileName: string): string;

6ExtractFileName 函数

从绝对文件名中获取文件名。函数原型如下:

function ExtractFileName(const FileName: string): string;

7ExtractFilePath 函数

从绝对文件名中获取路径名。函数原型如下:

function ExtractFilePath(const FileName: string): string;

8ExtractRelativePath 函数

从绝对文件名中获取相对于某一个路径的相对路径名。函数原型如下:

function ExtractRelativePath(const BaseName, DestName: string): string;

9ExtractShortPathName 函数

将长文件名转化成短文件名。函数原型如下:

function ExtractShortPathName(const FileName: string): string;

原创粉丝点击