|
- [" B" c/ Q X7 `; x1 OTApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一
: _- @. l W* w) t个名为Application的TApplication类对象.在Project Options的Applcation页中,我们 + s; e& |- h9 j) S+ S
可以设置这个Application的Title(标题)和Icon(图标).也可以在工程源文件中编辑App
8 D, X- t; Y3 r. k$ Xlcation的代码. ! [- J+ W9 E! _( c3 e0 M5 d3 d
Application对象不是需要经常使用.下面是TApplcation比较常用的方法和属性/事件等 2 W3 i! o" k4 S* O
。 0 @3 t+ g1 V- Y, n6 @9 i$ G
一>属性:
( t* {" u1 }4 S% |! l5 c3 v1.bool Active: ! t- Q8 R* i1 N; X6 Z3 D
这个属性是一个运行时才有效的只读属性.当应用程序处于激活状态且有焦点时它返回t . G5 B; P' h5 J+ Z
rue,否则为false
0 c, }6 R: e0 ^0 M4 i" m; n4 t |1 G2.AnsiString ExeName:
0 }+ ]! P; S: J这是一个常用的属性.它返回应用程序的全路径执行文件名.运行时有效,只读.
I, L! @8 m& Z3 V' a: s2 q# ELabel1->Caption=ExtractFileName(Applcation->ExeName);//取得执行文件全文件名中
; q- q: H5 L% N6 Y. I0 P' Q$ F的文件名部分
1 _6 L, O$ @- b- h: D( R6 F, y1 g3.HWND Handle:
5 e- E A0 G: W) r# C5 \取得应用程序的窗口句柄.调用API时可能需要.这个句柄是不可见的应用程序的窗口句柄 1 z( y( A1 F8 l5 R4 X+ i
,而不是主窗口的句柄.要取得主窗口句柄,可以用Application->MainForm->Handle. ! b. U' H( ^. B3 f. R
4.TColor HintColor:
! Y' Q- }/ f2 h& W4 P7 P确定工具提示窗口的颜色.运行时有效 . m2 }7 F, Y8 N
5.int HintHidePause:
( E$ g* _3 F+ {' J确定显示工具提示后的工具提示显示持续时间,缺省值为2.5s.
1 M9 `) i* Q m# j8 C+ J6 A0 T6.int HintPause:
; L+ `* j( s1 \5 G; J4 _0 i5 N确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为80 ! e& c; q) t& J% i% D7 q
0ms
0 q9 d! r# V0 u# X( C) ?5 t7.int HintShortPause:
$ a; R) |% Y! H确定工具提示再次显示之前所需要的等待时间.缺省值为50ms 0 ]1 h. S: a. Z- z4 X( @* g
8.TIcon Icon:
- [7 p1 z" j- o! Q2 v! ~应用程序的图标.此Icon出现在应用程序的任务栏窗口按钮上.并作为在文件浏览器中应 / n5 ~( p) [" `6 d3 _
用程序的图标.一般在Project options中的Applition标签中设定.当然也可以用代码: + |8 t2 R& U+ Y$ S" N
Application->Icon->LoadFromFile("e:\\icon\\cb3.ico");
! y- G) k7 q6 K! o9.TForm MainForm:
0 M$ f4 C9 q, b3 L M应用程序的主窗体.这是一个只读的属性.主窗体就是应用程序最先创建的窗体.可以在P $ E2 u* m1 J. ]) f4 T
roject Options的Forms页中设定.当主窗体被关闭时,应用程序将结束. 1 p: q; R; q* Z6 ]# g+ {
10.AnsiString Hint: 6 a4 y- u! g! X5 t0 F
应用程序的Hint(工具提示)
" ^- ?/ R% Y( K) x! e11.bool ShowHint: ( p* A( K) F+ E3 O+ B
是否显示提示 8 A$ i# k$ z5 c* k- Q1 r6 U
12.AnsiString Title: ' r0 }0 x/ c; t% I' }7 e+ g
应用程序的标题,它显示在应用程序在任务栏按钮中
7 D1 N0 c: w; @) e: x$ Y3 j13.bool ShowMainForm;
: H# i) S" V, U- v r9 B是否显示主窗口,缺省为true.当我们想建立一个不显示主窗口的应用程序时,在工程源 ' P3 |1 j* F( E6 m! c; U' O K
文件中的Application->Run()之前设定这个属性为false即可.
$ P7 }4 H: Y7 D# S! M! ^14.bool Terminated;
) Q9 M2 C) X8 P& N" ?0 a检查应用程序是否已收到关闭消息.如果为true,表示应用程序即将关闭. / \5 }2 |8 X% b% @; I% p' y# A4 `
二>方法: , s) N& M+ ~' b
1.void BringToFront(): ! H9 _4 P9 c* W7 n+ l
将应用程序置于激活状态并且拥有焦点.它将使用应用程序的窗口置于其它应用程序的窗
- v% w$ b. i. P1 b口之前.
) `3 w& y6 W/ d4 PApplcation->BringToFront(); . V8 F5 M* x. U o: y: j7 o
2.int MessageBox(char *text,char *caption,int flag); ) [; h6 Y1 U' f! O
这是最常用的方法了.显示一条消息的对话框,可以有一个或多个按钮.它封装了API中的 + E' D% v# F0 H' x1 y
MessageBox函数.
8 h0 }; P1 q* L9 Mtext:消息字符串,可以是多行,多行可以用"\n"隔开.如"你好!\n欢迎使用本程序." . e7 [* D8 B/ C
caption:对话框标题
2 E, V1 c, \2 }6 T; `' U( l) P; pflag:决定此对话框形式.常用的如下(位组合,用|)
. |' X# f, D* h按钮,决定对话窗口的基本用途
( [5 I- u& Q- R8 B* O. e( `# QMB_OK:显示一个OK按钮 & @# i7 F& k- C7 a
MB_YESN显示二个按钮:Yes或No " ~$ h {) [' O4 y8 N- j' T. h' O
MB_YESNOCANCEL:显示三个按钮,YES/No/Cancel
4 c" ]( z0 z( E1 d. o- s$ rMB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略) $ c+ X( R6 f' {2 L2 M
MB_HELP:显示帮助按钮,当按F1或点按钮时触发Help事件
' i* Y8 O0 }+ ]: f' j缺省按钮:
^6 Q; @. y& c# D. A0 uMB_DEFBUTTON1/MB_DEFBUTTON2/MB_DEFBUTTON3/MB_DEFBUTTON4:决定哪一个按钮为缺省
0 e' P: O0 ~0 u$ _9 U3 k! Z2 `# U按钮.缺省为MB_DEFBUTTON1 9 E, X# g; y% B' B' S: A
图标:
, [. {& ~% A- G o x. _. YMB_ICONSTOP:显示一个红色X图标 d7 A; V' [* ?( B+ g+ v
MB_ICONINFORMATION:最常用的提示图标,一个小写的i
* x: n. k7 {6 O' j- A6 r \MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
% F r6 f) j0 ~ I: o返回值:
& z* V4 n$ g$ k, q( zIDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.
, F3 j' N1 u; C; M! Wif(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO " g+ O7 C( e0 b9 K
NQUESTION)==IDYES) 4 A' N1 a. J$ P
{ 6 [3 G E2 H0 d+ X. x# B
Close();
5 U8 F' x8 J7 @0 l5 o5 z3 H} 8 q% w9 L1 g3 V" ~- U( ? _! M3 Z# t9 S
3.void Minimize() 7 s* z5 J. L5 ?/ \$ p: ?
最小化应用程序的每个窗口和当前显示的窗口 ' `- t9 E/ {6 G
4.void Restore()
6 x$ M% J: k8 m8 \还原一个最小化的应用程序 & a, K1 ^ Q9 R. {6 v5 ?
5.void Terminate() $ A3 ]& \4 x$ ]9 D- r ?. _
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
4 i" ^) @. \6 o9 L5 k7 m6.void ProcessMessages(void) ( `$ b! V' i& u
常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列 8 | K/ P! U, |* ?: Y& j) V8 S Z
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 % i9 a7 ?# F! x1 F/ t
返回值:
4 h9 z. g( {9 L2 @按钮.缺省为MB_DEFBUTTON1
3 X! |3 O& o3 P: [6 q# u/ V图标: " f+ b t) y* Z4 j9 h3 S0 X0 J; |
MB_ICONSTOP:显示一个红色X图标 ! {! Z* N4 T' e1 x+ ~2 k
MB_ICONINFORMATION:最常用的提示图标,一个小写的i 3 w7 O7 y& m% X! V2 H
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
: _* ]" y& O5 q' r/ I返回值: & w& V0 W& ?/ q* {0 g6 O- n0 G1 U8 z& ^
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回. 9 V: |* [" r: ]! U1 }2 g
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO $ `. S. a4 n$ G
NQUESTION)==IDYES)
/ `& M, s/ E" i{
! Y9 I0 A# o0 }+ x* \# y8 JClose(); / i/ \( x( \* w2 D- ?- B+ |
} l- G- @, O% B& [; J" Z' w g
3.void Minimize() ( `6 s2 {& S. A4 h% W" M
最小化应用程序的每个窗口和当前显示的窗口 5 x6 \# k& ~3 F5 ?+ ]3 Z1 L
4.void Restore()
( [% A: B% t7 A8 q% T4 U还原一个最小化的应用程序 7 r3 G8 f4 {! `
5.void Terminate()
+ r$ ~; a( a J0 K9 L6 A自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序 $ M8 b# j: u) S/ t
6.void ProcessMessages(void)
7 u' w* @& ~0 Y9 Z, ?" B常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列 3 D J- d' F3 s; c
中的消息 J/ W/ O# W$ e2 i& D4 n
三>事件: 3 ?5 r6 m. ?5 |( D7 k0 X* s m( b
1.OnHint
, t% e9 Q4 G9 o当应用程序的提示要显示时的事件.我们也可以将它指向自定义的函数中作特殊的工具提
8 ~% j* l) y) _, q示显示 4 e4 {( K* i2 J9 s! }
例:
. D q h) B5 @0 d3 xvoid __fastcall TForm1::FormCreate(TObject *Sender)
) y9 a) y3 ~: C# A0 h# o, E{
: h J! ]$ H7 ZApplication->OnHint = DisplayHint;
& d! Y/ @8 h# a; P: B" r} # O8 ?- ]' |4 C6 A
void __fastcall TForm1: isplayHint(TObject *Sender)
% t3 j. O. } `" K/ w/ k{ 5 g: m3 _5 Z' T5 U- {
StatusBar1->SimpleText = GetLongHint(Application->Hint);
2 |* Z7 B1 q8 e% b# Q}
+ [/ y; U. I1 h//一个Hint可以包含由|字符分隔的二部分.GetShortHint是另外一个函数 3 ]' H8 o3 Z! m! a* o7 m4 f. K6 g
2.OnIdle: # \3 @6 p6 G4 X) ]8 P& W
当应用程序空闲时的事件.通常在这时候作一些不重要的状态检测或处理要求不是很严格 % o o& s) l0 s* k% I! W5 v' P' L
的任务. ( u: S/ {3 S4 L& l6 ]; i" y5 ~
3.OnException:
, ?' M+ B" b8 N+ Q/ Y- ?0 [当应用程序发生异常时.你也可以自定义一个异常处理过程而不用缺省的ShowException . A8 k5 @1 ?2 q( Q- d5 Y* z
l/ t+ B1 _* u/ N% \) z( j
4.OnMinimize
, t, X, _2 R$ b: `! O应用程序最小化时的事件
P1 V: g9 X9 T5.OnActivate: ! o9 b# w8 d1 ]
应用程序被激活时的事件 8 ~# N' E' f0 ?, ^ E, ^
6.OnDeactivate 1 z. d5 _9 c3 C$ c Z% J% ?
应用程序失去焦点的事件 / ^$ H( Y* `3 \( {* ~' X
7.OnMessage 7 }8 E6 @- d6 G0 x+ s( A- K* |( j
应用程序接收到消息时的事件.如果你想作特定的消息处理.你可以按管这个事件 8 x2 i, a- ~7 y# y+ p
8.OnRestore / X* ~# [5 b/ S/ U/ F5 f
应用程序由最小化状态恢复时的事件 Z' `5 L/ K7 x3 B D* s
TApplication应用小技巧:
* g) i$ E1 n# NA.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT % B, v1 S2 M9 N. `# v- L( @
/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的.
% o2 k L# \& m5 |+ d% s' [AnsiString filepath; ' ~8 X) q( y' N. S ^
filepath=ExtractFilePath(Applcation->ExeName); 4 v7 w# g& `* B) I* P# n/ S
//ExtractFilePath与ExtractFileDir是有区别的.表现在ExtractFilePath最后总是有" : M$ U, T2 `- f: h/ j! _' }
\\",而ExtractFileDir只是在路径为根目录时最后才是"\\" ( y1 b# h2 x3 ]4 E' ^: U4 X: J
Table1->DatabaseName=filepath+"data"; & Q# B2 p; H7 S" F7 h1 p& y' a# f( e, C
Table1->TableName="maindb.dbf"; - V! s$ a2 d3 l. N' ?' r/ d
try{ 1 T5 T& t2 S' i; z. o2 i+ ^+ }
Table1->Active=true;
( K: _& x" s7 l} 9 x+ \$ _& | ^( M& z
catch(...) N) z6 o) H4 A4 k4 O
{
0 R2 _9 L2 g. E//...... ( z+ R5 L ]8 O% v- s
}
8 z$ i2 B! T4 s* N2 E# W9 k另外有一个函数ParamStr(int index)与Application->ExeName有同样效果.ParaStr(0) 2 r# i2 z4 H: M
就是应用程序命令行第一部分.也就是执行文件的全路径. # }4 K$ }6 m% ?# d
B.自定义异常处理窗口
8 r- R- ]+ ]9 U缺省异常处理窗口是用ShowException显示的一个窗口,其标题为应用程序的Title.我们 ( I0 [: J, k% `) U/ |, W$ M
也可以自定义异常处理函数,以便对异常进行自定义的处理。
& M5 a+ U. Y8 M3 E: i( Svoid __fastcall TForm1::FormCreate(TObject *Sender)
9 u0 }7 \* B/ m* H& s0 U' K3 G{
" o/ o1 g% |( X8 C3 JApplication->OnException = HandleException;
% I( [" t, \7 l9 x" z; |} ) N# ?% S. ~) u6 c2 k& v7 s2 Z
void __fastcall TForm1::HandleException(TObject *Sender,SysUtils::Exception
2 {% {2 J& V) {( P* {! u$ Z5 p*E) , ?6 o `! {/ x) V% M+ Q
{ ! F8 V" n7 {4 h. [
AnsiString errorstr="应用程序发生了错误.\n"+E->Message;
( W- D0 @ R" z* B( n: }, M: W0 u- mApplication->MessageBox(errorstr.c_str(),"发生异常",MB_OK); ; b6 @. u3 T/ X/ T
}
$ b. m% J2 @2 v5 r' q+ Q+ [; CC.利用OnIdle事件做一些时效要求不严的任务. $ ~3 @( g. Z4 }5 j! q& f' s( J
我们用Timer定时处理一些事务。但Timer是要占一定CPU时间的,对应用程序的执行效率
7 E4 s/ |! j: w+ R有一定影响。如果这个要处理的事务并不十分重要.我们就可以放在OnIdle中处理。让应
r5 u8 z0 r& E用程序在空闲进处理. # ^+ j' o: \8 {8 X/ Y( M2 s
; x& w0 ?# ]* G
void __fastcall TForm1::FormCreate(TObject *Sender) $ T% S* g* W1 n s2 D0 j" N
{
/ R5 }) c; {* FApplication->OnIdle = updatestatus; 5 l/ B% U& i- N" L& v
}
" N% Z8 J/ O. z" y0 A2 xvoid __fastcall TForm1::updatestatus(TObject *Sender,bool &Done)
. P4 Y- R4 P8 K, r- h# I% g$ w{
7 t; H5 S/ ~# pStatusBar1->SimpleText=DateTimeToStr(Now());
( `# }7 D* C. t. m* ~}
U2 [4 B' w9 H1 E K4 t+ b/ e& [4 q由于C++Builder5已经将Application做到了控件选取面板上。这使得我们对Applicatio % D* E V+ O9 k t1 A% P$ H
n编程比以前方便了不少。以上的方法对cb5以前的版本是很适用的。如果是C++Builder
8 Q) P7 F' M- N% U* H5,我们也不用这么麻烦地写代码了,直接在Application控件的对应事件中写处理代码 : v/ I# T" S0 j# X% t; C
即可.
" ?2 B" v" }( W7 lD.在一个长时间的执行代码之前或之中及时处理其它消息 $ I7 o. F' s3 }9 f: T
Form1->Label1->Caption="开始执行指定任务:"+jobname[0];
* e" |: _0 X4 ]1 g& C7 h5 wApplication-> rocessMessages(); $ d0 @# P) r5 l1 m- @
runjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息
' ?8 Y- Q7 }# S1 ?1 _8 B |