TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一
# i1 i9 b; u% S z) i个名为Application的TApplication类对象.在Project Options的Applcation页中,我们
/ s8 s0 b7 z3 m+ O5 f* \" g可以设置这个Application的Title(标题)和Icon(图标).也可以在工程源文件中编辑App
lcation的代码.
Application对象不是需要经常使用.下面是TApplcation比较常用的方法和属性/事件等
2 o% B: e4 f9 S' m1 j) C* n。
一>属性:
1.bool Active:
* E, d8 ?0 c9 J, T. q. f" Q3 d2 j这个属性是一个运行时才有效的只读属性.当应用程序处于激活状态且有焦点时它返回t
* z' [1 R+ Q/ [0 x5 Crue,否则为false
2.AnsiString ExeName:
5 `1 X4 o4 H9 p" z: O这是一个常用的属性.它返回应用程序的全路径执行文件名.运行时有效,只读.
) u3 g h) H4 X. p# j* \Label1->Caption=ExtractFileName(Applcation->ExeName);//取得执行文件全文件名中
3 x" E# j1 c! X0 b# {2 C4 x的文件名部分
5 ~! m2 D- I0 g3.HWND Handle:
取得应用程序的窗口句柄.调用API时可能需要.这个句柄是不可见的应用程序的窗口句柄
,而不是主窗口的句柄.要取得主窗口句柄,可以用Application->MainForm->Handle.
0 T) U/ E0 F- q2 ~4.TColor HintColor:
' X+ |. V& b+ R. W8 B }确定工具提示窗口的颜色.运行时有效
, [4 i' ]" z4 W- P: q% ?5.int HintHidePause:
; q2 v0 x c: R确定显示工具提示后的工具提示显示持续时间,缺省值为2.5s.
$ g U2 @/ h2 H# D. m/ |6.int HintPause:
. U- [3 b# u( W9 k/ h8 N. Y, o确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为80
+ ~, Q: w" \8 t0 b0ms
7.int HintShortPause:
2 A/ g6 V2 V" Q0 {0 n确定工具提示再次显示之前所需要的等待时间.缺省值为50ms
8.TIcon Icon:
9 f2 Q! f1 W- l: o+ M6 z应用程序的图标.此Icon出现在应用程序的任务栏窗口按钮上.并作为在文件浏览器中应
用程序的图标.一般在Project options中的Applition标签中设定.当然也可以用代码:
Application->Icon->LoadFromFile("e:\\icon\\cb3.ico");
9.TForm MainForm:
应用程序的主窗体.这是一个只读的属性.主窗体就是应用程序最先创建的窗体.可以在P
roject Options的Forms页中设定.当主窗体被关闭时,应用程序将结束.
% C+ A( `, F+ j, B' e( B$ J2 i10.AnsiString Hint:
. F9 `. C3 b+ Q* E u) a应用程序的Hint(工具提示)
11.bool ShowHint:
是否显示提示
" f' ^9 u9 }+ G# {+ B# A12.AnsiString Title:
应用程序的标题,它显示在应用程序在任务栏按钮中
0 k# M3 ?, q2 Z! |/ {% e13.bool ShowMainForm;
0 a' @" T7 x' j" d; _& q2 o' B是否显示主窗口,缺省为true.当我们想建立一个不显示主窗口的应用程序时,在工程源
文件中的Application->Run()之前设定这个属性为false即可.
14.bool Terminated;
$ O- B/ Y$ P6 c" ~6 u检查应用程序是否已收到关闭消息.如果为true,表示应用程序即将关闭.
# w z6 |' S7 \7 r二>方法:
1.void BringToFront():
将应用程序置于激活状态并且拥有焦点.它将使用应用程序的窗口置于其它应用程序的窗
口之前.
8 t% O- F9 Q4 m3 _+ HApplcation->BringToFront();
/ Q, v1 X8 {3 U F2.int MessageBox(char *text,char *caption,int flag);
这是最常用的方法了.显示一条消息的对话框,可以有一个或多个按钮.它封装了API中的
$ B6 v# E! k' XMessageBox函数.
text:消息字符串,可以是多行,多行可以用"\n"隔开.如"你好!\n欢迎使用本程序."
( H& Z$ L+ Y1 p, |, `* l- h4 Y8 Ucaption:对话框标题
flag:决定此对话框形式.常用的如下(位组合,用|)
按钮,决定对话窗口的基本用途
MB_OK:显示一个OK按钮
MB_YESN显示二个按钮:Yes或No
2 Y7 v0 B4 j, Y G( r8 sMB_YESNOCANCEL:显示三个按钮,YES/No/Cancel
MB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略)
MB_HELP:显示帮助按钮,当按F1或点按钮时触发Help事件
缺省按钮:
0 e; S- g* Q; N+ qMB_DEFBUTTON1/MB_DEFBUTTON2/MB_DEFBUTTON3/MB_DEFBUTTON4:决定哪一个按钮为缺省
2 Z6 O j# P* ~$ p1 u5 k按钮.缺省为MB_DEFBUTTON1
图标:
MB_ICONSTOP:显示一个红色X图标
$ S+ T; t+ Y5 ?, W \! H; T2 @MB_ICONINFORMATION:最常用的提示图标,一个小写的i
) s& I) I1 m* o: q( d, T" zMB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
1 `: a- D6 p6 @' G' ~返回值:
) I! i2 G# w+ h' X/ b/ SIDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
NQUESTION)==IDYES)
{
Close();
% X: B6 X7 B' k- k}
3.void Minimize()
. e9 H4 |+ o$ A5 `最小化应用程序的每个窗口和当前显示的窗口
) x2 h) W' n7 t4 C2 t& f1 b4.void Restore()
: q# X+ B" z6 p& [1 M0 A9 W- s* E/ D还原一个最小化的应用程序
8 x5 M5 D* K) J4 Y* l3 }5.void Terminate()
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
% ]3 j' h P- `/ X6.void ProcessMessages(void)
5 z5 L4 F( S1 k/ f常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
/ b' h8 D1 k' H5 Y) J) `4 [% \2 lMB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
7 l X1 q y& x9 a返回值:
2 d9 _1 e5 g6 c5 o按钮.缺省为MB_DEFBUTTON1
图标:
& L$ q! Y$ G; i1 C1 b7 n$ a8 NMB_ICONSTOP:显示一个红色X图标
# h: n: ~& ~% ^0 ~# ^2 U1 FMB_ICONINFORMATION:最常用的提示图标,一个小写的i
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
0 f6 m$ V. ?; ]: j) ^% F8 I- `返回值:
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.
. D, Z3 J$ A2 e0 n- mif(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
) z& G c" a& p+ h WNQUESTION)==IDYES)
8 U: l: P1 z/ G) @0 q4 E- {{
Close();
" q# C( k, Z, ~2 S) G2 K4 A}
- [; S6 S) ~! O$ n3 r& N3.void Minimize()
# t$ h9 j! {7 r. E3 `$ f最小化应用程序的每个窗口和当前显示的窗口
$ \9 g0 ?8 h. r/ R3 L4.void Restore()
还原一个最小化的应用程序
4 ]) G9 i$ @* U2 y( s' Q8 [5.void Terminate()
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
P5 f& a- g% B9 @! v6.void ProcessMessages(void)
常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
5 A2 A6 T( U8 j& o中的消息
三>事件:
: [7 m( W" ?$ d( t1 M1.OnHint
当应用程序的提示要显示时的事件.我们也可以将它指向自定义的函数中作特殊的工具提
5 d# A( j2 ]" z" L0 _0 }" K示显示
例:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->OnHint = DisplayHint;
6 ]# W1 ?3 s2 W+ }}
/ }( @0 W: n2 _& x1 t) v" H jvoid __fastcall TForm1:
isplayHint(TObject *Sender)
{
j6 n5 s( ^* R" X# b6 W$ VStatusBar1->SimpleText = GetLongHint(Application->Hint);
}
//一个Hint可以包含由|字符分隔的二部分.GetShortHint是另外一个函数
2.OnIdle:
当应用程序空闲时的事件.通常在这时候作一些不重要的状态检测或处理要求不是很严格
的任务.
" c9 }* p# T/ D4 h; t; I3.OnException:
当应用程序发生异常时.你也可以自定义一个异常处理过程而不用缺省的ShowException
4.OnMinimize
6 I5 T) i; V9 z6 D2 w应用程序最小化时的事件
- ?8 o Z* S4 y. g0 e, k5.OnActivate:
应用程序被激活时的事件
9 N2 R( g: u7 a$ y1 r6.OnDeactivate
, H& v1 s* p9 u1 V9 \& v应用程序失去焦点的事件
7.OnMessage
. m! n7 L* D; l0 \, f应用程序接收到消息时的事件.如果你想作特定的消息处理.你可以按管这个事件
2 w# v0 T) g1 x: T" q2 H: S4 c8.OnRestore
应用程序由最小化状态恢复时的事件
6 ?- k e- `( r( X1 c/ t( hTApplication应用小技巧:
: Y# f* J# |9 O7 V. ^2 a5 yA.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT
3 }2 e! i2 R! U1 B0 B/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的.
8 p* @' c, O5 [: c( {, AAnsiString filepath;
filepath=ExtractFilePath(Applcation->ExeName);
//ExtractFilePath与ExtractFileDir是有区别的.表现在ExtractFilePath最后总是有"
" E2 I3 Y6 R& ?$ t" |5 s; C. T\\",而ExtractFileDir只是在路径为根目录时最后才是"\\"
/ W! [2 `/ B( A0 ETable1->DatabaseName=filepath+"data";
) `, I, o( V3 c# u/ T4 r9 lTable1->TableName="maindb.dbf";
try{
6 t$ _' m+ x; M1 G8 q+ L5 Y7 \' ITable1->Active=true;
! X! ]7 f! N1 x}
6 k" p5 i! t5 Gcatch(...)
# ?; P) t* N# [, h{
//......
8 a- u$ ~. X1 e* P: K$ s6 a}
! l2 \) ~3 o8 i! R/ ^5 Q另外有一个函数ParamStr(int index)与Application->ExeName有同样效果.ParaStr(0)
: c$ P. R0 x5 |1 L8 }5 _( M/ P就是应用程序命令行第一部分.也就是执行文件的全路径.
B.自定义异常处理窗口
3 W: E5 J/ G2 }, X$ ?) `7 ?缺省异常处理窗口是用ShowException显示的一个窗口,其标题为应用程序的Title.我们
也可以自定义异常处理函数,以便对异常进行自定义的处理。
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->OnException = HandleException;
}
. j. k, B# ?: d2 }, L; nvoid __fastcall TForm1::HandleException(TObject *Sender,SysUtils::Exception
4 W0 A3 _* E: v" l*E)
{
7 b9 ^5 A! }( J8 y& JAnsiString errorstr="应用程序发生了错误.\n"+E->Message;
. q' u' M! z, G% \Application->MessageBox(errorstr.c_str(),"发生异常",MB_OK);
2 { ]) Q, g$ M" R/ u5 R}
: U2 k) {3 Q5 e+ _' B" K. HC.利用OnIdle事件做一些时效要求不严的任务.
我们用Timer定时处理一些事务。但Timer是要占一定CPU时间的,对应用程序的执行效率
/ _9 e* I% o' i; G( q有一定影响。如果这个要处理的事务并不十分重要.我们就可以放在OnIdle中处理。让应
用程序在空闲进处理.
. r! ]' H. J6 @# m1 T; R. `0 |' L" R . \5 R9 R/ c- f. \, `6 R6 D Nvoid __fastcall TForm1::FormCreate(TObject *Sender)
* q$ }" |0 g) F( E# \5 F- \{
5 i( u! \0 \5 ?9 c+ ]Application->OnIdle = updatestatus;
}
4 `6 t- K; y8 s6 ]6 N! W6 B# \3 lvoid __fastcall TForm1::updatestatus(TObject *Sender,bool &Done)
{
StatusBar1->SimpleText=DateTimeToStr(Now());
4 T+ F9 o& ^+ _. g2 k}
* W T# g5 r0 ]" `9 d2 B由于C++Builder5已经将Application做到了控件选取面板上。这使得我们对Applicatio
n编程比以前方便了不少。以上的方法对cb5以前的版本是很适用的。如果是C++Builder
5,我们也不用这么麻烦地写代码了,直接在Application控件的对应事件中写处理代码
' y2 m6 p) C' L9 X即可.
D.在一个长时间的执行代码之前或之中及时处理其它消息
: h. @; W& n8 `6 M# VForm1->Label1->Caption="开始执行指定任务:"+jobname[0];
1 W7 ^4 Y) i/ L. j- QApplication->
rocessMessages();
runjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |