第 4章 对话框和多窗体设计
内容提要
? 使用 Delphi7内建的信息对话框函数
? Delphi 通用对话框
? 多重窗体设计
4.1 Delphi7内建的对话框函数
在 Delphi 7中,提供了几个直接显示内建信
息对话框的函数。这些函数分别是
ShowMessage,ShowMessagePos,ShowMessa
gFmt,MessageDlg,MessageDlgPos,Message
Dlg,MessageDlgPos,MessageDlgPosHelp,Me
ssageBox,InputBox和 InputQuery等。下面就
分别介绍这些对话框 。
4.1.1 ShowMessage函数
ShowMessage函数的定义如下,
Procedure ShowMessage(Const Msg:String);
该函数是最简单的信息对话框,它只有一个参数。
ShowMessage函数对话框只能显示一个提示信
息和一个 [OK]按钮。
图 4-1 ShowMessage函数弹出的对话框
4.1.2 ShowMessagePos函数
ShowMessagePos函数 ShowMessage函数也类
似,不过多了一个显示格式参数。通过该函数可以
输出一些字符串进行格式化后的值。
ShowMessagePos函数定义如下,
Procedure ShowMessagePos(Const Msg::string;X,Y,Integer);
? 以下程序利用 ShowMessagePos 函数将消息框定
位在 ( 100,100) 的坐标上,
ShowMessagePos( '显示位置在 100,100的坐标上 ',
100,100);
4.1.3 ShowMessageFmt 函数
ShowMessageFmt函数用于字符串的格式化输出。
ShowMessageFmt函数定义如下,
Procedure ShowMessageFmt(Const
Msg:String;Params:Array Of Const);
其中,Msg参数的一般形式为
’普通字符(提示字符)格式控制符’
? ShowMessageFmt 函数使用的类型说明符
参见 P119,表 4-1
4.1.4 MessageDlg 函数
MessageDlg 函数可以提供比较丰富的信息,比如显示的消息对话框类型,
按钮类型等,还能够得到用户的响应信息。 其定义如下,
Function MessageDlg (Const Msg, String ; DlgType, TMsgDlgType ;
Buttons, TMsgDlgButtons ; HelpCtx, LongInt ), Word ;
其中,
? Msg,表示对话框的提示信息 。
? DlgType,通过它可以在信息对话框中设置一定的图标来表达不同的
意义, 比如警告, 询问等 。 其取值如表 4-2 所示 。
? Bottons,是一个集合类型, 它控制在信息对话框中可能出现的按钮名
称 。 其取值如表 4-3所示 。
? HelpCtx,用于定义帮助按钮打开的上下文帮助文件的 ID,按 F1也可
打开帮助文件 。
4.1.5 MessageDlgPos 函数
MessageDlgPos 函数 和 MessageDlg 相似, 但此函数多了一个
可控制弹出信息框的出现位置的功能 。 定义如下,
Function MessageDlg (Const Msg, String ; DlgType,
TMsgDlgType ; Buttons, TMsgDlgButtons ; HelpCtx,
LongInt ; X, Y, Integer), Word ;
?X, Y参数表示信息对话框出现的位置 。
下面给出有关该函数的一个实例,
MessageDlgPos( '此信息对话框在 100,100 的位置上? ',
MtInformation,[mbYes,mbNo,mbCancel],
0,100,100) ;
4.1.6 MeaageDlgPosHelp 函数
MessageDlgPosHelp 函数定义如下,
Function MessageDlgPosHelp( Const Msg,string; DlgType:
TmsgDlgType; Buttons,TmsgDlgButtons; HelpCtx,Longint;
X,Y,Integer; const HelpFileName,string), Word;
其中,
?Msg, DlgType, Buttons 和 HelpCtx 参数在 MessageDlg 函
数中已经介绍 。
?X, Y 表示信息对话框出现的位置 。
?HelpFileName 有特殊的含义, 它将帮助信息对话框与之相
对应的帮助文件建立联系 。
4.1.7 MessageBox 函数
MessageBox 函数是 Window API 函数,但可在 Delphi 7 下直接使用。
MessageBox 函数的定义如下,
Function MessageBox(Const Text,PAnsiChar; Const Caption,PAnsiChar;
[Flags,LongInt=MB_OK]),Integer;
其中,
?Text 参数是一个长度可以超过 255 的字符串, 它显示在对话框的中部,
能自动环绕 。
?Caption 参数类型与 Text 参数相同, 它只是作为弹出的信息对话框的标
题, 也可以超过 255个字符 。
?Flags 是一个 LongInt 类型的参数,它可以从 0 开始取不同的值,使对话
框的可选项不同。它包含四个参数,各项参数如表 4-4、表 4-5、表 4-6和表
4-7所示。
4.1.8 InputBox 函数
InuptBox 函数显示一个带有编辑组件的窗体,提供让用户输入
文本的功能。该对话框既有按钮又有文本输入,因而使用更加
灵活和广泛。
InputBox函数的定义如下,
Function InputBox(const ACaption,APrompt,ADefault,string),
string;
其中,
?ACaption,信息对话框的标题 。
? APrompt,显示在输入框上方的提示信息。
?Adefault, 缺省值, 自动显示在输入框中 。
该函数的返回类型为 String 类型。 图 4-2 InputBox 函数的信息框
4.1.9 InputQuery 函数
InputQuery 函数和 InputBox 函数很相似, 它也是提
供输入的一个信息对话框 。 但该函数却可以通过判断函
数的返回值, 从而知道用户按下了哪一个按钮 。
InputQuery 函数的定义如下,
function InputQuery(const ACaption,APrompt,
string; var Value,string),Boolean;
其中,
?ACaption,信息对话框的标题 。
?APrompt,显示在输入框上方的提示信息 。
?Value,是一个字符串类型 ( String) 的变量 。
该函数的返回类型为布尔类型( Boolean)。
4.2 Delphi 通用对话框
本节着重介绍打开对话框 ( TOpenDialog Componement), 保
存 对 话框 (TSaveDialog Componement),打 开图 片对 话 框
( TOpenPictureDialog Componement), 保 存图片对 话框
( TSavePictureDialog Componement ), 字体对话框
( TFontDialog Componement), 颜色对话框 ( TColorDialog
Componement), 查找对话框 ( TFindDialog Componement),
替换对话框 ( TReplaceDialog Componement), 打印对话框
( TPrintDialog Componement ) 和打印设置对话框
( TPrinterSetupDialog Componement) 。
4.2.1 TOpenDialog 和 TSaveDialog组件
用户可通过打开对话框选择要打开的文件;通过保存对话框设
定要存储的文件名称 ( 含路径 ) 并将所编辑或输入的数据存入
磁盘 。 使用 Execute 方法来激活打开对话框和保存对话框,
例子如下,
procedure TForm1.Button1Click(Sender,TObject);
begin
if OpenDialog1.Execute then
Begin
ShowMessage('已经打开文件了 ');
End;
end;
4.2.1 TOpenDialog 和 TSaveDialog组件
procedure TForm1.Button2Click(Sender,TObject);
begin
if SaveDialog1.Execute then
Begin
ShowMessage('已经保存了文件 ');
End;
end;
? 对于 TOpenDialog Componement 和 TSaveDialog
Componement 有一些常用的属性, 介绍如下,
( 1) InitiaDir 属性:该属性决定打开相应对话框时的当前
路径。如果没有设置该属 性,或者设置的路径不存在,则打开
对话框时的路径为当前的工作目录。
( 2) Defaultext 属性:该属性表示默认的文件扩展后缀 。 当
用户没有输入文件的后缀时, 可以为用户文件自动添加后缀 。
4.2.1 TOpenDialog 和 TSaveDialog组件
( 3) FileName 属性:是用户选择或者输入的文件名称, 它可
返回最近一次选择的文件的名称和完整目录路径 。
( 4) Filter 属性:该属性提供了文件过滤器 。
( 5) FilterIndex 属性:该属性可预先设置对话框打开时所
使用的过滤器 。
( 6) Title 属性:该属性可以在程序中改变对话框的标题条
中的内容 。 默认情况下, 打开对话框 ( OpenDialog) 的标题为
,打开, ;保存对话框 ( SaveDialog) 的标题为, 另存为, 。
( 7) Options 属性:该属性决定对话框的显示和行为方式 。
它是集合类型, 包含很多对话框的细节设置, 其取值及含义如
表 4-9 所示 。
4.2.2 TOpenPictureDialog组件
和 TSavePictureDialog组件
TOpenPictureDialog,TSavePictureDialog是打开, 保存图片文件
的对话框组件, 这两个对话框的 Filter属性已自动定义好, 对常用的
图片格式都作了定义, 用户也可自己定制 。
应用程序通过 TOpenPictureDialog 和 TSavePictureDialog 组件的
Execute 方法来显示相应的对话框, 如图 4-7 和图 4-8所示 。
有关这两个组件的属性参考 TOpenDialog 和 TSaveDialog 组件一节
中的属性介绍, 基本一致 。
?举例,
TopenPictureDialog 和 TSavePictureDialog 组件的使用方法 。
首先创建一个工程文件, 在默认 Form1 窗体上添加 Image 控件, 并
把其 Align 属 性 的 值 设 为 alTop ; 在 窗 体 上 添 加
TOpenPictureDialog 和 TSavePictureDialog 组件;再添加上三个
Button 按钮, 分别设置它们的 Caption 属性值为, 载入图片,,
,保存图片, 和, 退出程序, 。 其完成后的窗体界面如图 4-9 所示 。
图 4-9 载入或保存图片窗体界面
4.2.3 TFontDialog和 TColorDialog
可以使用 Execute 方 法 来 显 示 字 体 对 话 框 组 件
( TFontDialog Componement), 当用户选择了字体, 大小,
样式等属性, 单击, 确定, 按钮后就会将这些字体设定保存
到 Font属性中 。
TcolorDialog 组件最重要的属性是 Color 属性 。 当用户选择了一种颜
色并单击, 确定, 按钮时, 选中的颜色将被保存在组件的 Color 属性
中 。
?两个对话框应用举例,
首先新建一个工程, 在窗体上添加一个标签, 并设置它的
Caption 属性为, 改变我的字体和颜色, ;添加一个
Shape 组件;同时添加 FontDialog 和 ColorDialog 组件;
最后添加三个 Button 按钮, 并设置它们的 Caption 属性
分别为, 字体,,, 颜色, 和, 关闭, 。 界面如图 4-
14 所示 。
图 4-14 字体和颜色对话框使用例子界面
procedure TForm1.Button1Click(Sender,TObject);
begin
if FontDialog1.Execute then
label1.Font,=FontDialog1.Font ;
end;
procedure TForm1.Button2Click(Sender,TObject);
begin
if ColorDialog1.Execute then
Shape1.Brush.Color,=ColorDialog1.Color ;
end;
procedure TForm1.FormCreate(Sender,TObject);
begin
Shape1.Shape,= stEllipse;
end;
程序代码
4.2.4 TFindDialog Componement和
TReplaceDialog Componement
FindDialog 组 件 为 应 用 程 序 提 供 查 找 对 话 框 ;
ReplaceDialog 对话框组件是从 FindDialog 派生的, 是
FindDialog 组件的扩展版本 。 它既能够让用户查找, 也
能让用户替换字符串 。
两个对话框组件也是用 Execute 方法打开 。
4.2.5 TPrintDialog 和 TPrinterSetupDialog
TPrintDialog 组件通过调用 Execute 方法显示一个标
准的 Windows 打印对话框,如图 4-18 所示。在对话框
中,用户可以选择打印机、打印页数和打印份数等。
有关 TPrintDialog 组件的属性介绍如下,
( 1) Copies 属性:该属性决定打印的份数 。
( 2) MaxPage 属性:该属性限制打印的最大页数 。
( 3) MinPage 属性:该属性限制打印的最小页数 。
( 4) PrintRange 属性:该属性决定选择打印范围的方式 。
( 5) FromPage 属性:当 PrintRange 属性取 prPageNums 值时, 该属
性确定打印的起始页码 。
( 6) ToPage 属性:当 PrintRange 属性取 prPageNums 值时, 该属性
确定打印的终止页码 。
( 7) Collate 属性:决定在打印多份文件时, 是否进行相互校对 。
( 8) PrintToFile 属性:该属性决定是否将内容打印到一个文件中 。
( 9) Options 属性:该属性决定打印对话框的显示形式 。 该属性是集
合类型, 其取值及相应含义如表 4-13 所示 。
在 Delphi中, 文件打印有两种方式:一种方式是将文件变量分配给打印机, 用此
变量名创建或打开文件后, 往此文件变量写入的任何文本都视为向打印机输出;
另一种方式是利用 Printers单元中定义的 TPrinter对象进行文件打印 。
TPrinter对象可调用 Windows的打印机, 在 Printer 单元中定义了 TPrinter 的实
例 Printer,用户可直接使用 。 调用 TPrinter的 BeginDoc方法可开始一项打印工
作, 调用 EndDoc 方法可结束一项已成功发送给打印机的工作 。 如果在发送过程
中出现问题或用户想中途终止打印工作, 可调用 Abort方法 。
有关 TPrinter 对象的属性介绍如下,
( 1) Aborted 属性:如果用户中断打印工作, 则该属性返回真 ( True) 值 。
( 2) Canvas属性:代表打印表面, 通过 Canvas 属性的 Brush,Font,Pen属性可
决定打印字体或图像的特征 。
( 3) Printers属性:该属性中包含着已安装的打印机列表 。
( 4) PrinterIndex 属性:该属性是当前选择的打印机在打印机列表中的序号 。
( 5) Fonts属性:该属性中有当前打印机支持的字体 。
( 6) Orientertion属性:该属性可决定打印方向 。
( 7) PageHeight 属性:表示打印机一页的高度 。
( 8) PageWith属性:表示打印机一页的宽度 。
( 9) PageNumber属性:为当前页的值 。
( 10) Title属性:可决定在 Windows打印管理器或网络中出现的文本 。
4.3 多重窗体设计
在前面我们学习了 Delphi 提供的对话框, 包括系统
内建的消息框和通用的对话框组件 。 对话框是一种特
殊的窗口, 在设计时, 对话框一般用二级窗体, 主要
使用的是模态窗口 。 对话框和其他窗口相比特点是:
一般没有系统菜单, 没有最大化和最小化按钮, 不能
改变大小等 。 如果想将一个窗体做为一个自定义的对
话框, 将其 BorderStyle属性设定为 bsDialog即可 。
由此可看出对话框的设计实际上也是多窗体的设计。
但在实际中,除了使用对话框之外,多数应用程序都
需要有多个窗体,所以掌握多窗体程序设计的方法是
非常重要的。
4.3.1 多重窗体的管理
要设计管理多个窗体的 Windows 应用程序,必须在设计程序时创建
多个窗体。所以多重窗体的管理主要是向工程中添加、删除和保存窗
体。
1.添加窗体
向当前工程中添加一个标准的新窗体大致有以下几种方法,
? 从 【 File】 菜单中选取 【 New】 |【 Form】 命令选项 。 新窗体的默认名
称 (Name) 和标题 ( Caption) 均由 Delphi 集成开发环境自动确定,
如按顺序第二个创建的窗体其默认名称为 Form2,标题为 Form2。
? 在 Standard 工具栏上单击 【 New Items】 命令按钮, 从弹出的 New
Items 对话框中选择 New 标签页, 再从中选择 Form 选项, 单击 OK
按钮 。
? 在 View 工具栏上直接单击 【 New Form】 命令按钮, 也可创建一个
新窗体 。
? Delphi 可以通过对已经存在的窗体进行复制, 继承或引用等方法来
创建新窗体 。 窗体的继承见图 4-22 所示 。
2,删除窗体
删除工程中多余的窗体实质是删除该窗体所对应的单元,不能只删除窗体而
不删除其对应的窗体单元。其操作大致有以下几种方法,
?从 【 Project】 菜单中单击 【 Remove From Project… 】 命令选项, 可弹出
Remove From Project 对话框 ( 见图 4-23所示 ), 从中选出要从工程中删除的
窗体所对应的单元, 然后单击 OK 就可删除相应的窗体 。
?在 Standard 工具栏上单击 【 Remove File From Project】 命令按钮, 也会弹
出 Remove From Project 对话框, 从中选出要从工程中删除的窗体所对应的
单元, 然后单击 OK 就可删除相应的窗体 。
?从 【 View】 菜单中单击 【 Project Manager】 命令选项, 可调出项目管理器
窗口, 从窗口中选择要删除窗体所在的单元, 再点击 Remove 按钮即可 。
3,保存窗体
选择任意一个需要保存的窗体或其相对应的单元文件, 然后单击 【 File】 |【
Save】 菜单 项或直接单击工具栏上的 【 Save】 按钮, 来保存单个文件;也可
以通过单击 【 File】 |【 Save All】 菜单项或直接单击工具栏上的 【 Save
All】 按钮来一起保存所有文件 。 也可以通过单击 【 File】 |【 Save As】 菜
单项把某一个或多个文件保存到另外的位置 。
4.3.2 设置多重窗体的主窗体
对于包含有多个窗体的 Delphi 应用程序, 必须设定一个主窗体作
为启动窗体 。 Delphi 在创建一个新工程时, 把窗体 Form1 作为系
统默认的主窗体 。 如果程序员在实际开发过程中或在调试程序过
程中希望把某个窗体作为主窗体时, 即在程序运行时首先出现在
屏幕上, 可通过下面的方法实现,
在 【 Project】 菜单下单击 【 Options】 菜单项, 可弹出 Project
Options 的对话框, 选中 Forms 选项卡, 如图 4-25 所示, 在 Main
Form 后的下拉列表框中选择要作为启动的窗体名称 。 在其下拉列
表中显示了该工程所有的窗体, 可根据需要自由选择 。
4.3.3 多重窗体间的处理
具有多重窗体的应用程序经常是按照预先设定的顺序,显
示或隐藏窗体。
1.窗体的显示
窗体的显示分为模态和非模态两种显示方式 。 在模态方式
下, 屏幕显示的窗体间不可以相互切换, 只有模态方式的显
示窗口获得焦点, 唯有当它关闭时, 其它窗体才可获得焦点;
而非模态显示方式则可在不同窗体间相互切换 。
在 Delphi 中, 使用 TForm 类的 Show 方法来显示的窗体是
非模态方式的, 而使用 TForm 类的 ShowModal 方法显示的
窗体则是模态方式的 。
2.窗体的隐藏
TForm 类的 Hide 方法用来将窗体暂时隐藏起来, 使窗体处于不可视
状态, 但并不从内存中真正释放窗体 。
我们以窗体对象 Form2 为例, 说明 Hide 方法的使用, 其代码如下,
Form2.Hide ;
用 TForm 类的 Hide 方法隐藏窗体, 其实质相当于把窗体的 Visible 属
性设置为 False, 即不可见 。 其代码如下,
Form2.Visible,= False ;
使隐藏的窗体再显示出来, 我们也可通过上面讲的 Show 或
ShowModal 的方法实现, 也可以通过对窗体的 Visible 属性赋值来完成
。 其代码如下,
Form2.Show ;

Form2.Visible,= True ;
3.窗体的创建
窗体的创建不同于窗体的显示, 窗体的显示只是把已经在内存中存在
的窗体显示出来;而窗体的创建是在内存中生成窗体, 但还未能显示到屏
幕上 。
在 Delphi 的默认情况下, 向工程中添加的窗体均属于自动创建的窗体 (
Auto-create Forms ), 这些窗体会在 Delphi 应用程序运行时在内存中自动
创建 。 为了更好的开发应用程序, 有时需要用程序动态的创建窗体 。
Delphi 下提供了 Create 方法可以创建窗体 。
?例如:创建 Form1窗体 。
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1,Form1);
Application.Run;
end,
4.窗体的释放
一般使用 Close 方法关闭一个窗体, 以窗体对象 Form2 为例, 关闭
它的程序代码则为,
Form2.Close ;
有时根据需要也可使用 Free 方法来释放窗体对象资源, 程序代码如
下,
Form2.Free ;
但需要注意的是用 Close 方法关闭的窗体, 窗体实质还存在于内存
中, 还可以用 Form2.Show 的方法将窗体重新调出并显示;而用 Free
方法释放的窗体则已经使该窗体对象完全退出内存, 不能直接用
Form2.Show 等类似语句将其调出 。