|
+ j; [, t4 L4 v; S8 J0 F
TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一
$ s ]; Z- K% ]" s( C6 m5 d; i个名为Application的TApplication类对象.在Project Options的Applcation页中,我们 A7 f B# x7 L. K
可以设置这个Application的Title(标题)和Icon(图标).也可以在工程源文件中编辑App % }+ ^' {" g- [4 ], ~! i- t
lcation的代码.
; V1 g! m: e/ [6 GApplication对象不是需要经常使用.下面是TApplcation比较常用的方法和属性/事件等
& G: @5 G4 W5 K# K。 0 ?, ~: S- o* M0 R
一>属性: 3 S- r4 S$ S/ W/ R2 c7 N8 f5 x! S
1.bool Active:
# B; t$ b# K# c* D1 a3 Z W( s这个属性是一个运行时才有效的只读属性.当应用程序处于激活状态且有焦点时它返回t
; c5 g7 r6 w, A; A. n6 @. ~rue,否则为false
: A5 z( l1 A1 F2 ~2 k6 Y2.AnsiString ExeName: % @# t6 S, v) T7 t0 _5 r% ~9 H
这是一个常用的属性.它返回应用程序的全路径执行文件名.运行时有效,只读. / @+ A3 \, l: I8 Y/ J1 {9 V" r
Label1->Caption=ExtractFileName(Applcation->ExeName);//取得执行文件全文件名中
5 R( C0 F) F1 n1 L+ C* Q4 s的文件名部分 4 f6 q# e" h$ D2 r( o: f7 V6 B
3.HWND Handle: % h7 c+ _, Z$ l
取得应用程序的窗口句柄.调用API时可能需要.这个句柄是不可见的应用程序的窗口句柄 4 z; Q" ? T( F# Q
,而不是主窗口的句柄.要取得主窗口句柄,可以用Application->MainForm->Handle.
1 v/ ^1 p9 K& C# ]; U) Z4.TColor HintColor:
5 g; h+ B1 ?8 U! O确定工具提示窗口的颜色.运行时有效
3 w8 x- z& _5 j, A7 E5.int HintHidePause: 6 {2 N- A/ Q- L
确定显示工具提示后的工具提示显示持续时间,缺省值为2.5s.
( A5 W( Q Z4 E& T, C6 A# A6.int HintPause: , e* a( L- X7 R% R
确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为80
; W2 u: p" P: j6 @. ^1 S7 X0ms ! `- p( x$ ^$ O8 Y9 Z2 `3 i. b
7.int HintShortPause: 6 ~& D2 Y K, v) B8 R
确定工具提示再次显示之前所需要的等待时间.缺省值为50ms
% `. U/ J$ Y/ [) C3 o4 s. c8.TIcon Icon: # V+ r& h9 o' ^. G3 U
应用程序的图标.此Icon出现在应用程序的任务栏窗口按钮上.并作为在文件浏览器中应
: C" w5 ]/ T/ g0 f e% T, d用程序的图标.一般在Project options中的Applition标签中设定.当然也可以用代码:
, e4 a; l' _8 K3 ^Application->Icon->LoadFromFile("e:\\icon\\cb3.ico");
9 V' ~+ Y: j8 E+ }9.TForm MainForm: ' g3 z+ X# T0 E( f$ r; a
应用程序的主窗体.这是一个只读的属性.主窗体就是应用程序最先创建的窗体.可以在P / M8 N6 r* O# L# d8 ?5 e
roject Options的Forms页中设定.当主窗体被关闭时,应用程序将结束.
. C, u) b/ a/ X10.AnsiString Hint: 4 q; ?! E7 P2 x. s9 | n
应用程序的Hint(工具提示) * J. q# p% k$ ^! S0 ] W r
11.bool ShowHint: V( A. ^$ e, r
是否显示提示 $ D' C4 r, ^3 T) T5 j, W' t7 ]
12.AnsiString Title: 7 T* ]& D. [6 B, i$ v: b' B; @
应用程序的标题,它显示在应用程序在任务栏按钮中
. z) d# l/ ]3 [- e; }2 \ Y6 i13.bool ShowMainForm;
# |) }( Z, I# z5 |2 f是否显示主窗口,缺省为true.当我们想建立一个不显示主窗口的应用程序时,在工程源
. h* x1 X% k9 S& \8 s$ W/ `文件中的Application->Run()之前设定这个属性为false即可.
* S; e$ j+ U: f7 o( C$ ~& y14.bool Terminated;
: b) @; o7 d$ j+ M, m' o* a检查应用程序是否已收到关闭消息.如果为true,表示应用程序即将关闭.
4 P( X) y( v, A! P二>方法:
C; }) c5 C+ [1 o7 Y3 v. [1.void BringToFront():
5 N8 n! C+ p+ J1 I0 D- \将应用程序置于激活状态并且拥有焦点.它将使用应用程序的窗口置于其它应用程序的窗 : O! ~. Y1 ]6 q" V. @5 H
口之前.
$ z# R6 v$ a2 f9 e% FApplcation->BringToFront(); & G/ w% E2 g0 D+ {8 R4 X3 l" I
2.int MessageBox(char *text,char *caption,int flag);
* c3 G$ T U, M& J$ ^5 h这是最常用的方法了.显示一条消息的对话框,可以有一个或多个按钮.它封装了API中的 , L! R2 m( v8 v) Y& n: z: c6 `
MessageBox函数.
* X$ }" ? q" h$ y/ A% qtext:消息字符串,可以是多行,多行可以用"\n"隔开.如"你好!\n欢迎使用本程序."
) r* k' U' M/ `# N* s* u. _: acaption:对话框标题 4 k; g) P8 G' Z
flag:决定此对话框形式.常用的如下(位组合,用|) 5 S1 V. t, Z6 N+ d$ S
按钮,决定对话窗口的基本用途
! `! T, K8 s) c5 S, a$ u4 uMB_OK:显示一个OK按钮 ' r; l/ e$ F" ^1 u& _& ?7 \. o9 e) @
MB_YESN显示二个按钮:Yes或No
, V3 D2 q( X3 D' N% MMB_YESNOCANCEL:显示三个按钮,YES/No/Cancel
5 r% Q; w3 b$ ]. \MB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略)
* g5 w \) `; p0 B1 ^ X; l9 Z7 I1 y8 H8 tMB_HELP:显示帮助按钮,当按F1或点按钮时触发Help事件 * k9 p( w E; ]1 W7 _
缺省按钮: * i- ]' w' ]4 {- C2 |( m
MB_DEFBUTTON1/MB_DEFBUTTON2/MB_DEFBUTTON3/MB_DEFBUTTON4:决定哪一个按钮为缺省
6 F, b! b. R- P3 b7 n; a按钮.缺省为MB_DEFBUTTON1
4 J+ f( \+ @) J& n图标: 8 a+ ~* X( l8 k. s1 V3 K7 u
MB_ICONSTOP:显示一个红色X图标 C. ~& r+ C' H# o8 { H
MB_ICONINFORMATION:最常用的提示图标,一个小写的i ! t1 j5 a( E2 f9 ?/ l& q' H& T1 k
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
) V' s {) A" m2 I0 P返回值: ) ~. v! ?. `, E. A% W9 ]3 `7 E
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.
; e2 d. N0 @% n/ I# ]. I, yif(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
2 z+ b0 i7 B; Z5 H/ X. I' nNQUESTION)==IDYES)
6 h- A% l1 R1 Z, q{
+ Q. Z! O! B! j! i7 ~1 @Close(); 2 e, T; o2 R9 h U0 U7 E& h2 c+ G$ \
} + H6 o; E4 }8 J, R" @
3.void Minimize()
G0 z6 g# C3 Y! F9 g最小化应用程序的每个窗口和当前显示的窗口
. c/ q6 V% R& |* ], ^+ u4.void Restore() 2 }3 v/ H+ ~) ]+ G. f
还原一个最小化的应用程序
! t$ }) b0 s- ]8 R, y5.void Terminate() , C% x* t4 l, j& p" e
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序 3 I ?' f& w" g4 z" m3 n
6.void ProcessMessages(void) 9 u8 D% U, b, v* T0 L& S
常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
, Q% k: S9 k$ D" rMB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 + N/ F5 I1 m0 k5 n7 x& A0 E
返回值: , [5 x# ~6 k K6 d9 M$ n( ^/ k
按钮.缺省为MB_DEFBUTTON1
3 H) [, i2 b3 d6 r( H: S6 l2 A& d图标: ( p: Q! {! ^. I
MB_ICONSTOP:显示一个红色X图标
# }! O( V, s7 \" [2 s& zMB_ICONINFORMATION:最常用的提示图标,一个小写的i % y! U% j" d! n8 Z" `
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
" Q- [" u# u' f) a/ q( U返回值:
' l- B6 [( @) B! ?1 G h8 I# tIDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回. . `# ~4 F4 N# q
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO 5 ^3 }: d2 w E7 R# o: Q/ C
NQUESTION)==IDYES) 4 \( h7 U1 |( F7 s3 b( ^! ^2 ^9 u
{ $ m9 ^" V* a( i5 V9 _
Close();
" ^6 V. T+ g W' X* U9 B9 L. v} ; V4 M0 Y+ R- z- [
3.void Minimize()
/ C: g) _6 V9 K' k* {- _8 G* `: X最小化应用程序的每个窗口和当前显示的窗口
& d. u% J4 A. g' X: U4.void Restore() 3 V, u7 y4 H; y% _5 G3 f0 O
还原一个最小化的应用程序
z1 e. u# L1 M% i. o) Z5.void Terminate()
" C$ ^; ~- W2 O/ V自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
+ w* G) ]! d- m0 w2 @6.void ProcessMessages(void) + D; V- u5 B8 y
常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
/ x# Q9 N# D6 [7 S& X- c9 S中的消息
4 G0 X% m" U! `三>事件: ; ^# J& l* k, Y# F
1.OnHint
! r- ?6 G" w- X当应用程序的提示要显示时的事件.我们也可以将它指向自定义的函数中作特殊的工具提
2 q6 a, `% H. p5 T: T示显示 2 s8 B; [# j' W/ D. X3 D" o* G
例: 5 N! ^$ t7 f+ r: E7 N
void __fastcall TForm1::FormCreate(TObject *Sender) 9 R- {* [" ~ b1 j! x" w
{ $ M( T: P9 V- R4 P
Application->OnHint = DisplayHint; 2 w0 v. c7 n2 O% Z) ?
} : u7 T7 e/ u! ]" L' n8 v! I+ x1 M
void __fastcall TForm1: isplayHint(TObject *Sender) 3 Y( m. n; f7 j4 [
{
2 D+ `" s: n, a! T7 l' T* k0 J5 ]StatusBar1->SimpleText = GetLongHint(Application->Hint); ; G& r1 D9 m+ r; r7 c
} " l, v2 }! L+ Z$ t% J2 N
//一个Hint可以包含由|字符分隔的二部分.GetShortHint是另外一个函数 + i1 P/ c s T& \
2.OnIdle:
) q( i' R7 ]7 | g0 Z0 B9 u0 B/ i/ A当应用程序空闲时的事件.通常在这时候作一些不重要的状态检测或处理要求不是很严格
5 f+ v& J6 ~* ~的任务.
# @2 k; Y/ L0 `3 O, E. S8 r! _) J( S3.OnException: / S$ w: E/ `* `/ {' x, l
当应用程序发生异常时.你也可以自定义一个异常处理过程而不用缺省的ShowException
, ^3 }- O$ k: S! U+ K6 B: H: L( O $ V! K2 f; q* N& y; t, z, k
4.OnMinimize # b3 N" _1 P$ T8 S! w
应用程序最小化时的事件
3 O, Q6 g& N8 Q9 j; q5.OnActivate: * e* j# T1 f2 g* S+ ]* o% R
应用程序被激活时的事件
) U3 h9 D; Q$ y: V2 M) J; n6.OnDeactivate
- q% y/ W$ R+ }/ Z1 q- T应用程序失去焦点的事件 7 z$ R6 p+ a6 ^ A
7.OnMessage ! N( e- V; W5 l0 o& {- N
应用程序接收到消息时的事件.如果你想作特定的消息处理.你可以按管这个事件
5 m: ?1 f) t. B3 ^. ]8.OnRestore
: O) M; W! {+ O3 Z0 C! s- h% v应用程序由最小化状态恢复时的事件
0 F: ^' V5 x% \TApplication应用小技巧:
, x8 W2 e+ S3 WA.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT
4 N* Z, Y3 Y) I2 a. m+ N1 z% s/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的.
( M" l9 \5 p2 }: G+ e0 LAnsiString filepath;
& E# i0 ]9 N" j4 tfilepath=ExtractFilePath(Applcation->ExeName); 0 a; U( _3 I: f' T
//ExtractFilePath与ExtractFileDir是有区别的.表现在ExtractFilePath最后总是有" 8 C8 r& T% A; m# i* Y0 Y8 n
\\",而ExtractFileDir只是在路径为根目录时最后才是"\\" 0 N- W2 x8 Q6 D* g3 V$ L$ D ]
Table1->DatabaseName=filepath+"data";
0 ?3 O4 s, a% X: v9 u; ~4 `Table1->TableName="maindb.dbf"; 3 r0 D7 G% c7 C+ z
try{
: q. x5 n/ R O! \, PTable1->Active=true;
4 }; S* N h5 i$ B/ V4 o7 x}
I! @; y: q% I+ t% F+ v' Xcatch(...)
# q+ x V: L2 \7 t0 v3 S{ 9 \( f& N9 R0 u$ T' A/ ^2 J2 q. j9 v
//...... ' ~ ^* E5 r& z/ Y( y% ~! R
}
/ ?1 p+ [7 E3 `6 r- z7 W4 H另外有一个函数ParamStr(int index)与Application->ExeName有同样效果.ParaStr(0) 3 A- u9 Q6 H' P# x* x/ X4 x
就是应用程序命令行第一部分.也就是执行文件的全路径.
8 z5 E3 [9 k: t* [7 O" _B.自定义异常处理窗口 & w# D7 q3 a0 l6 K1 N8 q
缺省异常处理窗口是用ShowException显示的一个窗口,其标题为应用程序的Title.我们
# N) g \1 c/ F/ u' z' C也可以自定义异常处理函数,以便对异常进行自定义的处理。
; z: M0 [4 c, e$ fvoid __fastcall TForm1::FormCreate(TObject *Sender) ' B6 x9 U( S, g" ^" a. R
{ * o5 ]/ p P9 i7 i8 [- ?
Application->OnException = HandleException;
6 a, L8 f6 T6 K8 E8 P" u) p} p- Q( C2 @1 U3 v! i
void __fastcall TForm1::HandleException(TObject *Sender,SysUtils::Exception 2 c* e, @1 U& o
*E) # w3 x' P5 X6 E; ^) u& G
{
6 m4 R# N+ e+ Z9 N4 d$ M( T q. FAnsiString errorstr="应用程序发生了错误.\n"+E->Message;
& [+ s1 \. d8 {7 P6 }( a5 W. ]Application->MessageBox(errorstr.c_str(),"发生异常",MB_OK);
9 u7 S2 J% J: ]# Y$ L {8 F}
6 g* c# h. |1 IC.利用OnIdle事件做一些时效要求不严的任务. ! ?1 }1 m5 g: }8 R9 }
我们用Timer定时处理一些事务。但Timer是要占一定CPU时间的,对应用程序的执行效率
6 s% G( A9 O4 Q$ U有一定影响。如果这个要处理的事务并不十分重要.我们就可以放在OnIdle中处理。让应 2 n. R s2 g+ ~2 p& x
用程序在空闲进处理.
# B6 U8 M% Y1 S
1 {1 P7 H: H' K) r* w5 H: Vvoid __fastcall TForm1::FormCreate(TObject *Sender) ) L& }5 r- X9 |$ V0 [
{ + _- |2 \/ v. E, q
Application->OnIdle = updatestatus;
" u% i4 e' ?5 ~7 Y# F t} 8 k5 a" I a$ K; |7 |7 _
void __fastcall TForm1::updatestatus(TObject *Sender,bool &Done)
( F+ c1 o) O1 B2 F5 y% w/ }! k$ K" i{ , A( L0 ]+ G& v
StatusBar1->SimpleText=DateTimeToStr(Now()); 9 c+ }9 R1 Z6 W8 A/ @
}
- t0 _* V% Y& V$ X5 y" e5 j由于C++Builder5已经将Application做到了控件选取面板上。这使得我们对Applicatio
+ A. W0 ~- J. m. f0 Q7 A; ~n编程比以前方便了不少。以上的方法对cb5以前的版本是很适用的。如果是C++Builder
) f4 o$ Y0 B+ A0 {6 w5,我们也不用这么麻烦地写代码了,直接在Application控件的对应事件中写处理代码 / G% T# C% l# V/ l+ |
即可. ) K. @- n$ n: Z% [# D
D.在一个长时间的执行代码之前或之中及时处理其它消息
' J: m* m, X0 F' X" nForm1->Label1->Caption="开始执行指定任务:"+jobname[0]; " a- Z/ v5 `, }- D' j$ E
Application-> rocessMessages();
# h1 F; T5 i- y7 Z+ i' S- U- ^runjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息 + j( X- b& ^8 R \
|