|
. c4 ^. H& ~) ?+ ITApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一
8 l9 a# `: ]9 s) X个名为Application的TApplication类对象.在Project Options的Applcation页中,我们 : Y1 J, l' V* k
可以设置这个Application的Title(标题)和Icon(图标).也可以在工程源文件中编辑App
6 m, Q2 m+ Z7 r$ `6 Blcation的代码. 0 P6 t) K' W V
Application对象不是需要经常使用.下面是TApplcation比较常用的方法和属性/事件等
3 E, A5 ]7 Y9 c ]. V+ [# M。 . m3 F i# |+ X9 v6 _$ I2 S" \
一>属性:
+ U9 b; j- C) ~* M( g" ~. u1.bool Active:
7 L8 E$ x$ H6 ^; A$ a1 ^2 u1 x这个属性是一个运行时才有效的只读属性.当应用程序处于激活状态且有焦点时它返回t
' f; s" p0 J& ~% r7 Z7 L1 Irue,否则为false
2 C- K# w* N- K. d* G7 r2.AnsiString ExeName: 2 i. B' I! e" c" m
这是一个常用的属性.它返回应用程序的全路径执行文件名.运行时有效,只读.
2 {6 f/ J! w/ ?2 a: d' ]Label1->Caption=ExtractFileName(Applcation->ExeName);//取得执行文件全文件名中
B5 r# C" S$ F8 i; W; {的文件名部分
7 S: [4 T- {% \- N; w3.HWND Handle:
4 y ]" z9 g0 z6 f取得应用程序的窗口句柄.调用API时可能需要.这个句柄是不可见的应用程序的窗口句柄 2 E. U' L9 i( q0 I. i: \, r/ G1 u
,而不是主窗口的句柄.要取得主窗口句柄,可以用Application->MainForm->Handle.
9 G( h* @' K- A& g; ]9 d4.TColor HintColor: * Q" j& `+ C6 F; j% W/ ], J$ h H7 j% D
确定工具提示窗口的颜色.运行时有效
! a3 y- a: A! U E6 R1 W5.int HintHidePause:
+ k; {9 |; K6 Y0 p1 }7 j) ?8 j2 q确定显示工具提示后的工具提示显示持续时间,缺省值为2.5s. " E9 S# T! ~" {2 L
6.int HintPause: 4 |, F" B# O T0 S9 ^: k1 s
确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为80 , z+ i. v7 j M
0ms
3 m" }1 @' Q2 J( T" }2 Z8 T7 B4 b4 @7.int HintShortPause: ) i& R+ w& O" H
确定工具提示再次显示之前所需要的等待时间.缺省值为50ms 5 B p0 B1 \" ~% J, q9 \/ \
8.TIcon Icon:
: e' k/ ?' C; o应用程序的图标.此Icon出现在应用程序的任务栏窗口按钮上.并作为在文件浏览器中应
3 j+ j2 |- v( y( s3 x用程序的图标.一般在Project options中的Applition标签中设定.当然也可以用代码:
l6 q. \, D& C# S5 \Application->Icon->LoadFromFile("e:\\icon\\cb3.ico"); , H5 Y: y3 y. B' V
9.TForm MainForm: . ]7 z; ` k/ L* n/ P* I
应用程序的主窗体.这是一个只读的属性.主窗体就是应用程序最先创建的窗体.可以在P
' k; D* C4 b( G& O0 broject Options的Forms页中设定.当主窗体被关闭时,应用程序将结束. / P) x( U+ P0 |9 b G8 F
10.AnsiString Hint:
2 G: F- Z3 O1 @0 K& K应用程序的Hint(工具提示)
4 H% T/ z W: Q" G1 \4 R11.bool ShowHint:
$ b. R7 K4 d2 d' P/ T是否显示提示
5 u( q/ e1 _: `/ g) Y9 G12.AnsiString Title:
, x) l! [; P H# u4 d4 b9 U应用程序的标题,它显示在应用程序在任务栏按钮中 1 z) m1 @3 i$ w4 X7 u/ i
13.bool ShowMainForm; 1 K, U6 E, D' Z1 U/ B' z
是否显示主窗口,缺省为true.当我们想建立一个不显示主窗口的应用程序时,在工程源 + P' a. c0 l+ H: ^1 T/ f
文件中的Application->Run()之前设定这个属性为false即可.
! F/ z) N |3 p14.bool Terminated; + }- x* G5 |8 ~3 w
检查应用程序是否已收到关闭消息.如果为true,表示应用程序即将关闭. & _! e) P* h5 [+ W( E, |$ H
二>方法:
0 _0 e I0 l8 H4 m, W/ H: O p! t1.void BringToFront():
! |& g6 j, B) B( }3 X. o将应用程序置于激活状态并且拥有焦点.它将使用应用程序的窗口置于其它应用程序的窗 , T9 Y9 W# ^8 O& K
口之前. 2 t+ ^( h/ S7 H3 p, {
Applcation->BringToFront();
3 b) L, i) I' r- M6 w' f# x2.int MessageBox(char *text,char *caption,int flag);
o" r7 S/ y6 d9 `4 \% }) X这是最常用的方法了.显示一条消息的对话框,可以有一个或多个按钮.它封装了API中的 - S. b1 |+ ?. j; Q% B! t
MessageBox函数. " F$ X! G- C' p: k
text:消息字符串,可以是多行,多行可以用"\n"隔开.如"你好!\n欢迎使用本程序." 2 w* T# n: A( t2 D- b! L
caption:对话框标题
6 Y/ f& }2 c* h% [* u7 \flag:决定此对话框形式.常用的如下(位组合,用|) 1 Q' G0 B* W- I3 U2 F
按钮,决定对话窗口的基本用途 7 l6 w9 [, F* Y2 E6 t& @, r8 P6 ?/ D- |
MB_OK:显示一个OK按钮 " z# n+ ?8 x* \1 t6 R- u8 ]1 n
MB_YESN显示二个按钮:Yes或No $ Y. S# i) A1 s; u
MB_YESNOCANCEL:显示三个按钮,YES/No/Cancel
4 k w* n& x" L yMB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略)
5 d8 R& C% k( D* `MB_HELP:显示帮助按钮,当按F1或点按钮时触发Help事件 ; {! C8 G8 f, z V4 r$ `
缺省按钮:
& ^7 r1 V" h. R+ ?MB_DEFBUTTON1/MB_DEFBUTTON2/MB_DEFBUTTON3/MB_DEFBUTTON4:决定哪一个按钮为缺省 : n3 y0 R E# I7 _* n6 J/ X1 S: h
按钮.缺省为MB_DEFBUTTON1
1 q; G. i r. m9 g图标:
; [0 D+ [# W5 H: YMB_ICONSTOP:显示一个红色X图标
" @! ?9 J3 J+ S" y' d- a, }MB_ICONINFORMATION:最常用的提示图标,一个小写的i 2 _0 f# \! ~2 y$ n
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
) t$ @" e+ o8 w7 ?! _" Y返回值:
$ l o, i, c# g8 ]0 ?IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.
! _' w6 E* Y% H5 S% |; w; L1 Pif(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
* W' ]: k! h$ S JNQUESTION)==IDYES)
0 e$ Y* W# A0 I3 K5 C2 ~2 ]. G6 \{ 7 `" U2 W9 |" U6 S
Close(); g/ ^9 Q" l x1 J3 z9 @# \
}
3 T% q. H: \1 E9 {* o3.void Minimize()
9 q+ d8 N1 R) N" {最小化应用程序的每个窗口和当前显示的窗口
1 o1 o" A- A% r9 c4.void Restore()
' V2 A4 e$ u O+ i: B还原一个最小化的应用程序 ' t( L: [% B4 v5 |% P
5.void Terminate() ; ?/ r- K# u8 a+ Y- R, _) L- @9 m
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
' e; i0 b2 _0 ` l+ |- ]6.void ProcessMessages(void) 1 L' \! G2 @& E6 ]/ n$ Q
常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列 . p; h& |4 @; S- y- M( E- S2 u+ O8 p
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
& h0 U5 {* [+ X' M! Q返回值: / M9 T$ \. M, X7 U( k" C6 f
按钮.缺省为MB_DEFBUTTON1
- Y# \3 Y9 N( v m r* f, {7 y图标:
9 t5 y6 P7 [5 R$ oMB_ICONSTOP:显示一个红色X图标
9 c# S, q3 f! E/ ?, y" c7 XMB_ICONINFORMATION:最常用的提示图标,一个小写的i 7 s- ~) N! G+ f# n
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
' @0 z: K4 t- J m* L0 F6 L返回值:
, I5 D6 }& R' R4 fIDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回. - l& W" Y4 e9 v
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO 6 @* n. W2 ~, E8 g. d, `* x
NQUESTION)==IDYES)
- k- _0 A; Y, U- B9 X& H8 f7 u( x6 C{ 3 Q* N. `* z4 n } F
Close();
* Y( c+ O* ^, E) P' _6 b}
7 \+ u- h8 Z6 H1 k7 |3.void Minimize() ) {% D6 `/ r8 B; c3 o/ X9 ~7 v
最小化应用程序的每个窗口和当前显示的窗口 4 ~( j# l) ^: J1 d2 D9 t: r
4.void Restore() 8 B( u" u' [0 L; g; m
还原一个最小化的应用程序 2 E) Z. y# j9 a' `' s+ e
5.void Terminate()
" G1 O7 S- m: @& @* i' T自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
- e5 Z/ r2 W6 D, X6.void ProcessMessages(void)
8 h0 F# _2 f& ?2 j; h+ \8 R% }常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列 # k3 v9 `& i! y+ w- U' r
中的消息 ! t1 L) s' S- o: y- F/ T
三>事件: 6 P# m9 p! d3 S, a
1.OnHint ! _! a8 R$ m( p% z
当应用程序的提示要显示时的事件.我们也可以将它指向自定义的函数中作特殊的工具提 , ?# ?3 ]& B3 Y0 F6 t) Q5 H
示显示
3 V( \/ o w0 ]* s! S4 O" i例:
7 a5 b H% u, ?" D- Mvoid __fastcall TForm1::FormCreate(TObject *Sender)
' t$ P( k8 i9 i1 W8 \{ ) H2 c1 X, B. O
Application->OnHint = DisplayHint; " ?% g5 e8 d! j% h- l" A
}
7 N' U3 ^! J" q" r, H+ zvoid __fastcall TForm1: isplayHint(TObject *Sender)
- n2 w5 @5 p- {# Z{
: p- g* U: Y" X8 n* L* z TStatusBar1->SimpleText = GetLongHint(Application->Hint); : w: ?4 N* N9 ^1 T9 ]
}
g, S) r7 b& d# C8 i2 e& o& z//一个Hint可以包含由|字符分隔的二部分.GetShortHint是另外一个函数 8 H0 _$ N( _# ]' s
2.OnIdle: s* Y) ~$ P p( D7 [
当应用程序空闲时的事件.通常在这时候作一些不重要的状态检测或处理要求不是很严格 9 K, s* [" G) y7 k
的任务. ( I! x o, D$ u* D
3.OnException:
, t7 p+ _" g/ t/ M( o' E" R当应用程序发生异常时.你也可以自定义一个异常处理过程而不用缺省的ShowException
: U) X: q7 r+ h6 L) v% p3 x: v f j% v$ Y" j2 _4 O* ]
4.OnMinimize # `# p& M: ]* Q
应用程序最小化时的事件
7 }' I3 \" x- k& w/ z9 N( u2 r5.OnActivate: / G1 f+ {6 N% [
应用程序被激活时的事件 ' m+ z! j) b* A( g# b: A
6.OnDeactivate / q/ P4 n% Q3 Y
应用程序失去焦点的事件 ' h9 ^0 I3 v5 q. i
7.OnMessage 8 g. r! S3 A& n* ^- g. o/ j
应用程序接收到消息时的事件.如果你想作特定的消息处理.你可以按管这个事件
2 }+ \8 d# ]3 L/ @% Q: d2 \8.OnRestore
/ n3 q1 U6 X) M& z# |4 v! i应用程序由最小化状态恢复时的事件
* g y/ p# D% u) k; T8 OTApplication应用小技巧:
% A' I' _6 k1 eA.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT 1 Y- E" V( B/ ]- ?2 e2 G6 e4 e4 Y! h
/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的.
+ e3 B( x- J ^ S6 n) F; L3 {AnsiString filepath; 9 q& q, h9 y3 V& S$ |
filepath=ExtractFilePath(Applcation->ExeName); ; X9 w6 D( _7 x$ I3 x! h
//ExtractFilePath与ExtractFileDir是有区别的.表现在ExtractFilePath最后总是有"
4 o# D3 z& R! }5 c- B\\",而ExtractFileDir只是在路径为根目录时最后才是"\\"
1 {6 q. _ L& h/ s! K+ E+ lTable1->DatabaseName=filepath+"data";
' Q; q5 t7 f, r1 t( @0 B# iTable1->TableName="maindb.dbf"; " r7 R' r/ C9 F5 L e+ G
try{ " s( S) X4 k; ~. p8 x, m+ j
Table1->Active=true; 3 b- n. R+ P$ T4 `: N
}
$ J! O; _. z3 `3 {catch(...) 7 g v/ E3 E: p) \: ^; W
{ 7 s7 y' e7 @9 b! Y) ~
//......
8 K4 T3 R" A: g+ Z} 7 y3 i' l9 p& b [( ?; w8 k7 p
另外有一个函数ParamStr(int index)与Application->ExeName有同样效果.ParaStr(0)
& a' v: S/ O3 u; N; e J( E* i就是应用程序命令行第一部分.也就是执行文件的全路径. # U. U) g: c7 M5 B1 O
B.自定义异常处理窗口
( w6 h8 L; L4 ~缺省异常处理窗口是用ShowException显示的一个窗口,其标题为应用程序的Title.我们 2 F) U7 G. p+ F. K: D5 u7 w8 @
也可以自定义异常处理函数,以便对异常进行自定义的处理。
' U- t8 {- \+ R* zvoid __fastcall TForm1::FormCreate(TObject *Sender) + ?$ ?% b$ @4 Z* i+ h
{ # E* E) j5 `3 g1 C% @7 t
Application->OnException = HandleException;
$ Z) d+ F* o# X2 w}
" d( r# W$ y9 F- K) p! U3 Ovoid __fastcall TForm1::HandleException(TObject *Sender,SysUtils::Exception
1 M% s4 J/ \7 D/ @! F*E) ) Y" S$ k0 c, C" A$ V6 \) w
{
" Q3 V+ ^9 x% y0 IAnsiString errorstr="应用程序发生了错误.\n"+E->Message; ; `/ s) y# l, T: B
Application->MessageBox(errorstr.c_str(),"发生异常",MB_OK); ! I, U6 u3 P2 f3 C+ N$ t
}
5 p7 k9 @4 K8 R' t* [) Q: YC.利用OnIdle事件做一些时效要求不严的任务.
7 c: v! V. T; ]! P0 i9 w我们用Timer定时处理一些事务。但Timer是要占一定CPU时间的,对应用程序的执行效率
; m/ R9 v! r$ _7 j: B有一定影响。如果这个要处理的事务并不十分重要.我们就可以放在OnIdle中处理。让应
7 L/ o' |" T! z& v用程序在空闲进处理.
, j3 Q- m! R$ a" A/ b" G6 T8 C# P3 b. g6 [
void __fastcall TForm1::FormCreate(TObject *Sender)
; V5 E$ s [! ?# m% D{ 9 }$ g6 p* D; h. q6 k
Application->OnIdle = updatestatus; , b2 W; M$ k* z& s8 n/ X3 O k
}
& E1 P! G9 b) Gvoid __fastcall TForm1::updatestatus(TObject *Sender,bool &Done)
& P/ }( ^9 R b4 {! w1 @; ?{ 4 o3 [" k" S4 f4 w5 f
StatusBar1->SimpleText=DateTimeToStr(Now());
/ r; m! L& }& z, T1 x: L# W# z} & `8 K, h+ J" ]7 n, F" M
由于C++Builder5已经将Application做到了控件选取面板上。这使得我们对Applicatio 0 T" Q' H5 _* U1 |
n编程比以前方便了不少。以上的方法对cb5以前的版本是很适用的。如果是C++Builder 6 n' D+ q h) M
5,我们也不用这么麻烦地写代码了,直接在Application控件的对应事件中写处理代码 * | j9 D L( E0 q$ m( h
即可. 7 b# a/ p* H2 z$ R8 A) r! [
D.在一个长时间的执行代码之前或之中及时处理其它消息
! H( Z' O% q% j! }+ cForm1->Label1->Caption="开始执行指定任务:"+jobname[0]; 7 ]7 @) @2 V+ K+ I/ d: A" V1 @( w
Application-> rocessMessages();
9 g7 [5 n1 ~# l" P! Mrunjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息 $ W h) e0 y8 T! g' k
|