|
5 f/ |" O8 x( H! ]
TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一
7 R0 f Q! U/ [' q W7 E个名为Application的TApplication类对象.在Project Options的Applcation页中,我们
- k5 Q5 l9 n; t! x) C6 X( W可以设置这个Application的Title(标题)和Icon(图标).也可以在工程源文件中编辑App * }1 ]! A' G* D
lcation的代码.
/ s4 ?+ G( r' U+ f! f* {) M4 @6 UApplication对象不是需要经常使用.下面是TApplcation比较常用的方法和属性/事件等
0 ?$ _: X e% }/ b* ~. h. k。
8 }, U4 l, x3 ^一>属性: * C/ L3 A# R6 A2 y6 G
1.bool Active:
$ U) H& s$ a$ n3 e/ g这个属性是一个运行时才有效的只读属性.当应用程序处于激活状态且有焦点时它返回t % {6 ?3 P$ }8 |
rue,否则为false 7 t9 _2 Y. J# k. m' M* I# a& j( v5 G
2.AnsiString ExeName:
! Q, ?# j3 u* c* q! n) h这是一个常用的属性.它返回应用程序的全路径执行文件名.运行时有效,只读. ( p8 D! P4 L6 V9 Y$ d3 x+ F
Label1->Caption=ExtractFileName(Applcation->ExeName);//取得执行文件全文件名中 9 u4 ] f c" P# C
的文件名部分 0 V, @7 R4 z: I8 D' _
3.HWND Handle: * r- Y B" S% _9 P
取得应用程序的窗口句柄.调用API时可能需要.这个句柄是不可见的应用程序的窗口句柄 # @0 C* v+ i6 t4 `' {* N
,而不是主窗口的句柄.要取得主窗口句柄,可以用Application->MainForm->Handle. 7 Q9 T( W% e7 j# d3 A! S6 Q
4.TColor HintColor:
0 S0 \& Q7 f3 O5 x确定工具提示窗口的颜色.运行时有效
$ F _6 ~! h8 @. |; w) C5.int HintHidePause:
" n% A& C9 b/ [5 H确定显示工具提示后的工具提示显示持续时间,缺省值为2.5s.
1 y* U! h# U5 f6.int HintPause: 7 B) d2 C6 L# \+ f* P0 n# `
确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为80 . S$ h, Y5 W e. ?2 L( V0 h5 Y4 G! n
0ms % S4 x4 }9 [, ~* ~1 b5 Z0 s# C
7.int HintShortPause: + O) m2 v. P+ s/ [
确定工具提示再次显示之前所需要的等待时间.缺省值为50ms $ a! s1 f d. H
8.TIcon Icon: ) V9 [5 H# i( \1 {/ A8 ~
应用程序的图标.此Icon出现在应用程序的任务栏窗口按钮上.并作为在文件浏览器中应
0 s& c. X' N) O# t" c' K$ s用程序的图标.一般在Project options中的Applition标签中设定.当然也可以用代码:
" \9 W: a' K7 a% h1 n0 ?4 O3 }Application->Icon->LoadFromFile("e:\\icon\\cb3.ico");
3 d7 k) z! I1 _4 ^9.TForm MainForm: 2 t. h0 u- f: \# \/ C; \! O3 f
应用程序的主窗体.这是一个只读的属性.主窗体就是应用程序最先创建的窗体.可以在P & l" @5 N0 s- C& e a4 `
roject Options的Forms页中设定.当主窗体被关闭时,应用程序将结束. 8 }3 o6 ^% D" D- v* v* |! |
10.AnsiString Hint:
4 W- o* N: U' `0 D- Z应用程序的Hint(工具提示) " m2 \# j- U1 k/ d6 y
11.bool ShowHint: 4 v3 z: G; M$ ?% A- _ w
是否显示提示
& n' F, V3 \/ A! ]4 @0 ~7 ~2 i2 @0 \3 K' O12.AnsiString Title:
: L9 g: k/ }( K6 R. ^应用程序的标题,它显示在应用程序在任务栏按钮中
: W5 `# x' F: w7 {' S13.bool ShowMainForm;
2 ]$ T) t, F4 T) C5 Z( d6 u* o是否显示主窗口,缺省为true.当我们想建立一个不显示主窗口的应用程序时,在工程源
% S2 R" I! m2 ]: ^4 X$ q" |+ N文件中的Application->Run()之前设定这个属性为false即可. " C% E7 y$ B9 ]+ g/ C
14.bool Terminated;
, w, }% _! \# h) m+ H [$ G9 @& n4 z检查应用程序是否已收到关闭消息.如果为true,表示应用程序即将关闭. + F6 z; s7 X: H1 p v. m
二>方法: 9 s: |7 ], `' G: O* a' ]
1.void BringToFront(): / y2 L& {# x& j- Q
将应用程序置于激活状态并且拥有焦点.它将使用应用程序的窗口置于其它应用程序的窗
) d4 v1 W- J, z& W( K2 r! M! F1 K口之前.
9 ~; b( d6 Q: t( n2 m- `# ZApplcation->BringToFront(); * T0 }* O0 H0 h: _
2.int MessageBox(char *text,char *caption,int flag);
$ g3 F5 T6 u4 z4 q4 l这是最常用的方法了.显示一条消息的对话框,可以有一个或多个按钮.它封装了API中的 7 Y% V" U7 I+ k: ], L) O' L0 p
MessageBox函数. * w/ _" R( l9 R* K. j+ j5 @$ w
text:消息字符串,可以是多行,多行可以用"\n"隔开.如"你好!\n欢迎使用本程序." 9 q& L( g6 K6 Q( y
caption:对话框标题 8 \' X- Z" r# h1 Y5 Q3 p# M8 u
flag:决定此对话框形式.常用的如下(位组合,用|)
! j9 |3 ?! W* w; K. J9 n按钮,决定对话窗口的基本用途
; i0 j) _3 ?" b# Y6 M* F; hMB_OK:显示一个OK按钮
% z2 F0 v4 E% V) ~8 Q, c. XMB_YESN显示二个按钮:Yes或No
* P" m# |# ?3 ^4 |9 ~) F5 AMB_YESNOCANCEL:显示三个按钮,YES/No/Cancel
3 D3 t. P. _- y- y1 rMB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略)
0 X# G' ]) ]9 ?; U3 H7 fMB_HELP:显示帮助按钮,当按F1或点按钮时触发Help事件
9 E: }, {* ~- y+ O* c缺省按钮: ( A: p$ E! s9 U( G+ V4 B
MB_DEFBUTTON1/MB_DEFBUTTON2/MB_DEFBUTTON3/MB_DEFBUTTON4:决定哪一个按钮为缺省 `9 S* ^% `" [0 o# A
按钮.缺省为MB_DEFBUTTON1
. T. B$ b+ e+ S" l7 N) L: z: y图标:
" E; h1 F6 F6 g8 D1 kMB_ICONSTOP:显示一个红色X图标
: ^" e: d' d9 V5 r) X+ CMB_ICONINFORMATION:最常用的提示图标,一个小写的i 2 ~" \5 V- @" W* M2 ^5 L9 V, q3 S
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
3 i: \: {8 n; d' Y" o; I6 t返回值: ! I* ~ E3 r; C( R9 Z2 b3 m
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回. % H4 k7 }7 t4 Q; F8 V$ h
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
" a& o% B. B1 a r4 K; WNQUESTION)==IDYES)
2 j9 Y# S( C7 D# A+ l' N8 S{
( U1 m/ E- T) e! s r. f2 N2 b6 j% j5 O* uClose();
( A: x [# m1 R" e5 i} 3 r$ V8 m3 U" t1 I6 T& `
3.void Minimize() ( @' N1 y% F- A/ c$ u. ?
最小化应用程序的每个窗口和当前显示的窗口
0 u2 [7 v3 }1 e0 N7 R. z* z. w4.void Restore()
Q3 D* m* K& O5 }# C还原一个最小化的应用程序
/ D! h& N) k" U$ q. B, e5.void Terminate() 7 G' M# }$ `- u+ w0 e7 n# l* i5 x$ T8 u
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序 8 | i* f6 b6 i* p5 w6 \
6.void ProcessMessages(void)
4 C3 y/ c9 v% M: a: N% R# N常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
( s4 P" X1 }( R* ?6 g0 d2 {) pMB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 . \* {" c; R* n
返回值:
. M# ?( F- ^; ?7 p' C6 X6 ]$ k! |按钮.缺省为MB_DEFBUTTON1
i! V R; M6 ?: k7 r3 I1 p! j6 H/ [图标: ) y9 n9 B- u; B: J2 d' s) s1 P
MB_ICONSTOP:显示一个红色X图标 2 Z4 l. s0 y! l
MB_ICONINFORMATION:最常用的提示图标,一个小写的i
, [9 U- V; @8 L: w' rMB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
) R2 i4 X1 Z2 ]2 U) ?返回值: / E0 Z3 N( M8 ?$ Y' p( _0 y
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.
7 U$ S" S% H' f2 h! |# Fif(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
2 z: [+ D3 ]/ p6 h+ }NQUESTION)==IDYES) & Z2 {' }# I" y
{ * n$ ?% y! j/ x6 c5 ?# v
Close();
# b/ R- R& l3 A# o5 o} 2 [4 f- [7 O' k8 @- O; d
3.void Minimize()
/ W8 l% B1 r* _最小化应用程序的每个窗口和当前显示的窗口
0 G) L9 W4 { y5 z3 N2 F6 B$ w4.void Restore()
" C Q$ Z$ [! I% q还原一个最小化的应用程序
6 q$ L5 I7 x1 x5.void Terminate()
; v% g! ^( [( g# ^6 Z3 Q自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序 $ o1 P, I# ], p% |; M! T
6.void ProcessMessages(void)
/ C1 Y3 d9 k) G' y常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
, D/ ` t4 G4 f( s5 I- L* `中的消息 2 H! H& Q7 c0 w: g) M
三>事件: 9 C% }. w) B* V" T
1.OnHint
* J( Q1 E& Q( i9 ]- [6 w当应用程序的提示要显示时的事件.我们也可以将它指向自定义的函数中作特殊的工具提 # |+ J9 z1 P3 f# Y9 b
示显示
/ J$ m% H4 U; y例:
6 ]# F6 N3 M* L7 @1 ?; F/ Nvoid __fastcall TForm1::FormCreate(TObject *Sender)
1 E! [5 {# L1 I0 R{ 9 {2 u$ m: L2 I. w
Application->OnHint = DisplayHint;
) c0 n( s9 |; N- _) y}
3 U# `; z4 h8 S0 p7 ~$ K, ~void __fastcall TForm1: isplayHint(TObject *Sender)
, i, f: ^8 @1 p; n4 p{ 5 e' w; I9 G2 v) K
StatusBar1->SimpleText = GetLongHint(Application->Hint);
. Z# N8 R) G5 y}
: Q9 y0 F" {3 e6 f5 \//一个Hint可以包含由|字符分隔的二部分.GetShortHint是另外一个函数
& m A' D. A( U9 F ^2.OnIdle: 9 o' m; \: d3 G
当应用程序空闲时的事件.通常在这时候作一些不重要的状态检测或处理要求不是很严格 5 `5 r4 T+ A6 d
的任务.
, U }- I% q% |3.OnException:
* _! ]& `' y7 T5 u9 V当应用程序发生异常时.你也可以自定义一个异常处理过程而不用缺省的ShowException
7 Z' X4 U) X% n% X4 y4 e ^0 B/ N2 _9 O' E) k- }
4.OnMinimize
6 s( z) ?) a: E$ _# t$ h应用程序最小化时的事件
1 @) [6 ~5 O" \1 T( N4 M5.OnActivate:
! B8 f P* F8 Q: }& I应用程序被激活时的事件 4 E$ {, U$ k" K5 i, Q
6.OnDeactivate ; g$ n' Z) P7 Q2 {) m
应用程序失去焦点的事件 * c- K' P1 ~" G" [0 h. E
7.OnMessage $ b: `+ {: ]: ~' h
应用程序接收到消息时的事件.如果你想作特定的消息处理.你可以按管这个事件
# N" s. t, ?6 ~" |1 Q, z3 y8.OnRestore
3 j6 Q' ]/ w" k) g% \& ?应用程序由最小化状态恢复时的事件
. _* i$ e# S* }- ~TApplication应用小技巧:
$ G4 ]; D* i* z9 y! D; D; t4 pA.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT
) C6 X8 ^# q9 ?6 \/ R/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的.
1 G6 U0 W. ~7 `AnsiString filepath;
6 q& C( D. R2 V, ?filepath=ExtractFilePath(Applcation->ExeName); ' u q/ Y7 M1 ^% e6 p6 i
//ExtractFilePath与ExtractFileDir是有区别的.表现在ExtractFilePath最后总是有"
; g3 X( k, q* f9 S' X\\",而ExtractFileDir只是在路径为根目录时最后才是"\\"
6 P. d/ J! q# z& [( c% M+ w! g; |5 \Table1->DatabaseName=filepath+"data";
7 s1 e4 ~3 H! H5 C. ?2 [Table1->TableName="maindb.dbf"; 8 Y( J! w I$ {% e: R( L
try{ / |& }( J V, E% [% S1 D4 z
Table1->Active=true; 4 l% Z- n$ h: _" R: E; L
}
: q: f7 E2 ?/ w( R" Zcatch(...) 4 _- k. Z$ A! g, k
{
/ [/ A7 G, S4 k ]. M, q$ N//...... 0 E! r( D/ @6 O b: W6 T3 p
}
~2 m0 N+ d( T0 Y3 E4 D- K/ \+ _ x8 n另外有一个函数ParamStr(int index)与Application->ExeName有同样效果.ParaStr(0) $ @* K' u, a/ t6 Y
就是应用程序命令行第一部分.也就是执行文件的全路径.
' A9 Y6 l# }" C3 X, o8 \3 HB.自定义异常处理窗口
6 c7 q4 R- Y7 l2 Q) O2 r缺省异常处理窗口是用ShowException显示的一个窗口,其标题为应用程序的Title.我们
( Z8 g- I, h6 |' K( Y+ Z) F也可以自定义异常处理函数,以便对异常进行自定义的处理。 ) i8 O6 e8 j" M
void __fastcall TForm1::FormCreate(TObject *Sender)
9 Z/ v2 g4 d0 n9 ]2 a7 g& H{
0 L9 j2 @8 O: Y) x; i& m% aApplication->OnException = HandleException;
8 l4 A: `! d6 w/ }}
7 n/ J% v* d0 n/ [" n0 M$ rvoid __fastcall TForm1::HandleException(TObject *Sender,SysUtils::Exception
+ K! f: o8 u$ _*E) ; `0 h* m, t1 T0 }) P( w+ B
{ , B- F* f; F+ o) v$ E
AnsiString errorstr="应用程序发生了错误.\n"+E->Message; 6 r7 q$ k9 c Q$ @1 @) ?
Application->MessageBox(errorstr.c_str(),"发生异常",MB_OK);
9 {3 }8 ~, g k3 `' b} 8 r/ s& g L& D! c
C.利用OnIdle事件做一些时效要求不严的任务.
; K; @8 j* h' p我们用Timer定时处理一些事务。但Timer是要占一定CPU时间的,对应用程序的执行效率 4 d1 X/ I9 i( Q4 C& w
有一定影响。如果这个要处理的事务并不十分重要.我们就可以放在OnIdle中处理。让应 - x, Q8 a3 n) X' ?& a
用程序在空闲进处理.
1 ]) y# g J }
0 Z( \1 K3 l8 K. Hvoid __fastcall TForm1::FormCreate(TObject *Sender) $ x5 u$ U) Z5 l$ H$ L
{
/ {$ M5 f# I1 Q, e3 aApplication->OnIdle = updatestatus; " q6 V6 ]3 E/ }5 n6 r5 B+ v
} ; L; o# o6 p0 T8 C
void __fastcall TForm1::updatestatus(TObject *Sender,bool &Done)
0 s+ l$ J- P! X; y: W f9 F{ 8 M+ t. i, v: C
StatusBar1->SimpleText=DateTimeToStr(Now()); ' v; n; Z; q( B. B1 {
} - {. s& {' _: u+ S W
由于C++Builder5已经将Application做到了控件选取面板上。这使得我们对Applicatio ; n1 J4 U3 S$ k' t; Z
n编程比以前方便了不少。以上的方法对cb5以前的版本是很适用的。如果是C++Builder
& N9 L: g Z$ T+ W9 P! Y5,我们也不用这么麻烦地写代码了,直接在Application控件的对应事件中写处理代码
$ O( B1 z$ ~$ N7 g5 P3 R: ~即可.
9 I' I' u* n* GD.在一个长时间的执行代码之前或之中及时处理其它消息 , _8 V) F+ A* \5 }0 Z
Form1->Label1->Caption="开始执行指定任务:"+jobname[0];
" `( \+ t3 ~8 lApplication-> rocessMessages();
, e; S; h) v: B0 xrunjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息
! _: y# `* }1 L" C# H |