|
8 _8 Z! J$ @2 p+ UTApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一 - x4 t: A. k n- l5 `0 l! R7 v) ?
个名为Application的TApplication类对象.在Project Options的Applcation页中,我们 " @9 L$ p" j6 X: m% {) T
可以设置这个Application的Title(标题)和Icon(图标).也可以在工程源文件中编辑App 5 s. u+ _/ w) X. @# c
lcation的代码.
# B8 b+ ?7 P* j5 z, FApplication对象不是需要经常使用.下面是TApplcation比较常用的方法和属性/事件等 4 F0 g' R M/ ~7 e0 l; w
。 + R1 C3 d) h& t* r6 v
一>属性: " l, [8 P6 ?8 L6 j
1.bool Active: $ V0 w& ^( l1 J4 K- k
这个属性是一个运行时才有效的只读属性.当应用程序处于激活状态且有焦点时它返回t / H7 k! s* K, r4 h2 C7 F/ k
rue,否则为false
" J) N% ^! i8 ?, g. m* ^+ \2 r2.AnsiString ExeName: ) u6 f" N7 I1 T8 V9 X+ O1 I* j" k
这是一个常用的属性.它返回应用程序的全路径执行文件名.运行时有效,只读.
; p+ x$ j% r7 O5 I: i, yLabel1->Caption=ExtractFileName(Applcation->ExeName);//取得执行文件全文件名中 : v4 P6 H9 p; Y" [" y2 D1 V
的文件名部分
: W, }" e8 g5 g0 ^$ o k( H( L/ J3.HWND Handle:
/ o0 O. t, P6 ]. d/ X取得应用程序的窗口句柄.调用API时可能需要.这个句柄是不可见的应用程序的窗口句柄
6 T" g% J C$ A$ e,而不是主窗口的句柄.要取得主窗口句柄,可以用Application->MainForm->Handle. * x% A" x7 B% m% n8 j, G0 G& G
4.TColor HintColor:
1 i( j* E( d4 W& t: C0 s确定工具提示窗口的颜色.运行时有效 % {# ?# }) t) V; [) \
5.int HintHidePause: 2 J8 f; c; r8 p# h& h7 D
确定显示工具提示后的工具提示显示持续时间,缺省值为2.5s.
# J9 S/ P2 }( i5 K/ i" X* [6.int HintPause: , a$ S" e3 }" o/ Q) C3 s& k
确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为80
6 K+ F4 R4 B/ t. e" g7 K( ]0ms * l/ M+ R* \( ]/ m
7.int HintShortPause: % c/ {8 w6 v* d8 e9 p w
确定工具提示再次显示之前所需要的等待时间.缺省值为50ms
# A ^& ]/ ]3 R2 O8.TIcon Icon: 3 h! z9 e! G+ L- N; R0 @: ]) B
应用程序的图标.此Icon出现在应用程序的任务栏窗口按钮上.并作为在文件浏览器中应
4 g( Y' H- I& X( e1 S) l用程序的图标.一般在Project options中的Applition标签中设定.当然也可以用代码:
9 w) ]* U3 V% Q6 ?& [7 o! C& uApplication->Icon->LoadFromFile("e:\\icon\\cb3.ico");
- U2 o- ?8 ^( i: i9.TForm MainForm: 1 i$ H6 T( c+ Y J
应用程序的主窗体.这是一个只读的属性.主窗体就是应用程序最先创建的窗体.可以在P
& h" A( M5 z4 C$ c5 Iroject Options的Forms页中设定.当主窗体被关闭时,应用程序将结束.
' k! h Y% T+ \10.AnsiString Hint:
: C; S0 Y# g4 `/ I( Y) D3 R/ q+ G5 [应用程序的Hint(工具提示) 8 G6 _1 j; }' N* A y& i
11.bool ShowHint:
, n" f9 f; y$ l! c' C1 l是否显示提示 + c/ V. z" O# L4 h" `$ ]
12.AnsiString Title: / M# A3 X% W$ z6 h! X
应用程序的标题,它显示在应用程序在任务栏按钮中 ) s" v0 {' l6 Z5 p+ S
13.bool ShowMainForm; 8 l; a) v9 W$ o( B; D
是否显示主窗口,缺省为true.当我们想建立一个不显示主窗口的应用程序时,在工程源 1 @9 J$ J, h+ L0 W" v0 V0 G. J
文件中的Application->Run()之前设定这个属性为false即可.
0 C" w. _! g8 W! V$ `+ T14.bool Terminated;
- }/ v: a+ B/ Z5 k* C5 d检查应用程序是否已收到关闭消息.如果为true,表示应用程序即将关闭.
. G; [ l2 m( v5 s二>方法: 0 |) \/ z% `: d5 m
1.void BringToFront():
5 M: F7 Q- b: s: n将应用程序置于激活状态并且拥有焦点.它将使用应用程序的窗口置于其它应用程序的窗 : D9 C; n' e; \" a' F0 Q. y
口之前. 7 D6 l/ A1 @! K/ F/ U# L
Applcation->BringToFront();
6 ?/ [9 _- a) r5 z! p) `! r- |2.int MessageBox(char *text,char *caption,int flag);
3 K( ?1 Y; O, j) j/ n% O! r这是最常用的方法了.显示一条消息的对话框,可以有一个或多个按钮.它封装了API中的
/ \( F+ u7 J+ k9 xMessageBox函数.
" a$ t. N- G3 W; q: qtext:消息字符串,可以是多行,多行可以用"\n"隔开.如"你好!\n欢迎使用本程序." 2 X! U( i1 ^( o3 L' [/ l/ n% H
caption:对话框标题 $ s5 `8 ?2 p/ Z9 \6 }0 S
flag:决定此对话框形式.常用的如下(位组合,用|)
1 e! `8 @& \3 p: E: e按钮,决定对话窗口的基本用途
) L- T5 V7 n( ?& bMB_OK:显示一个OK按钮 ; x/ h7 s7 u+ _) N; Q
MB_YESN显示二个按钮:Yes或No 1 e( v! w% H2 j% g, W3 ]% y
MB_YESNOCANCEL:显示三个按钮,YES/No/Cancel - |, f; y2 d2 F$ }) C
MB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略) 9 q9 P2 P' _; k& Y b# b% l w
MB_HELP:显示帮助按钮,当按F1或点按钮时触发Help事件 . {" q% ~* M$ b9 {( o/ j
缺省按钮:
, n9 g( W7 I4 r5 u# A) o8 b, IMB_DEFBUTTON1/MB_DEFBUTTON2/MB_DEFBUTTON3/MB_DEFBUTTON4:决定哪一个按钮为缺省 * W4 J# u6 B. a; A. [
按钮.缺省为MB_DEFBUTTON1 , m, Y! _- e, I3 r) w9 D! @5 N
图标: 3 `& _, t, P# d
MB_ICONSTOP:显示一个红色X图标
6 ]8 u& K. }! L5 u# ?! J- LMB_ICONINFORMATION:最常用的提示图标,一个小写的i / O7 l- \8 y4 I( [
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 0 l P/ h# t( l
返回值:
9 s& F# ?& f3 c3 X/ S+ E. @8 cIDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回. ! @: B$ W. X+ c& R' I# D( r4 I
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
7 t# U2 n( t3 h# L. INQUESTION)==IDYES) - `% {% n% r2 B) U7 o6 {
{ 3 o. V" X" x0 x& G& Y, a5 S
Close();
& t/ _! J# A2 j2 T}
5 j) C1 ]4 X6 l* i3 M' K4 a3.void Minimize()
9 a. f2 Y: G% Y: S Z7 G最小化应用程序的每个窗口和当前显示的窗口
. Y3 ]4 a' v+ c B+ Y& Q4.void Restore() 4 S/ b' h: F" [; o' P* p' K
还原一个最小化的应用程序 0 E# [& [* H/ Y3 {6 V7 ?# Y, A# F- B& m
5.void Terminate() ' Y3 }& q4 s4 s; w/ [
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
% H5 g6 W+ `3 T, d6.void ProcessMessages(void)
# k E! i3 D% r1 @$ n. r3 @常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
3 A% `- i" V tMB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 " E0 ?% p: \+ i- ~/ d
返回值:
! m; Z7 c3 i ?1 P+ g按钮.缺省为MB_DEFBUTTON1 . H" k2 z$ \, H8 F) T* B" ^. n
图标: 1 w+ v3 y: `+ n x9 E/ R3 C
MB_ICONSTOP:显示一个红色X图标 7 N& x/ L' C1 k# t. ]; }! J) P
MB_ICONINFORMATION:最常用的提示图标,一个小写的i
# ^) [7 L! R; S! i( lMB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 ) Y- z9 W: M- a6 T4 g C
返回值:
[" w& Q8 F/ d2 XIDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回. 8 ~; N9 ?. P, G+ C o+ |
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO 1 Z+ R9 O$ U6 M k L/ Q) p) ]4 l4 |
NQUESTION)==IDYES) : ^1 J6 F% T! Z. H5 @: g
{ ) Q- m, |1 M$ ]; a8 _& A
Close();
) X, @" m2 p" e0 O}
% t" }7 q( _$ U1 U4 R3.void Minimize()
: k! d L% e* x& j最小化应用程序的每个窗口和当前显示的窗口
9 W) J. q! x8 ]- Y4.void Restore()
- \/ r: A3 H. U还原一个最小化的应用程序
- _# p# a, ]; t% {5 ^% f6 k5.void Terminate() 9 {) O+ L# Y% v# M) x
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
1 h+ _- Y; H5 N; j6.void ProcessMessages(void) 0 M; k9 m. S+ i# s
常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
# b( f$ M ~# ?1 M中的消息 0 Z& Y: U* q3 H4 X. _
三>事件: 7 G: O0 w0 p7 M
1.OnHint
# }. i& K8 D! g5 x" ~当应用程序的提示要显示时的事件.我们也可以将它指向自定义的函数中作特殊的工具提 3 O% Q+ j" r2 n! A* O& n+ m
示显示
! I2 E$ J r. @例:
0 m6 |* g/ D4 F8 C& {3 w3 ]void __fastcall TForm1::FormCreate(TObject *Sender) & X; K+ \& I v
{
" Q0 j$ k6 Q* g3 N7 j9 R0 G0 G. C. bApplication->OnHint = DisplayHint; 5 O& @5 H- g4 s( i( x: g
} 3 ~) d" W* l) z9 `5 G w
void __fastcall TForm1: isplayHint(TObject *Sender)
! Y8 S6 K4 Q8 ^8 S3 T+ N" @{ ; R0 z n$ H4 W5 a* x5 N8 O* }. Y' B
StatusBar1->SimpleText = GetLongHint(Application->Hint); # X. z% E/ j1 n) [
} ! V) T# ? _! m1 N0 n
//一个Hint可以包含由|字符分隔的二部分.GetShortHint是另外一个函数 $ d$ a9 w/ v$ Z! i
2.OnIdle:
8 Z6 [: R. X, P, q' P8 @* b O当应用程序空闲时的事件.通常在这时候作一些不重要的状态检测或处理要求不是很严格 ' g, f4 Z( R1 P0 \$ n
的任务. + f1 }$ b& b3 y5 t0 u4 _6 d, z0 \' r
3.OnException: ' v M5 e8 c$ s: n6 P1 m% J; O, B) }
当应用程序发生异常时.你也可以自定义一个异常处理过程而不用缺省的ShowException
l; W+ B, |0 @5 E) e! ^& E8 \- t % l9 i+ T1 d# x8 n
4.OnMinimize
5 E, `9 a( Y& U- l! F9 m7 I8 n8 F- ?应用程序最小化时的事件
2 c6 I+ a* e& {# c2 h1 v' z5.OnActivate: 7 }- V- D! |: p7 @
应用程序被激活时的事件
/ ?& J4 t+ y. g, s9 v6.OnDeactivate 3 b# l! M1 y" l3 D* d
应用程序失去焦点的事件 5 E8 m1 o0 U" v7 B
7.OnMessage
$ q9 b) e( @- \% Z5 _% N7 C应用程序接收到消息时的事件.如果你想作特定的消息处理.你可以按管这个事件 , h) }, n7 U& J A
8.OnRestore 0 s% ]3 f/ F# b# B* Q* s
应用程序由最小化状态恢复时的事件
+ R. a5 X& C$ s; YTApplication应用小技巧: # b; s# j2 |' z- @
A.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT 0 b! b0 F! h e" m2 ^
/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的. , Q$ G; `% E {0 l9 H1 m' z
AnsiString filepath;
1 L. U: K5 B: i" d% jfilepath=ExtractFilePath(Applcation->ExeName); 7 ~! @- V4 h" v1 a: Q
//ExtractFilePath与ExtractFileDir是有区别的.表现在ExtractFilePath最后总是有"
4 C. G: @7 b1 E; E3 `\\",而ExtractFileDir只是在路径为根目录时最后才是"\\"
# i5 k8 W' P, _- ^( U, P/ n( KTable1->DatabaseName=filepath+"data"; 9 H. I' d% u J* \0 R+ r ?8 Q h
Table1->TableName="maindb.dbf"; ) Y$ n0 e# n }$ k/ r8 w+ M
try{ ) a! Y' S. b8 {3 J
Table1->Active=true;
$ r6 ]( \4 Y: k; b- B6 r}
7 z6 e. E- v+ B* t* ~# g4 Mcatch(...) E! G5 Q' i7 P" r/ U' ~+ P
{ 7 O$ _- a1 x# Z; }" e
//...... 7 K5 @; R' _/ ~. _0 q
} " b. F7 d6 \4 Y. p- ?7 E+ m( G9 g# }
另外有一个函数ParamStr(int index)与Application->ExeName有同样效果.ParaStr(0) 3 F6 o- M5 K8 c7 Y1 j
就是应用程序命令行第一部分.也就是执行文件的全路径. 7 D- A x! \1 s3 ? i6 s
B.自定义异常处理窗口
$ Q2 `: o( d" z& Y) w2 R/ r缺省异常处理窗口是用ShowException显示的一个窗口,其标题为应用程序的Title.我们 & ^6 O; j, y5 L
也可以自定义异常处理函数,以便对异常进行自定义的处理。 ; w' U8 l2 h5 }
void __fastcall TForm1::FormCreate(TObject *Sender)
3 c; F2 ?7 l& _2 I{
+ G: }9 F2 a$ F, |' OApplication->OnException = HandleException;
9 Y( i# G3 O- o}
' b/ p; s' q% I1 tvoid __fastcall TForm1::HandleException(TObject *Sender,SysUtils::Exception ' S" [1 {) [5 R
*E)
@1 i$ Z0 G- v- D3 i- U{ ' q2 m& ^+ Z- t) B( ?4 h8 k9 ^
AnsiString errorstr="应用程序发生了错误.\n"+E->Message; . E, G8 K& r7 ~. F% ^ T; i$ O r
Application->MessageBox(errorstr.c_str(),"发生异常",MB_OK); + j+ O% t; Z$ K
}
/ e2 H. |' w, `$ [) dC.利用OnIdle事件做一些时效要求不严的任务. 2 j! o9 L7 G+ w7 r# t* v ]3 I
我们用Timer定时处理一些事务。但Timer是要占一定CPU时间的,对应用程序的执行效率
2 e. c7 p' A3 p有一定影响。如果这个要处理的事务并不十分重要.我们就可以放在OnIdle中处理。让应 % }# g" y) N, K
用程序在空闲进处理. 8 D j* E. c2 Q+ M2 h' M
& B; G3 s: `0 E$ `/ Z5 q
void __fastcall TForm1::FormCreate(TObject *Sender)
6 z d- w$ k4 P: ~& u. \0 B$ d. Q{ , `* {' C1 H5 o+ h. G
Application->OnIdle = updatestatus; . A3 n) r- h9 I$ z$ d- |) G$ b0 l2 b
}
1 x8 W+ U5 v* Q4 wvoid __fastcall TForm1::updatestatus(TObject *Sender,bool &Done)
! D/ N/ c8 y0 `' t{ $ q5 x8 h+ ?2 @+ {, X
StatusBar1->SimpleText=DateTimeToStr(Now());
8 ~# Z P4 s$ ?3 A, [} ! y' K" B3 o) O R# Y# t
由于C++Builder5已经将Application做到了控件选取面板上。这使得我们对Applicatio 2 L4 f+ i4 C) [& L& y; ^
n编程比以前方便了不少。以上的方法对cb5以前的版本是很适用的。如果是C++Builder # @* J# `# i- Q C" [2 Q
5,我们也不用这么麻烦地写代码了,直接在Application控件的对应事件中写处理代码 ( ]: u: X K4 w1 l" L5 w
即可. : }1 t+ c$ Z: u: A% z9 r# O+ b5 N
D.在一个长时间的执行代码之前或之中及时处理其它消息 7 p Z; F+ H: ^6 k1 ]
Form1->Label1->Caption="开始执行指定任务:"+jobname[0];
8 ?, A* R4 V* I9 e1 q1 rApplication-> rocessMessages();
/ o. u2 Z" }* y4 a0 Z) ^+ N7 M& |# w; Wrunjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息 , g1 [5 ^* g# a+ F
|