|
; A' C0 d8 t2 v0 E. s' T
TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一 ; A9 }! \& `* ?/ z+ J/ ^
个名为Application的TApplication类对象.在Project Options的Applcation页中,我们
0 L# d1 a. ^. U# \& }3 ~可以设置这个Application的Title(标题)和Icon(图标).也可以在工程源文件中编辑App ( W% t3 V+ E& X& t& T8 \4 b2 b
lcation的代码. 4 O0 u9 E Y x' J' c6 g4 O
Application对象不是需要经常使用.下面是TApplcation比较常用的方法和属性/事件等
8 X Y3 Q% {1 W, A, T, M。 . J& \, u7 T5 N) Y9 U
一>属性:
& z$ x5 L" h1 s2 f; H1.bool Active:
- a: q. v# E2 q1 k4 B6 w这个属性是一个运行时才有效的只读属性.当应用程序处于激活状态且有焦点时它返回t 3 G" P: V2 q1 j/ _) V$ [. e9 z+ `
rue,否则为false
+ h; C! Q2 S2 X5 t" q2.AnsiString ExeName: 0 e7 a) \) U2 j* j
这是一个常用的属性.它返回应用程序的全路径执行文件名.运行时有效,只读.
. Y2 T% W Y$ i# M" ^8 z/ Y# ^Label1->Caption=ExtractFileName(Applcation->ExeName);//取得执行文件全文件名中 7 V/ i: k, b% a* e
的文件名部分 & ^6 ~& r- `' `3 Y. Q
3.HWND Handle:
9 R$ s1 u# c5 T( ]4 ?! B取得应用程序的窗口句柄.调用API时可能需要.这个句柄是不可见的应用程序的窗口句柄 6 e& L. z5 M! Z* h2 e" x2 L, N
,而不是主窗口的句柄.要取得主窗口句柄,可以用Application->MainForm->Handle.
. I e% ~0 \" L( y/ `4.TColor HintColor:
3 [ Z' k& n Z2 ?8 `" X确定工具提示窗口的颜色.运行时有效 1 `) N1 u Z& F( t6 C
5.int HintHidePause: 2 K7 C- O( y$ H' [0 w; z" E5 S
确定显示工具提示后的工具提示显示持续时间,缺省值为2.5s.
8 J6 d9 t6 u2 Z6.int HintPause:
% w! E* E+ i; w% P9 J! d# S确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为80
. _) y& D( Q$ l) F/ |0ms
+ ]0 y( C% s5 Y5 r8 i7.int HintShortPause:
& D `; ]3 Z! d8 a确定工具提示再次显示之前所需要的等待时间.缺省值为50ms ! y2 l$ Y& E( |/ y6 H
8.TIcon Icon:
5 n, c U4 K2 y5 g$ U应用程序的图标.此Icon出现在应用程序的任务栏窗口按钮上.并作为在文件浏览器中应
5 R) V, n5 e9 X* A+ C& q用程序的图标.一般在Project options中的Applition标签中设定.当然也可以用代码: - E+ g4 G1 P W2 p
Application->Icon->LoadFromFile("e:\\icon\\cb3.ico"); " N Q2 E6 Y' ]2 i# g
9.TForm MainForm:
$ w* T6 l) ]3 a; f6 |应用程序的主窗体.这是一个只读的属性.主窗体就是应用程序最先创建的窗体.可以在P & i0 I( l0 `$ q
roject Options的Forms页中设定.当主窗体被关闭时,应用程序将结束.
) X* d& m* X' V1 {10.AnsiString Hint: 6 u3 G m+ x9 S8 v
应用程序的Hint(工具提示) % d. a. K4 {! q. ?; J
11.bool ShowHint:
6 `! t% h, @& e. G' z2 T是否显示提示 $ I* {" a" E7 p0 E8 Z* p
12.AnsiString Title: 8 V) b3 Q. g$ Z5 s0 }+ W: e
应用程序的标题,它显示在应用程序在任务栏按钮中
( y1 @$ x7 ~5 k3 @" t& x13.bool ShowMainForm;
/ p# w1 W+ r* D+ K8 z9 i4 P是否显示主窗口,缺省为true.当我们想建立一个不显示主窗口的应用程序时,在工程源
& M: n: ^5 l; t8 o: x/ V文件中的Application->Run()之前设定这个属性为false即可.
/ ]. K3 }+ o1 m% l) D6 R14.bool Terminated;
4 z0 D1 ?" E5 N- {检查应用程序是否已收到关闭消息.如果为true,表示应用程序即将关闭.
3 e* V, _/ m7 @, G8 k9 Y二>方法:
# l1 S0 C0 u( k$ I# E% {1.void BringToFront():
`) T& o5 I1 T" W Y8 `9 C将应用程序置于激活状态并且拥有焦点.它将使用应用程序的窗口置于其它应用程序的窗 3 S* \! B' H/ u4 _# W" k; q
口之前. 2 a6 f7 ]6 T1 x8 e
Applcation->BringToFront(); ) [ W5 ^( [5 }% U
2.int MessageBox(char *text,char *caption,int flag); 3 [& i& S3 M) h2 S0 f5 U
这是最常用的方法了.显示一条消息的对话框,可以有一个或多个按钮.它封装了API中的
+ O3 r' V- F2 o9 g) {# ZMessageBox函数.
; e8 R1 ^- I4 Z9 Jtext:消息字符串,可以是多行,多行可以用"\n"隔开.如"你好!\n欢迎使用本程序."
9 C0 {5 b% u! Q! T6 [caption:对话框标题 1 t, f* n' j! ^+ U$ I
flag:决定此对话框形式.常用的如下(位组合,用|) ( U" O( ?. T" w8 d; ] H4 N
按钮,决定对话窗口的基本用途
+ s$ B) m( @ b, pMB_OK:显示一个OK按钮
2 U' J3 o1 P8 E) FMB_YESN显示二个按钮:Yes或No
4 G P8 S3 W9 N& T+ ?( rMB_YESNOCANCEL:显示三个按钮,YES/No/Cancel - p* @% R9 a! G" A9 X
MB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略)
) L* a) q: F" DMB_HELP:显示帮助按钮,当按F1或点按钮时触发Help事件 9 H! n- W+ u7 J! H! K
缺省按钮:
' K8 T$ J, |( D, CMB_DEFBUTTON1/MB_DEFBUTTON2/MB_DEFBUTTON3/MB_DEFBUTTON4:决定哪一个按钮为缺省 ; `: J4 ?7 _$ V* I% m
按钮.缺省为MB_DEFBUTTON1
) w- Y c( U$ O图标: ( ^4 A2 C8 G/ r: k) S6 O
MB_ICONSTOP:显示一个红色X图标 3 {5 J' l/ O& \8 d
MB_ICONINFORMATION:最常用的提示图标,一个小写的i 5 U8 W6 Z n- J7 ]! D9 p
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
* h5 e; |( A& Z- a1 P( p/ \3 w返回值:
, }: |8 @* P0 F& G) q `5 jIDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.
1 a; }# l6 D8 Z! B; `if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
' {) o! D9 ]# U; \9 Q* o1 XNQUESTION)==IDYES)
. O4 u$ L8 T9 a" T{
- S& e. S) H) n i# f( nClose();
7 |) M1 m6 |0 D4 }) C' x}
Z) P1 a2 i7 j( _! i6 p* x3.void Minimize() 9 {7 K& i" w& Z' e' A: W
最小化应用程序的每个窗口和当前显示的窗口 7 `& f3 f; W% l3 _% y: a
4.void Restore()
8 e3 Y8 F! a, u1 n还原一个最小化的应用程序
% A( K' {" t7 p3 z" C" W# |7 B. t5.void Terminate()
5 }4 H% d) O- O/ Z自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
" ^5 @+ \3 c, x7 k* E1 H6.void ProcessMessages(void) " E' A$ @ a4 [
常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列 . T. d& s( P9 V) G4 U: B8 i& |
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 ) r. {0 j. U6 `
返回值: . N# K% Z W3 P* h; e
按钮.缺省为MB_DEFBUTTON1
+ A. c0 w+ K/ O+ h6 k# _图标: + Q2 J! _/ g0 H
MB_ICONSTOP:显示一个红色X图标
8 `0 w, k+ M2 ~MB_ICONINFORMATION:最常用的提示图标,一个小写的i
9 Z7 t; ?7 _4 k7 d* BMB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
e- J2 I' t9 |$ U. v( `$ z返回值: ! R7 ?1 |6 ^) ?1 I
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回. ! t4 ]; o* J- H6 E
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO ' a2 U( s" b. ^4 Q- s- g
NQUESTION)==IDYES)
& L; l( R9 ?% p5 F Q1 H{ 9 n# N& ^. y2 x) P$ M! h
Close(); ; V; J) g% {2 N- F' n' n, }
}
9 L# c6 ~( z/ p. C3.void Minimize() % B* [ }4 z4 R% H* }' l7 h4 j" r
最小化应用程序的每个窗口和当前显示的窗口 ( \7 b/ l7 O t q4 z. e' K! a
4.void Restore()
" `$ d9 P1 t6 t, s: T还原一个最小化的应用程序 / @! j V' [9 e4 V& @: i: u/ h
5.void Terminate() 0 `8 ^9 ~6 m) C' H8 T- |
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
1 E$ ~5 o. Y1 o0 t- l6.void ProcessMessages(void) . |* g" t3 i% E* v
常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
3 g% p: s- o s5 m, l中的消息 . N+ G- z3 [3 A8 a+ r4 J
三>事件: + ]' s+ h6 Q7 R7 ?
1.OnHint
! ?- e& m @' t8 ]+ m当应用程序的提示要显示时的事件.我们也可以将它指向自定义的函数中作特殊的工具提 : C; j. q1 Q- \ g! S4 [( H
示显示 7 `2 |/ N% o* a7 H
例: * Z/ N$ I s, r3 l$ g) L' X
void __fastcall TForm1::FormCreate(TObject *Sender) 3 C/ W0 i" k1 ?
{ , V) d" L$ V5 x! x! p* h% ^7 A
Application->OnHint = DisplayHint; ' F. {) r8 d# @% p
}
% H; o3 y% a1 q9 Evoid __fastcall TForm1: isplayHint(TObject *Sender)
: Q2 w1 _/ D2 a! ?/ B3 ~! e{ 2 O, Z) V- k7 g9 c3 }
StatusBar1->SimpleText = GetLongHint(Application->Hint); 7 A4 z0 \ M( `& }9 Q
} * d$ L: I" A/ D5 W* J
//一个Hint可以包含由|字符分隔的二部分.GetShortHint是另外一个函数
: V& V# }# B" b2.OnIdle: ! X' p9 Z! Z" r3 b2 u) B
当应用程序空闲时的事件.通常在这时候作一些不重要的状态检测或处理要求不是很严格 N8 p: \3 h: d' ?/ y
的任务.
5 j1 k; C8 |% ~1 B5 b g; |( h0 T3.OnException: * g: V# G2 c6 f6 y1 L" X) _( b
当应用程序发生异常时.你也可以自定义一个异常处理过程而不用缺省的ShowException ) g5 w+ f$ M! y' h4 x& x1 i
6 I q0 J" j9 N% X8 _3 j4.OnMinimize 6 l( h' p5 E4 l! y: H v/ U$ i
应用程序最小化时的事件 ! C- \% e+ U; d$ r Q; \' a( ]
5.OnActivate:
" p/ _- m6 d. B0 ^1 r; \应用程序被激活时的事件
' _+ M' f/ O7 w; A6.OnDeactivate
3 i2 b5 B: D, e应用程序失去焦点的事件 : k$ Q( o6 y, b: g" i; I y+ m( X
7.OnMessage * L6 n) N- |& x" f1 F
应用程序接收到消息时的事件.如果你想作特定的消息处理.你可以按管这个事件
# j* G8 B" H1 H; w1 @- P( q8.OnRestore
4 Z- \# z4 b* H, d) ~, ?+ u$ o应用程序由最小化状态恢复时的事件 2 P1 Z4 D9 k& ^6 [2 |2 |7 ?$ V* X
TApplication应用小技巧:
9 ]5 h# q+ Z3 I& \* i) ]7 C& @A.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT
/ q$ H4 V6 I; z/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的. % v# i4 k1 p/ T+ o
AnsiString filepath;
5 a7 S0 M& P% M' vfilepath=ExtractFilePath(Applcation->ExeName); C+ j% P' R% m; Z. c8 g' s' c
//ExtractFilePath与ExtractFileDir是有区别的.表现在ExtractFilePath最后总是有" ! a3 E) I- [, L' |3 R5 ]4 I6 |
\\",而ExtractFileDir只是在路径为根目录时最后才是"\\"
* j" Q4 Q4 {3 X/ j, y* \2 q5 mTable1->DatabaseName=filepath+"data";
8 u- {" G( Y3 }+ @) e9 j- |Table1->TableName="maindb.dbf";
0 @0 Q8 o( l4 v( X6 qtry{
8 j9 d i5 k2 e. J5 ETable1->Active=true; ) Z% h# G2 Q1 n
}
6 D2 ?! Q# g4 P" Rcatch(...)
4 p" J5 H# l+ Z{ 3 g- E. I( H& I. [6 `- o v
//......
# B% `- t2 ? R}
- E3 K* ]. z* R# ]& y, A. X5 g另外有一个函数ParamStr(int index)与Application->ExeName有同样效果.ParaStr(0)
: r% a) ^4 E. L% }6 x) f% U6 [7 P7 z就是应用程序命令行第一部分.也就是执行文件的全路径. # y2 G7 {, N6 g, W# Z
B.自定义异常处理窗口
3 }2 a) w8 J9 G# Q8 |9 _+ J缺省异常处理窗口是用ShowException显示的一个窗口,其标题为应用程序的Title.我们
) }. l- N! |% C# C7 U0 u7 o# ]7 y也可以自定义异常处理函数,以便对异常进行自定义的处理。
+ `' m/ B6 Q( `2 d4 xvoid __fastcall TForm1::FormCreate(TObject *Sender) 4 G8 ~7 {( W( H7 S( r7 o+ N4 K
{
6 |( U! w8 P6 I" GApplication->OnException = HandleException;
3 C0 U# ^: N6 W: L; p9 f}
! V8 Z4 _" `2 Y# c. w% ivoid __fastcall TForm1::HandleException(TObject *Sender,SysUtils::Exception # @ t5 _7 r8 V' h) `! Q7 l
*E) + ], b5 ]0 D, p
{ , U2 d V! ]& n3 f+ \
AnsiString errorstr="应用程序发生了错误.\n"+E->Message;
& D% e% B, }3 x( A, }9 U* c( o6 vApplication->MessageBox(errorstr.c_str(),"发生异常",MB_OK);
, I8 C* s. P( Y3 E0 O+ O1 X}
% [& L! X3 ~8 g2 ?C.利用OnIdle事件做一些时效要求不严的任务. * M8 R! O5 M* o
我们用Timer定时处理一些事务。但Timer是要占一定CPU时间的,对应用程序的执行效率
6 F7 g& o1 d2 T有一定影响。如果这个要处理的事务并不十分重要.我们就可以放在OnIdle中处理。让应
+ o6 R5 Y% ~3 U2 }" u用程序在空闲进处理.
/ K6 @/ n( l! X2 i2 q
% c, i6 B5 u- ^' |, `9 J( n6 q2 svoid __fastcall TForm1::FormCreate(TObject *Sender) . y5 {4 m' O# z( m5 s/ l( {2 F- v8 ?% G0 s
{ ' C/ K8 ]* V' m2 E" I* i7 H
Application->OnIdle = updatestatus;
* p0 B% ^* j( J/ e( K9 q} # M. C M+ i# S! x$ ~
void __fastcall TForm1::updatestatus(TObject *Sender,bool &Done)
5 h4 C/ J" t' r{
3 }5 A7 u$ ]; X* N# {( k9 sStatusBar1->SimpleText=DateTimeToStr(Now()); ! X, k- G0 _, R; B
} Q; y) ?- W+ ? L. O
由于C++Builder5已经将Application做到了控件选取面板上。这使得我们对Applicatio 5 i6 i/ U" }9 g& o
n编程比以前方便了不少。以上的方法对cb5以前的版本是很适用的。如果是C++Builder " m4 S1 g( O( R H! d
5,我们也不用这么麻烦地写代码了,直接在Application控件的对应事件中写处理代码
3 T! n7 P" n7 y即可.
7 U3 \ G! I4 }, GD.在一个长时间的执行代码之前或之中及时处理其它消息
5 \0 e5 j. \4 zForm1->Label1->Caption="开始执行指定任务:"+jobname[0];
z" R1 D# E0 EApplication-> rocessMessages();
/ A' D6 F* J7 ]( |runjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息
& J8 n/ O2 g+ r- T/ b! M |