|
$ o6 _: m4 t! d2 [: O( z8 y
TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一
1 Y+ k0 ?8 E8 o6 j, y# g) {3 p个名为Application的TApplication类对象.在Project Options的Applcation页中,我们 _8 ^9 R9 [7 b( g: B3 v" X
可以设置这个Application的Title(标题)和Icon(图标).也可以在工程源文件中编辑App
( B- l i, \1 [$ n& \' nlcation的代码.
# q9 z2 m7 }7 ^+ m1 f: eApplication对象不是需要经常使用.下面是TApplcation比较常用的方法和属性/事件等 : [) W, Q' ]- d! E8 v$ [' y
。
: r# p% @" Q9 b, M一>属性: 6 V1 i |( E' X; ?' o
1.bool Active: 0 k, i6 D$ A4 n) {( R" Y! m' M
这个属性是一个运行时才有效的只读属性.当应用程序处于激活状态且有焦点时它返回t
9 g2 t1 f3 x% |rue,否则为false ) g' E5 C) ?2 K/ J
2.AnsiString ExeName:
& i- N2 x0 I4 F( H这是一个常用的属性.它返回应用程序的全路径执行文件名.运行时有效,只读. 3 q$ Q* y" I6 ~
Label1->Caption=ExtractFileName(Applcation->ExeName);//取得执行文件全文件名中
( q/ r& }* \" ]# q: B的文件名部分
- U W; B6 M9 P) c$ L) R2 b+ R" x3.HWND Handle: " v. L8 M" y, d! o* G9 {
取得应用程序的窗口句柄.调用API时可能需要.这个句柄是不可见的应用程序的窗口句柄
9 O! L! Y9 Q$ f o( D6 E,而不是主窗口的句柄.要取得主窗口句柄,可以用Application->MainForm->Handle. / F8 I" x9 t; I, q+ c8 I( w
4.TColor HintColor:
_, a, |) l* W& a确定工具提示窗口的颜色.运行时有效 r3 q. ^' s6 {( W% x% c" o5 X4 t; O t
5.int HintHidePause:
$ C8 b- V4 Q) W$ [' P ^确定显示工具提示后的工具提示显示持续时间,缺省值为2.5s.
. Z8 G# A, l4 j' F0 L) y6 Z/ K6.int HintPause:
{# H' V$ @4 n确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为80 6 c }, T: k- v' r! B
0ms $ }3 V# ~0 [ D- F
7.int HintShortPause: }6 n. N! w1 f% r% ?
确定工具提示再次显示之前所需要的等待时间.缺省值为50ms
1 m) k8 F* _" K8 R, t& d* K8 q' }8.TIcon Icon: * v& K; k3 l1 p3 t* O3 D7 ^
应用程序的图标.此Icon出现在应用程序的任务栏窗口按钮上.并作为在文件浏览器中应
9 ^, k7 U$ G2 b2 q用程序的图标.一般在Project options中的Applition标签中设定.当然也可以用代码: 4 X$ d5 n" z& G) B$ r: v
Application->Icon->LoadFromFile("e:\\icon\\cb3.ico");
& p# d' r; R( Y/ J# y9.TForm MainForm: : ^6 Q3 S, ?/ L
应用程序的主窗体.这是一个只读的属性.主窗体就是应用程序最先创建的窗体.可以在P 3 t# e1 l0 Y: ~) m' s; Y; i
roject Options的Forms页中设定.当主窗体被关闭时,应用程序将结束.
* U! Q3 J) V+ z+ t9 ]* |10.AnsiString Hint: % z* I: _, ~$ @ i% l
应用程序的Hint(工具提示) 2 G2 y: }3 @6 s" X& v5 d& I+ [
11.bool ShowHint: / X( C0 [: ^9 \% K
是否显示提示 % w# x/ l, P* D, ~' q1 ~ ~
12.AnsiString Title:
& h) S' V7 n2 k( S5 d, D应用程序的标题,它显示在应用程序在任务栏按钮中 * E: h7 L j' l9 T6 i8 w2 T
13.bool ShowMainForm; 8 K8 `0 [6 K) B3 R
是否显示主窗口,缺省为true.当我们想建立一个不显示主窗口的应用程序时,在工程源 ; j5 B* V$ p3 S$ }
文件中的Application->Run()之前设定这个属性为false即可. + d! h% e: n4 @7 q
14.bool Terminated;
8 ~; V' B% a9 Y: q6 H2 W& f6 H" G2 Z# z检查应用程序是否已收到关闭消息.如果为true,表示应用程序即将关闭.
! q2 U! W' d& `! p二>方法:
+ j. n' a4 d5 a8 i2 x: u1.void BringToFront(): # w0 g5 i- [) {/ ]" k5 d
将应用程序置于激活状态并且拥有焦点.它将使用应用程序的窗口置于其它应用程序的窗 / K2 V! T) T# c8 l6 p$ s6 ?) ^% L
口之前. T8 Q0 y3 y- g: _% T
Applcation->BringToFront(); 9 C y% v6 W& b) d* ?$ N0 `
2.int MessageBox(char *text,char *caption,int flag);
' b. }7 P+ ?1 M* N这是最常用的方法了.显示一条消息的对话框,可以有一个或多个按钮.它封装了API中的
6 T& k4 Z6 ~9 |6 q7 W3 W4 `MessageBox函数.
2 q. U4 Y/ Z- e. r4 Ntext:消息字符串,可以是多行,多行可以用"\n"隔开.如"你好!\n欢迎使用本程序."
0 @/ W% d# r$ |% M5 Rcaption:对话框标题 8 U$ V( R, v% m& r& b
flag:决定此对话框形式.常用的如下(位组合,用|) $ y: o% O( Q) h, L; w+ E
按钮,决定对话窗口的基本用途 % e5 O8 P' U* {* a
MB_OK:显示一个OK按钮
, o1 P# Y# _6 H6 ^% [0 yMB_YESN显示二个按钮:Yes或No 8 Z, |* j! \8 ?8 u8 o9 u1 m. m* i; @
MB_YESNOCANCEL:显示三个按钮,YES/No/Cancel & A1 N8 c, h E w! P2 M" d4 [ C2 o
MB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略)
0 f3 e, A O0 V6 p/ K, I' K! u* \MB_HELP:显示帮助按钮,当按F1或点按钮时触发Help事件 3 l) _- P" D" a3 k6 `
缺省按钮: 5 C( ]2 l `; }$ f3 n# c$ k f2 |
MB_DEFBUTTON1/MB_DEFBUTTON2/MB_DEFBUTTON3/MB_DEFBUTTON4:决定哪一个按钮为缺省 7 H6 D% P# q- f2 |, p( Z
按钮.缺省为MB_DEFBUTTON1 6 j7 g; F" Y* }+ N- m! {9 p& W
图标: ! G. Y0 @: Y r% S9 O- n$ _
MB_ICONSTOP:显示一个红色X图标
, n E: V5 A) P! G+ b# ?: r5 WMB_ICONINFORMATION:最常用的提示图标,一个小写的i ! s0 K' c- f' u/ ^$ U! O& j& E) d9 f
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 6 H2 N: T/ k. @/ c+ _
返回值:
. u5 d* `/ I" d" R; w EIDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回. 0 b7 O+ ]4 X( S# f! J3 R
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO . M8 K" k2 R% @) y! O" @9 Q: V4 i
NQUESTION)==IDYES)
5 }9 f( T! M* O7 } o- r{ , K0 A. a+ R: ] ~/ f4 W5 i
Close();
- P: W( `4 d% D7 }}
5 z) a" Y" [: B7 o# a6 s3.void Minimize()
5 m9 ~1 h+ x- U1 k最小化应用程序的每个窗口和当前显示的窗口 / L# R. L7 s7 ~
4.void Restore() 3 P7 B' b( F% V+ I
还原一个最小化的应用程序
4 O! G. Z( `2 {8 h5.void Terminate()
6 N2 \) [) p' k9 |自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
; _" E9 e3 H% J, A. o- q8 I# K6.void ProcessMessages(void)
# L2 @6 Y9 e/ T2 ~. S* @$ C常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列 Z; V7 m. z! ]9 v6 A2 x E
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 # V8 e4 B! S W3 e# h* D3 |$ D
返回值: 8 M; e( ~/ e0 \: Y: u3 T! i
按钮.缺省为MB_DEFBUTTON1
. @+ B v6 l" x# w: N图标: / `2 b* {: S/ b5 U" k
MB_ICONSTOP:显示一个红色X图标 6 e* R% u1 W! J; c' P: J
MB_ICONINFORMATION:最常用的提示图标,一个小写的i
' {, X! q4 I# Z) T6 OMB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 # f8 Q/ B5 ~6 c V& t
返回值: ( ^ r8 ]1 z, p/ L
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.
5 w( ?9 Q' u: z. D, oif(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
9 Z5 Q/ I- [9 Q5 V7 `: b% ?8 QNQUESTION)==IDYES) " ~2 x; |6 C8 M( s8 x; h4 }
{
, o4 F6 {" V+ \5 n7 x. TClose();
: b: \: Z1 W# @; u* }: g1 u0 s$ m}
8 a3 N0 O( i" w/ j* q# n1 f; q S3.void Minimize()
. {9 r! I6 s6 p3 M# f# x最小化应用程序的每个窗口和当前显示的窗口 & O) y- H' x4 k2 D# S. O
4.void Restore() % v# k& t* v( G! i* E: Q
还原一个最小化的应用程序 k2 R: J! M+ W9 ]' D" f
5.void Terminate() ' h4 m7 A! Z* Y$ y
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
# U) j: y( x- M6.void ProcessMessages(void) ; N! a3 p/ r f
常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
3 |: m! o$ e: v) z# {中的消息 5 l2 Z a, M+ u m- D/ Z- z
三>事件: 5 g# L. F6 Z7 J/ R
1.OnHint ! h! Y: b- x8 E; Y# ~& e. c% P
当应用程序的提示要显示时的事件.我们也可以将它指向自定义的函数中作特殊的工具提
7 l3 x3 `. v) h1 ^. m4 g. H }示显示
- q2 w- _( x5 K/ ^/ F& M& {4 v- |例: . U6 }7 ]% x2 f+ t
void __fastcall TForm1::FormCreate(TObject *Sender)
" y7 O/ I8 q6 K0 w+ q, A{ # s; h x- A' [0 W# c, j
Application->OnHint = DisplayHint;
& e9 \) R4 I5 ?/ R5 w; \} ! u. _0 N; `/ [! x
void __fastcall TForm1: isplayHint(TObject *Sender) & r2 q5 R& o* L" D L
{ 8 X6 P. N2 {6 X Y6 f& [5 ?; o: I
StatusBar1->SimpleText = GetLongHint(Application->Hint); 6 l7 G* e) ]- h; \
} + p: j, J b$ | O7 O
//一个Hint可以包含由|字符分隔的二部分.GetShortHint是另外一个函数
: ?: j. X: j2 n5 ]2.OnIdle:
$ o: e( \( |' `0 n$ O当应用程序空闲时的事件.通常在这时候作一些不重要的状态检测或处理要求不是很严格 $ d' b; O2 I' q8 z$ [2 a. y) Z x
的任务. 7 z+ X7 d8 k2 i0 A( B6 n8 g0 I
3.OnException: 5 V- N6 ^0 a2 a% E# J8 v
当应用程序发生异常时.你也可以自定义一个异常处理过程而不用缺省的ShowException
7 W' d( y) F' S( }6 F
$ f% `6 H8 G" g4 j+ b1 c" C4.OnMinimize
+ C6 {4 b6 Z5 Z% \- i应用程序最小化时的事件
* i' z% o7 K3 W5.OnActivate:
) y6 I T* O! N" M0 m' r; B应用程序被激活时的事件 # q2 z* p3 `& i, g; v+ k
6.OnDeactivate
# v& u5 m5 v9 ^! | t5 ?应用程序失去焦点的事件 : ~) k3 t" M: @! c$ K
7.OnMessage
+ `4 W4 R# }) V' I应用程序接收到消息时的事件.如果你想作特定的消息处理.你可以按管这个事件 6 h' P) s" c! t9 |
8.OnRestore
7 n) y2 h# N* [+ }* ]应用程序由最小化状态恢复时的事件 + [3 Z$ i' r4 J# l% d9 |+ C4 ^
TApplication应用小技巧: , Y+ n; h" ~7 Q, n+ ?+ L# g
A.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT / W6 \+ p' {" ~8 z- w! i; ]. O
/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的.
5 J1 d- w' _/ l8 g+ a# D% r4 u- MAnsiString filepath;
" c- T, n' U$ ^9 h$ p+ ofilepath=ExtractFilePath(Applcation->ExeName);
; l0 P6 u2 h" w//ExtractFilePath与ExtractFileDir是有区别的.表现在ExtractFilePath最后总是有" ( S( e& L' r" L* g" ]6 A) b
\\",而ExtractFileDir只是在路径为根目录时最后才是"\\"
+ z9 B/ r2 r% r' [Table1->DatabaseName=filepath+"data";
{+ o/ G6 m; D# k7 l5 `7 |0 T1 C ZTable1->TableName="maindb.dbf"; ! v1 Q5 e8 F+ {- M7 J- Y
try{
8 O: @* a. d" o5 K- Y3 ZTable1->Active=true; ; @9 M4 U% g+ \ I) d A
}
V, P+ K" ?: k% _! Dcatch(...) " K" K' e; D4 B6 \0 I! z
{ 5 n: Z( q/ L$ L6 g
//...... ) F; K/ J" h4 k( c7 H+ B
}
( _7 t$ |0 a( g1 o, C另外有一个函数ParamStr(int index)与Application->ExeName有同样效果.ParaStr(0)
: y, G: `2 N! M0 C' w就是应用程序命令行第一部分.也就是执行文件的全路径. & O4 Z# d2 H7 _9 k% S. g$ m+ ]. z$ p
B.自定义异常处理窗口
+ C3 G3 G9 ]& Q缺省异常处理窗口是用ShowException显示的一个窗口,其标题为应用程序的Title.我们 }7 t2 e& y) c. C* ] i: b
也可以自定义异常处理函数,以便对异常进行自定义的处理。 , L, t7 U/ z) k
void __fastcall TForm1::FormCreate(TObject *Sender) m+ K# k! W, j8 R
{ / f9 n/ E+ h1 k$ k3 ^9 f9 H
Application->OnException = HandleException; 6 t: M8 u( P) j! a3 D$ Q0 n
} . }2 m. n; v6 T3 c
void __fastcall TForm1::HandleException(TObject *Sender,SysUtils::Exception ' u) ]& _% ]; x: e1 {2 E
*E) + k6 F O4 |, L% p+ ^ A
{
( ]9 v* ~! e* u# oAnsiString errorstr="应用程序发生了错误.\n"+E->Message; 2 w8 O; ]$ X$ k3 O4 k
Application->MessageBox(errorstr.c_str(),"发生异常",MB_OK);
9 s5 x1 g: Z& }$ h} , W7 H9 I% h/ ]" c/ Y
C.利用OnIdle事件做一些时效要求不严的任务.
3 w) {- Z9 J% H/ h8 d我们用Timer定时处理一些事务。但Timer是要占一定CPU时间的,对应用程序的执行效率 8 \. i" S. b: F4 x+ ?# D- U
有一定影响。如果这个要处理的事务并不十分重要.我们就可以放在OnIdle中处理。让应
2 ]0 k6 w& v/ E0 n用程序在空闲进处理. : J4 [" E! N9 C) X6 A9 L4 }
3 N6 u4 x0 s/ B5 K* {5 Xvoid __fastcall TForm1::FormCreate(TObject *Sender) / y, V7 s5 C' s8 _4 X. l. d9 b3 T
{
0 j$ ^2 M7 f3 u1 o0 j: O' q7 ZApplication->OnIdle = updatestatus; + P$ b9 z, J0 j( _ }* t
} 4 [) f7 _3 I' k1 e
void __fastcall TForm1::updatestatus(TObject *Sender,bool &Done) + h+ B; ]4 H/ H& d5 i A, A
{
4 I6 {# h: d- Z' {StatusBar1->SimpleText=DateTimeToStr(Now()); $ o6 J3 P% ^% W9 _% j
}
$ b6 k6 \$ i4 b! A( I7 a3 A" W由于C++Builder5已经将Application做到了控件选取面板上。这使得我们对Applicatio + L- A) w. a0 T
n编程比以前方便了不少。以上的方法对cb5以前的版本是很适用的。如果是C++Builder 2 u1 p! O2 l. [# p
5,我们也不用这么麻烦地写代码了,直接在Application控件的对应事件中写处理代码
( _* o5 t0 e/ N3 y: e: _! L. |即可. 2 E F( U; \9 ^
D.在一个长时间的执行代码之前或之中及时处理其它消息
, \, `. x* m& v# C+ G; }Form1->Label1->Caption="开始执行指定任务:"+jobname[0];
$ e" C1 ^) E+ Y1 ^/ iApplication-> rocessMessages(); ( b- H- ~' r, o Q- }4 j& |
runjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息
& q! U$ _! T. e+ N8 q" k |