|
T8 e, u- w ^' Y3 Y% u0 v
TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一 5 }' S2 C6 N- u5 w8 |6 c7 V
个名为Application的TApplication类对象.在Project Options的Applcation页中,我们 ) n7 Q3 R, p3 Z
可以设置这个Application的Title(标题)和Icon(图标).也可以在工程源文件中编辑App
9 }& O V9 ~' ^* x3 b- H- Wlcation的代码. - `# K$ U8 a# }9 @# n
Application对象不是需要经常使用.下面是TApplcation比较常用的方法和属性/事件等
0 Q, p/ S8 n1 z3 \。
* P8 i0 Y) v4 u一>属性:
$ `/ B2 d8 k! T8 D* ?" s1.bool Active:
2 c* ?0 U( K1 i这个属性是一个运行时才有效的只读属性.当应用程序处于激活状态且有焦点时它返回t # j X3 ~% G. G
rue,否则为false
7 A/ z' R# H; o# h! U/ _- Q2.AnsiString ExeName:
( }. w7 `& Z8 g! i; @( q( }' f5 w这是一个常用的属性.它返回应用程序的全路径执行文件名.运行时有效,只读.
; g" z0 R8 k* U9 ?# n5 gLabel1->Caption=ExtractFileName(Applcation->ExeName);//取得执行文件全文件名中 c" b- b. y" v9 ]& P( U
的文件名部分 ) ^7 O- y0 A) E: _
3.HWND Handle:
' k2 ~- b2 [' K( I! K取得应用程序的窗口句柄.调用API时可能需要.这个句柄是不可见的应用程序的窗口句柄
+ C" l5 r4 ^0 j( B,而不是主窗口的句柄.要取得主窗口句柄,可以用Application->MainForm->Handle.
9 F$ s; Z' i( q6 _; y. V% o, @4.TColor HintColor: . [0 x8 @: G# f! k4 [
确定工具提示窗口的颜色.运行时有效 6 ~& D% c' |( k+ `6 E
5.int HintHidePause: ( ~3 F1 T; V- ^9 o! B
确定显示工具提示后的工具提示显示持续时间,缺省值为2.5s.
' d% T' Z' X. y6.int HintPause: # a G6 w: x5 m. h
确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为80 ) e- Q: g) o( W7 }# z: S0 R' M
0ms / W2 X! d+ Q' a% O/ u/ ]' b
7.int HintShortPause: 2 {% W/ P3 b7 x/ d* \
确定工具提示再次显示之前所需要的等待时间.缺省值为50ms
- E% E) r- d% Q! }' w! }" r8.TIcon Icon:
8 f0 f _1 H, d) y6 a1 c5 k7 B" d应用程序的图标.此Icon出现在应用程序的任务栏窗口按钮上.并作为在文件浏览器中应 4 e. Y1 o5 ^8 n0 A: S1 [2 L! u8 D1 S
用程序的图标.一般在Project options中的Applition标签中设定.当然也可以用代码: ; M% X; Y E2 v# C9 d I$ C
Application->Icon->LoadFromFile("e:\\icon\\cb3.ico");
, c* p2 [+ H" w( m0 u# q+ `; m9.TForm MainForm:
. e8 ?7 X$ Y5 ~% n/ j$ I应用程序的主窗体.这是一个只读的属性.主窗体就是应用程序最先创建的窗体.可以在P 9 i, Y* y0 g$ T2 Y# a
roject Options的Forms页中设定.当主窗体被关闭时,应用程序将结束. $ b% Y+ \# V4 `8 L5 z
10.AnsiString Hint: - x: u- k1 [1 L3 {
应用程序的Hint(工具提示)
$ C6 J% I6 q; b/ l& c: Q11.bool ShowHint: ' n' O) V/ V* N/ N2 |# H
是否显示提示 8 k5 ?5 D# @# c/ O/ r
12.AnsiString Title:
" l; I- o; ~4 T应用程序的标题,它显示在应用程序在任务栏按钮中 $ i* Q% s$ U, }, E) N5 }
13.bool ShowMainForm; 8 F8 a+ M8 D! a$ i+ U6 z. V7 I( F
是否显示主窗口,缺省为true.当我们想建立一个不显示主窗口的应用程序时,在工程源 9 f! _* K: X- u. v- ]
文件中的Application->Run()之前设定这个属性为false即可.
2 Y7 l" m' [6 b0 B+ \14.bool Terminated; % c! z/ L) V9 V) O9 q
检查应用程序是否已收到关闭消息.如果为true,表示应用程序即将关闭. - ?7 K, N& `" p8 \6 C* h F
二>方法:
6 K4 I1 E( p1 _# n2 B1.void BringToFront():
5 e. {, d8 a: S, s; s9 x将应用程序置于激活状态并且拥有焦点.它将使用应用程序的窗口置于其它应用程序的窗 * T& g+ T1 q- F6 ]% {6 i
口之前. ) B' l; d$ {/ }7 x, J
Applcation->BringToFront(); + F6 X3 v3 E0 R/ F
2.int MessageBox(char *text,char *caption,int flag);
1 [. o2 B4 W Z4 l$ w9 Q% T$ ]1 b# ?这是最常用的方法了.显示一条消息的对话框,可以有一个或多个按钮.它封装了API中的
) z! J+ J" X2 N3 I; u/ BMessageBox函数. & c8 [$ c0 k/ B
text:消息字符串,可以是多行,多行可以用"\n"隔开.如"你好!\n欢迎使用本程序." - v* N2 F! o. d- s* V
caption:对话框标题
( C% [- p- q! }/ n2 o& }flag:决定此对话框形式.常用的如下(位组合,用|)
7 Q* w7 U+ L# P( D& h, F按钮,决定对话窗口的基本用途 ) A' j8 G7 Q! V( ]2 p- I1 c$ u
MB_OK:显示一个OK按钮 0 h. r; Z. X) x! Y2 k; S
MB_YESN显示二个按钮:Yes或No 3 T8 G9 @' L2 o! i
MB_YESNOCANCEL:显示三个按钮,YES/No/Cancel 5 n: ?9 \' X9 d: N b
MB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略)
+ a, |, @" C, }5 ]# z0 n, QMB_HELP:显示帮助按钮,当按F1或点按钮时触发Help事件
0 B5 f% ~" U) a& d- y缺省按钮:
+ C$ w* m! x* U. p* RMB_DEFBUTTON1/MB_DEFBUTTON2/MB_DEFBUTTON3/MB_DEFBUTTON4:决定哪一个按钮为缺省 ) K; W* u( l7 E: F& x
按钮.缺省为MB_DEFBUTTON1 1 F( s$ b# ^0 e, o# Q- I- ]/ y' M7 @
图标:
% ]' k9 k2 Q [& zMB_ICONSTOP:显示一个红色X图标
6 S% ?& f9 n/ r G3 j7 yMB_ICONINFORMATION:最常用的提示图标,一个小写的i
2 o' u* f( U3 o7 s! w2 cMB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
, ~, j- y! r) Y9 k( m* H& g返回值: / ?4 I! C3 \( Z7 U
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回. 5 y/ u% `' Z# J) s: m \, _5 o
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
2 H. n9 G; F8 G* r; {+ G+ mNQUESTION)==IDYES) 1 x' m% @% \7 y5 n3 b
{
0 H- s& n; u) MClose();
4 ]3 e5 E4 L s% c Y. O% E9 ]# Y} 5 \- B# v7 ~& r7 A( v& }# f
3.void Minimize()
. `) q& ^7 t3 C: ] u最小化应用程序的每个窗口和当前显示的窗口
9 x% V# q5 @" L4 j! L4.void Restore()
, {) Z. W2 b7 [还原一个最小化的应用程序 2 l' @* G, D: X" c- J K, i% c
5.void Terminate()
& G# y6 Z3 y ?- E" D g( W自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序 + ]7 ?; Q. K# K$ G, Y
6.void ProcessMessages(void)
4 \; J: K" s& \, P* a k4 ?常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
2 R4 a1 O/ d, S9 _! o* L+ m% ^5 }MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
5 c4 Z& z1 N% C0 A* w& F返回值:
3 ]& p( E9 x' a) ]0 E+ S- R按钮.缺省为MB_DEFBUTTON1 2 z2 l6 h# H$ j, O
图标: 6 b" ?" g2 \* Y j2 e. A% t
MB_ICONSTOP:显示一个红色X图标 : ~7 y$ y2 h% U& B' E- e" D
MB_ICONINFORMATION:最常用的提示图标,一个小写的i ) ?9 C: B+ A( V! a4 b
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 , j+ K3 l6 u, w+ a4 b$ R- }3 S* E
返回值:
! e3 B: l% K* hIDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.
. H3 N) E* P6 O4 I: n8 v" F/ @if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
8 u5 O, i" _6 y0 j, I0 ~NQUESTION)==IDYES)
% l; ~3 \" `( h9 M' _% F6 Z3 [{ ( q0 z# u6 X) p6 { j6 t
Close();
- N& i' h: [' P& h- g} % ^1 r ^1 I2 {5 p
3.void Minimize()
2 q" F4 Q* ~2 x最小化应用程序的每个窗口和当前显示的窗口
' O6 V d) I& _; _' W4.void Restore()
" S( i7 D, a$ b, a还原一个最小化的应用程序 7 y7 P s/ }6 h1 T! z
5.void Terminate()
+ w3 o' _& O" F( k自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序 * b3 v# W8 \" ^
6.void ProcessMessages(void)
/ o6 j# { i4 x5 A% y常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
* a: t3 }; z5 k. e中的消息
2 x- k( D( y, }6 M三>事件:
* g$ }. v- n) S( O5 A1.OnHint
" J# v' A2 l& J2 F8 _% r1 t当应用程序的提示要显示时的事件.我们也可以将它指向自定义的函数中作特殊的工具提
+ V- O7 v5 K) Y示显示 9 u2 M2 w+ Y6 ]) j
例:
+ z. N T/ m0 r1 u+ {void __fastcall TForm1::FormCreate(TObject *Sender) % R: r6 z, X9 X& c+ A
{
3 y1 \3 p1 o: Z6 E q) `Application->OnHint = DisplayHint;
" W. i6 c- \" S8 b! T}
9 Y+ h ~+ ^. A2 m6 |void __fastcall TForm1: isplayHint(TObject *Sender) 2 S$ d h8 c; @* O" W7 I
{
. X" C: n; B9 L8 L# i5 @6 CStatusBar1->SimpleText = GetLongHint(Application->Hint); / N) k2 _! z9 ?* D% c5 ?0 }
}
1 ]! k! u& i/ h/ K0 c& U//一个Hint可以包含由|字符分隔的二部分.GetShortHint是另外一个函数 ! Y( ^0 e$ I8 Z2 A( r
2.OnIdle: : X# U2 N% _. T2 Z" \+ H
当应用程序空闲时的事件.通常在这时候作一些不重要的状态检测或处理要求不是很严格
+ u2 N" f7 x; o$ R- c7 y) E$ S' t4 M E2 x的任务. . ^! I' J8 `: C( O0 C/ f; [
3.OnException: ' S: i! d: |, {9 O+ g
当应用程序发生异常时.你也可以自定义一个异常处理过程而不用缺省的ShowException 2 P2 j& y, J$ S7 Q
9 H" K/ H# a3 n6 o1 _/ _
4.OnMinimize $ V* e. x' h7 l8 \# c
应用程序最小化时的事件 , j* d& x( d6 g/ z# N ^, X' o
5.OnActivate:
8 [* s/ g% S! W/ B5 B应用程序被激活时的事件
" i4 R3 R7 s% d6.OnDeactivate ; j L7 s9 f6 P
应用程序失去焦点的事件 / u" r' h' }8 M4 b' a0 a
7.OnMessage 8 E, W' ~" P) }% U4 t- x, {
应用程序接收到消息时的事件.如果你想作特定的消息处理.你可以按管这个事件 - n3 x7 s. a/ V% O7 g
8.OnRestore $ ?0 e6 Y. J ]
应用程序由最小化状态恢复时的事件 8 z6 h! o$ b! K! D3 X0 B( g8 s
TApplication应用小技巧:
4 `( G: z8 H- O+ {2 X" F9 BA.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT 1 A* M. m ^' U* [
/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的.
& M& _( W) q5 O# J& nAnsiString filepath; 5 w$ F2 Y' i: K0 y S7 V, _
filepath=ExtractFilePath(Applcation->ExeName); 1 A4 O5 Z0 M! ~' e
//ExtractFilePath与ExtractFileDir是有区别的.表现在ExtractFilePath最后总是有"
$ N* Z& h. C( A2 C/ p\\",而ExtractFileDir只是在路径为根目录时最后才是"\\" 6 b) Y& ?5 T8 T; v7 u3 [6 J
Table1->DatabaseName=filepath+"data";
' S/ J6 P+ x: Y9 } Q; ?' STable1->TableName="maindb.dbf";
, v5 X8 F* A; I# R% k- M8 l+ vtry{ ; ?6 @/ k- y! w& F
Table1->Active=true;
( i& r; Q. h* s} 7 a5 D T5 V: Z6 v! v( c% S
catch(...) # a& C5 l7 O+ u1 a
{
3 a# h6 X1 s6 i& w9 R//......
0 l. l3 m7 `& c1 O& L} * {/ {+ R0 d: @) I
另外有一个函数ParamStr(int index)与Application->ExeName有同样效果.ParaStr(0) 4 n- D( O+ g- G/ W1 H
就是应用程序命令行第一部分.也就是执行文件的全路径.
! o& D' }+ t6 E8 IB.自定义异常处理窗口
7 {/ F8 r4 g$ r: |缺省异常处理窗口是用ShowException显示的一个窗口,其标题为应用程序的Title.我们 * F l2 ~$ r3 f* Z6 s7 j/ E
也可以自定义异常处理函数,以便对异常进行自定义的处理。
2 w" ^4 H; C1 F* D/ _void __fastcall TForm1::FormCreate(TObject *Sender) : c" G( V8 T4 Z/ g
{
8 s/ O# j7 ~3 B; oApplication->OnException = HandleException;
1 _3 `6 R$ C% l% g5 \ Q} ' X' f, G: g- o
void __fastcall TForm1::HandleException(TObject *Sender,SysUtils::Exception
" m) G0 b' n4 J6 @- X$ a: ~*E)
1 L, X" Y4 C) f. V{ 5 l1 k5 E3 }! T8 w. {& s. ^
AnsiString errorstr="应用程序发生了错误.\n"+E->Message; ) u1 s' M& O& Z/ ]
Application->MessageBox(errorstr.c_str(),"发生异常",MB_OK);
; L( k: v; B* `} $ u4 t& y! O2 R* |4 W) W
C.利用OnIdle事件做一些时效要求不严的任务. - i* K; S+ t' ?+ g4 L$ Q. O1 p4 V
我们用Timer定时处理一些事务。但Timer是要占一定CPU时间的,对应用程序的执行效率
/ C! k# T& f" K( P有一定影响。如果这个要处理的事务并不十分重要.我们就可以放在OnIdle中处理。让应 : Z' V0 R, I$ C8 w9 O
用程序在空闲进处理.
' _% q9 t& }7 d+ ?" S% `1 a6 _9 b! x3 o& r. h" U
void __fastcall TForm1::FormCreate(TObject *Sender)
) w# w- t) w' `5 X{
: W8 T: ?0 c. A: LApplication->OnIdle = updatestatus; 2 m% K1 d6 T3 K% U- G, |7 G, b: c
}
8 q3 |# W5 o' D. x6 b2 rvoid __fastcall TForm1::updatestatus(TObject *Sender,bool &Done) - z, Q& M$ `( z+ h- y# D
{
- g1 ~: n* Y/ P/ M; |StatusBar1->SimpleText=DateTimeToStr(Now());
) D7 p1 K" \( H0 H( q' I9 q" P}
: G8 x7 J- l! Q3 ^; S由于C++Builder5已经将Application做到了控件选取面板上。这使得我们对Applicatio
4 @* {+ I& q) Hn编程比以前方便了不少。以上的方法对cb5以前的版本是很适用的。如果是C++Builder
! z% t# Y* i2 i; f/ c5,我们也不用这么麻烦地写代码了,直接在Application控件的对应事件中写处理代码
: q3 G' ?4 g, k4 `7 u( S6 `2 E即可.
% x( g$ I9 ~1 gD.在一个长时间的执行代码之前或之中及时处理其它消息 1 @# F! k- K6 W
Form1->Label1->Caption="开始执行指定任务:"+jobname[0]; % I4 {1 Y( S+ E; _2 ~
Application-> rocessMessages(); ( ^+ u- t, z3 i/ e- R+ ?9 `, B2 v' B
runjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息 : s) y6 B6 c& J e5 E3 a% x
|