. q( f) w% S g" ]6 R7 \+ c, k TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一
r# q, E& B5 S8 Q2 \个名为Application的TApplication类对象.在Project Options的Applcation页中,我们
& w1 O! T# M& r' F6 @* K- W C) I可以设置这个Application的Title(标题)和Icon(图标).也可以在工程源文件中编辑App
: K0 s2 {( L2 s, Wlcation的代码.
: |+ [9 g1 |% j# D' S& F( [Application对象不是需要经常使用.下面是TApplcation比较常用的方法和属性/事件等
4 T; [. |1 g8 K; S# h。
一>属性:
- q, r3 p6 t# R) A8 u& i1.bool Active:
* }1 s& }3 U8 @- Z: V* z这个属性是一个运行时才有效的只读属性.当应用程序处于激活状态且有焦点时它返回t
5 D# e+ s2 S# O1 S) B0 Z8 k: Jrue,否则为false
( j( x( }' c- F7 Q& u/ ?1 |2.AnsiString ExeName:
这是一个常用的属性.它返回应用程序的全路径执行文件名.运行时有效,只读.
o& u& E: e5 d5 OLabel1->Caption=ExtractFileName(Applcation->ExeName);//取得执行文件全文件名中
的文件名部分
3.HWND Handle:
取得应用程序的窗口句柄.调用API时可能需要.这个句柄是不可见的应用程序的窗口句柄
, x+ y; W# e* Q J- }# W/ Q j,而不是主窗口的句柄.要取得主窗口句柄,可以用Application->MainForm->Handle.
# G+ v: u7 K/ m/ c: y" K4.TColor HintColor:
确定工具提示窗口的颜色.运行时有效
- x( T/ L) F9 ~5.int HintHidePause:
确定显示工具提示后的工具提示显示持续时间,缺省值为2.5s.
6.int HintPause:
确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为80
0ms
' o" j& } u' Y' F! a7.int HintShortPause:
确定工具提示再次显示之前所需要的等待时间.缺省值为50ms
. ?; s8 J6 w9 @8.TIcon Icon:
应用程序的图标.此Icon出现在应用程序的任务栏窗口按钮上.并作为在文件浏览器中应
7 F- W# T+ n/ A1 |# l4 l! a用程序的图标.一般在Project options中的Applition标签中设定.当然也可以用代码:
Application->Icon->LoadFromFile("e:\\icon\\cb3.ico");
' e s8 u5 z$ D9.TForm MainForm:
应用程序的主窗体.这是一个只读的属性.主窗体就是应用程序最先创建的窗体.可以在P
9 C! k* I Q" _8 @" X3 Oroject Options的Forms页中设定.当主窗体被关闭时,应用程序将结束.
" D7 R0 u8 ^3 h5 y1 Y10.AnsiString Hint:
应用程序的Hint(工具提示)
11.bool ShowHint:
是否显示提示
" z1 y0 @0 [) i9 I% ^12.AnsiString Title:
8 Q2 e' \: d) G6 l& H0 x! V/ n应用程序的标题,它显示在应用程序在任务栏按钮中
13.bool ShowMainForm;
- G' V1 p7 T7 p: r是否显示主窗口,缺省为true.当我们想建立一个不显示主窗口的应用程序时,在工程源
6 ?+ o3 R+ J( O, D9 T0 T文件中的Application->Run()之前设定这个属性为false即可.
( ^. o" b! V/ I3 {4 X+ ?& c1 E14.bool Terminated;
; L/ e$ k, Y" f检查应用程序是否已收到关闭消息.如果为true,表示应用程序即将关闭.
( W3 }7 q, y, S9 r4 U5 b" I# ^* N二>方法:
1.void BringToFront():
将应用程序置于激活状态并且拥有焦点.它将使用应用程序的窗口置于其它应用程序的窗
3 P0 C3 u- L2 u) g( ^口之前.
$ S' f5 x E) T2 _% t# w8 \# EApplcation->BringToFront();
2.int MessageBox(char *text,char *caption,int flag);
+ @, h! V$ B6 U- n7 p$ s( y这是最常用的方法了.显示一条消息的对话框,可以有一个或多个按钮.它封装了API中的
6 e. N `2 C. V: P/ f* I# J6 {5 fMessageBox函数.
text:消息字符串,可以是多行,多行可以用"\n"隔开.如"你好!\n欢迎使用本程序."
6 C9 l0 [( w, V! Ycaption:对话框标题
6 S9 g1 W7 U7 Z8 K2 xflag:决定此对话框形式.常用的如下(位组合,用|)
按钮,决定对话窗口的基本用途
MB_OK:显示一个OK按钮
6 B6 S# i) x! W" F/ ] mMB_YESN显示二个按钮:Yes或No
MB_YESNOCANCEL:显示三个按钮,YES/No/Cancel
MB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略)
% v6 T2 S9 U! r4 jMB_HELP:显示帮助按钮,当按F1或点按钮时触发Help事件
0 X8 l% E# ^/ t# n缺省按钮:
6 ^1 r6 r6 j" ]' [, dMB_DEFBUTTON1/MB_DEFBUTTON2/MB_DEFBUTTON3/MB_DEFBUTTON4:决定哪一个按钮为缺省
按钮.缺省为MB_DEFBUTTON1
, C9 l6 {. g3 p" D1 K" R* F1 }图标:
1 E6 u+ `( S" k9 c; eMB_ICONSTOP:显示一个红色X图标
: i8 l0 ?/ C5 e" PMB_ICONINFORMATION:最常用的提示图标,一个小写的i
7 _- r6 u* U8 h6 Q2 a# ^4 OMB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
" R- W0 B: `" D1 z$ c: T+ H; H) X返回值:
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.
/ o- f1 [. b0 Lif(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
: e1 b. a+ F# o9 R3 kNQUESTION)==IDYES)
{
& E2 k4 S/ E/ d0 gClose();
, k6 o0 _3 ~; [- h! C2 ~}
6 e' K; } W- K2 a i2 [7 {8 B3.void Minimize()
最小化应用程序的每个窗口和当前显示的窗口
; u, }% @) ]9 p+ x4.void Restore()
; g5 D0 i/ O- ?$ L6 Q4 \. Y9 }还原一个最小化的应用程序
5.void Terminate()
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
6.void ProcessMessages(void)
* L5 Y) L0 d9 Z9 h8 W7 }8 H常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
/ o7 e' Q& p6 qMB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
' R* x, x, T) C$ v8 i返回值:
按钮.缺省为MB_DEFBUTTON1
6 k4 d$ o7 \+ C) S6 @8 ^! J图标:
9 [4 V& [5 Z" `' GMB_ICONSTOP:显示一个红色X图标
MB_ICONINFORMATION:最常用的提示图标,一个小写的i
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
返回值:
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
, A$ G1 q8 @9 \' f) K# X, cNQUESTION)==IDYES)
{
+ }" i6 I* g8 rClose();
6 J+ x! l: O) W8 I# ?% Z$ ]% {; _}
3.void Minimize()
最小化应用程序的每个窗口和当前显示的窗口
4.void Restore()
& N f" @* _' d+ E* e还原一个最小化的应用程序
5.void Terminate()
' W. E5 e C: y4 |. ]& j自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
* }6 }9 x, A. R- f( G1 n8 w6.void ProcessMessages(void)
常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
( A7 U! J0 U. v3 F$ m) @/ m! Z7 Z+ O中的消息
2 o9 u P+ W. B% M1 @% m三>事件:
+ C4 Z; [* ^$ Q2 l5 `1.OnHint
5 R' T/ f+ W- o) k4 [当应用程序的提示要显示时的事件.我们也可以将它指向自定义的函数中作特殊的工具提
5 u: }6 m# w- n9 T! z Y5 F示显示
例:
) P Y+ D9 b0 Z5 K/ B0 \( \void __fastcall TForm1::FormCreate(TObject *Sender)
& W( ?' ~; N2 `{
Application->OnHint = DisplayHint;
7 V% o, U5 ]: W/ Z}
void __fastcall TForm1:
isplayHint(TObject *Sender)
{
! X7 D2 U# o& g; I& ]* L* |% OStatusBar1->SimpleText = GetLongHint(Application->Hint);
+ U+ ^. D9 x! w; _5 e3 N}
- k6 D$ }* R& U9 A6 c6 ~//一个Hint可以包含由|字符分隔的二部分.GetShortHint是另外一个函数
8 m# v7 O* S$ E" a2.OnIdle:
- j9 {& ~: t+ K2 O% U当应用程序空闲时的事件.通常在这时候作一些不重要的状态检测或处理要求不是很严格
的任务.
3.OnException:
6 J' y# v! }: }$ x3 u当应用程序发生异常时.你也可以自定义一个异常处理过程而不用缺省的ShowException
4.OnMinimize
* V1 v6 f0 O; s3 L应用程序最小化时的事件
5.OnActivate:
应用程序被激活时的事件
2 U# @9 G+ Y: O H# _6.OnDeactivate
应用程序失去焦点的事件
7.OnMessage
应用程序接收到消息时的事件.如果你想作特定的消息处理.你可以按管这个事件
# [' y% _+ P; M$ Z0 D' i8.OnRestore
/ o/ U: Z# W. W$ v应用程序由最小化状态恢复时的事件
TApplication应用小技巧:
# D& S* O9 M' G" J, {2 FA.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT
/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的.
AnsiString filepath;
6 Y- ~9 P" ~2 h7 e0 j0 |filepath=ExtractFilePath(Applcation->ExeName);
//ExtractFilePath与ExtractFileDir是有区别的.表现在ExtractFilePath最后总是有"
\\",而ExtractFileDir只是在路径为根目录时最后才是"\\"
" r% ~6 j3 y# T3 n" iTable1->DatabaseName=filepath+"data";
' x# J% ~5 A% h* sTable1->TableName="maindb.dbf";
' \3 l5 E+ {* S% k9 etry{
Table1->Active=true;
}
+ {( P- |9 e: R! qcatch(...)
{
H1 |! ]& n) W' x//......
8 T0 B) p+ X, n* l u z}
另外有一个函数ParamStr(int index)与Application->ExeName有同样效果.ParaStr(0)
' Y2 A/ a) V" V0 `: K& g% H7 t就是应用程序命令行第一部分.也就是执行文件的全路径.
B.自定义异常处理窗口
缺省异常处理窗口是用ShowException显示的一个窗口,其标题为应用程序的Title.我们
也可以自定义异常处理函数,以便对异常进行自定义的处理。
void __fastcall TForm1::FormCreate(TObject *Sender)
{
) B$ G; H0 h, E8 FApplication->OnException = HandleException;
8 v2 y: U5 s* U9 n3 d( ~}
. l% B- `+ e7 bvoid __fastcall TForm1::HandleException(TObject *Sender,SysUtils::Exception
*E)
3 t* H, e% |* ]{
+ j- }* {) h4 `AnsiString errorstr="应用程序发生了错误.\n"+E->Message;
4 Z6 @5 m. g4 q5 f. p' n# F1 m1 zApplication->MessageBox(errorstr.c_str(),"发生异常",MB_OK);
8 @, V, Z% p2 Q, D' U0 y# w}
1 ~0 K5 T A) N6 g7 TC.利用OnIdle事件做一些时效要求不严的任务.
我们用Timer定时处理一些事务。但Timer是要占一定CPU时间的,对应用程序的执行效率
有一定影响。如果这个要处理的事务并不十分重要.我们就可以放在OnIdle中处理。让应
]+ B9 B8 Q# J. Y( ` ?: o) c3 S用程序在空闲进处理.
. ?/ ~1 |. Y4 o* ~# Uvoid __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->OnIdle = updatestatus;
1 t T+ A6 `' q0 s C) o' a0 m6 ?}
% x0 G! a4 M- p' O- s A4 Vvoid __fastcall TForm1::updatestatus(TObject *Sender,bool &Done)
/ |# t% t. X# }0 G4 ~{
StatusBar1->SimpleText=DateTimeToStr(Now());
9 q2 S& b$ U+ R; z8 t}
7 C3 h4 A6 a9 |由于C++Builder5已经将Application做到了控件选取面板上。这使得我们对Applicatio
n编程比以前方便了不少。以上的方法对cb5以前的版本是很适用的。如果是C++Builder
5,我们也不用这么麻烦地写代码了,直接在Application控件的对应事件中写处理代码
即可.
( y/ }/ {3 I1 G( e i3 W: s5 \. yD.在一个长时间的执行代码之前或之中及时处理其它消息
Form1->Label1->Caption="开始执行指定任务:"+jobname[0];
Application->
rocessMessages();
runjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息
8 |0 L# `9 m8 k9 F* \2 v: u( u* n8 p
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |