|
# C9 B; s% E" v; f) B& b# G
TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一 8 v+ U- ~; p. F3 M
个名为Application的TApplication类对象.在Project Options的Applcation页中,我们
4 O& s, T) s- F- H! t, H可以设置这个Application的Title(标题)和Icon(图标).也可以在工程源文件中编辑App
: A2 j% ~- V' [. H) F& z: [+ K wlcation的代码. $ Q2 t2 Q+ S. A$ d. C% L
Application对象不是需要经常使用.下面是TApplcation比较常用的方法和属性/事件等 & u d: a1 F+ V$ A
。
7 D, J; n$ ~. A/ d一>属性:
% c8 ]. M% ^7 E, Z1.bool Active:
, Z7 p8 L* P1 Z, n8 k这个属性是一个运行时才有效的只读属性.当应用程序处于激活状态且有焦点时它返回t 8 _& b& v& z% b& f/ S1 `9 k5 F
rue,否则为false
' n0 w& c& f! C6 G1 i) R2.AnsiString ExeName:
. F7 L7 Q* A j9 R4 D! j9 I这是一个常用的属性.它返回应用程序的全路径执行文件名.运行时有效,只读. 1 Z% t. {' E: N# O6 H
Label1->Caption=ExtractFileName(Applcation->ExeName);//取得执行文件全文件名中 ' c i3 j4 u7 o, ~* G/ i% O, T
的文件名部分
+ g& q1 ^, ` e3.HWND Handle:
, b7 z( W' C5 c7 m" L0 u b取得应用程序的窗口句柄.调用API时可能需要.这个句柄是不可见的应用程序的窗口句柄 4 ?; x1 x+ u) U
,而不是主窗口的句柄.要取得主窗口句柄,可以用Application->MainForm->Handle.
8 p1 B2 k# i; S+ @1 x& Z4.TColor HintColor: 0 f( g) j8 \; @+ z ?& ~8 s3 ?, e* m
确定工具提示窗口的颜色.运行时有效
% J# h/ m; b1 Y0 k5.int HintHidePause:
N" s0 ]5 ]7 l' Y4 g/ Z确定显示工具提示后的工具提示显示持续时间,缺省值为2.5s.
3 W) c+ R D. Z2 W6.int HintPause: 6 m/ n8 [& M0 H3 U
确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为80 + K1 T# S- X$ J
0ms / J3 c( D# S) C3 M
7.int HintShortPause: 8 Y5 l+ N, {; t! v' H+ n) b' w2 z
确定工具提示再次显示之前所需要的等待时间.缺省值为50ms
0 a/ ?" {+ c2 ^: K0 B; |8.TIcon Icon:
9 t% k% o1 T, @应用程序的图标.此Icon出现在应用程序的任务栏窗口按钮上.并作为在文件浏览器中应
) f2 o5 M" r3 I" W3 Q9 B' ~* o用程序的图标.一般在Project options中的Applition标签中设定.当然也可以用代码:
$ ^5 ^8 p3 ], U8 H! I9 v9 HApplication->Icon->LoadFromFile("e:\\icon\\cb3.ico"); : x( u4 @& X& ^. B9 D! j0 |
9.TForm MainForm: $ W/ a7 R' R5 ^! g
应用程序的主窗体.这是一个只读的属性.主窗体就是应用程序最先创建的窗体.可以在P 9 U- `) E' T2 f) Q, W& D# O' q4 H; v
roject Options的Forms页中设定.当主窗体被关闭时,应用程序将结束.
3 T- m, u4 o! q9 L& I10.AnsiString Hint: 0 }" z! z1 `& Y. _5 @ T
应用程序的Hint(工具提示) - C0 N1 ]5 f; U, w3 U+ K# T1 c
11.bool ShowHint:
! p& ~+ H7 |" a8 [是否显示提示
8 H" ]" g% n2 m5 F; e! G" Z12.AnsiString Title: 1 W9 R Z- J5 c% @+ P
应用程序的标题,它显示在应用程序在任务栏按钮中
o% R6 j/ R" c$ `# o7 x13.bool ShowMainForm;
# a5 o/ M( ?8 Q, ?( B8 r是否显示主窗口,缺省为true.当我们想建立一个不显示主窗口的应用程序时,在工程源
0 x: E' K* w! f. x- p, d3 f文件中的Application->Run()之前设定这个属性为false即可. 4 v8 O( Z) O' s( n7 _; |4 Q
14.bool Terminated;
- f: p+ z) M5 j$ Q* o检查应用程序是否已收到关闭消息.如果为true,表示应用程序即将关闭. 2 T5 @+ S, [, a- U
二>方法:
" { y2 k2 b4 s I N& y1.void BringToFront():
3 U: Y0 j+ D, _* v$ O# @将应用程序置于激活状态并且拥有焦点.它将使用应用程序的窗口置于其它应用程序的窗 1 T' d, s% V5 a
口之前.
3 _- B! u# I SApplcation->BringToFront(); 8 o' C5 `0 K% X3 m0 E$ R7 P
2.int MessageBox(char *text,char *caption,int flag); / R3 ?, L. @% K0 D& H
这是最常用的方法了.显示一条消息的对话框,可以有一个或多个按钮.它封装了API中的
, E" s3 z. ]6 CMessageBox函数.
0 u4 s0 r- I; P. d6 q" x5 J; _text:消息字符串,可以是多行,多行可以用"\n"隔开.如"你好!\n欢迎使用本程序." # K# N' w. ^0 S0 Q9 `/ S7 c
caption:对话框标题
9 i# B6 [* |9 r4 A5 ?flag:决定此对话框形式.常用的如下(位组合,用|)
& t" [, K6 b/ e3 H A4 i$ e按钮,决定对话窗口的基本用途 a( L8 x! U1 L; i
MB_OK:显示一个OK按钮 + Y7 f0 ]+ @; u1 x
MB_YESN显示二个按钮:Yes或No , R6 L6 P7 G) _7 ^$ Y
MB_YESNOCANCEL:显示三个按钮,YES/No/Cancel 9 R7 |3 _. W6 o/ S3 `
MB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略) 9 [! D) G& j7 Q, G, c* K. J
MB_HELP:显示帮助按钮,当按F1或点按钮时触发Help事件 4 ?# U3 l: D( b
缺省按钮: / _6 @/ W. q( `4 Q; D
MB_DEFBUTTON1/MB_DEFBUTTON2/MB_DEFBUTTON3/MB_DEFBUTTON4:决定哪一个按钮为缺省
# F( ^4 l( C; n# D9 j( i* T) r4 H按钮.缺省为MB_DEFBUTTON1 $ w9 [) y6 x% i4 m
图标: - c$ f+ Y. F9 c
MB_ICONSTOP:显示一个红色X图标
2 y1 h y7 w' f, ~MB_ICONINFORMATION:最常用的提示图标,一个小写的i 4 |$ ~, N! u+ x# m# x7 f: T
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
0 }4 V7 n/ Q) h( `0 {' d& K, F返回值: & A7 c" T% `! r6 ~7 l" ^/ u! B
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.
6 b# z# ?! T% O3 ~! R# Eif(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO 9 [9 U( [, \' u4 r' F
NQUESTION)==IDYES)
8 d& J, S4 p1 f4 @{ - Z2 W8 T' \+ k2 ~+ V
Close(); 9 Q' H2 t0 R+ e2 L
} # F3 u( @3 G4 ]/ b. f' P
3.void Minimize() $ O$ H1 I1 l. B3 H1 M7 x& i& w3 N2 W
最小化应用程序的每个窗口和当前显示的窗口
8 z: p( @' V/ { ?4.void Restore() 7 t0 j1 V m8 H1 K
还原一个最小化的应用程序 : M ?; X3 G) `; U
5.void Terminate() $ j, k7 ^$ K7 L. ]
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序 - G# d& i) k: D. X+ L/ r
6.void ProcessMessages(void)
" g/ y% s# g6 ~- [6 |常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列 + {( `: `. e4 |4 R/ i7 u2 Y
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
, ]' g% b" A& ^- ~; ^返回值: 2 E5 [9 x, |' Q/ K2 I
按钮.缺省为MB_DEFBUTTON1
9 u& b8 A1 m$ d- i图标:
# J1 u/ J3 n6 {+ y* k7 v# o! \MB_ICONSTOP:显示一个红色X图标 , \2 x2 n. ~, m6 _/ v' K& o: D
MB_ICONINFORMATION:最常用的提示图标,一个小写的i , y1 H/ w6 z/ K
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
( v) F1 E( V" v7 ^$ V! U返回值: * y6 |* }/ R1 U" Z5 c% L
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回. 5 U- q0 ?. A, c1 _# A. ]
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO ( @$ u B! \2 v7 x o
NQUESTION)==IDYES) 6 E5 ^ J6 b: @
{ & H8 F7 ]1 l) N% Z0 B
Close(); / W& ?1 {3 _% V# ^
}
1 z$ v" a7 ^2 I$ D# h( ^7 A3.void Minimize() 9 K; V5 x2 M- t( @4 x1 O" `* h
最小化应用程序的每个窗口和当前显示的窗口 H% A/ \, |7 \4 G
4.void Restore()
2 _4 P f4 a4 @) o& N# ~还原一个最小化的应用程序
8 i! c* B3 F8 S# m; P# L ~5.void Terminate() * t" K I$ a' D$ O% `$ v% d+ E/ A
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
' U0 ~! r7 H0 b/ w+ a6.void ProcessMessages(void)
; U! }* W. B1 c+ r" X9 [4 S常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
2 f% b; @" U, ]6 ^" P) l& S$ c5 x. _. v中的消息 4 i7 \# e. T- C+ X3 D
三>事件:
1 L8 `( p% E( T g' `1 g1 W% H1.OnHint
! w: R3 H: Z' A) C, J当应用程序的提示要显示时的事件.我们也可以将它指向自定义的函数中作特殊的工具提 ; ]2 _; z) B1 y9 L$ M
示显示
- M' f; Z4 u# M) }1 I例: $ `1 R( q; |1 W& z' z
void __fastcall TForm1::FormCreate(TObject *Sender) 1 ^) b1 w& l& |' P# {# T
{
+ S# d, b( s+ z" O) VApplication->OnHint = DisplayHint; ( @1 {/ m* x/ E" ?
}
/ P* s' ?8 }+ D) fvoid __fastcall TForm1: isplayHint(TObject *Sender) $ J! T* z. R; P0 O$ d) ^3 p- Y
{
2 v5 J* s4 d5 I- i, J( x/ {. hStatusBar1->SimpleText = GetLongHint(Application->Hint);
: `$ D7 z4 D$ G! Y- L+ C# B}
% `3 P$ h% [; u0 P3 e+ T//一个Hint可以包含由|字符分隔的二部分.GetShortHint是另外一个函数 5 Z- s- {1 y, F8 j3 c
2.OnIdle:
2 m6 l; Y! e0 x$ b, Z0 g- E/ q8 [( \当应用程序空闲时的事件.通常在这时候作一些不重要的状态检测或处理要求不是很严格 / V) `( N" p! a# U$ X
的任务.
! o( E. W2 z+ Z( f R3.OnException:
: w# D3 l; ?7 ]; l4 |当应用程序发生异常时.你也可以自定义一个异常处理过程而不用缺省的ShowException
9 L8 }8 ?; c1 H 2 @1 ^! C! _; X; J
4.OnMinimize
( }9 Q3 r! `# m5 g( K应用程序最小化时的事件 , B2 S# `& Z' h' _$ a1 k
5.OnActivate:
$ K6 D3 `$ A# a- q: o2 _5 w应用程序被激活时的事件 ; |" |+ D8 B; Q: a
6.OnDeactivate # C- b) V; L. f' T
应用程序失去焦点的事件
- L9 J, I9 m2 n* h* t* @7.OnMessage 9 s5 V# p, d# V- w- m0 N
应用程序接收到消息时的事件.如果你想作特定的消息处理.你可以按管这个事件
3 X5 M+ N1 |2 o8.OnRestore
# K/ B# d" b% ]. F' R应用程序由最小化状态恢复时的事件 & d: Y4 B. _* I0 o! k) E
TApplication应用小技巧:
+ _ X, m$ J$ e+ L' d' eA.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT - F. R/ `4 m; t, Q2 F
/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的.
4 T ]' N5 V8 k% JAnsiString filepath;
- h, @( X( H+ A0 M* sfilepath=ExtractFilePath(Applcation->ExeName); . Y9 j- v, v3 H. ^/ J
//ExtractFilePath与ExtractFileDir是有区别的.表现在ExtractFilePath最后总是有"
: _* _. h% |2 t9 _( ?- Q. g% F\\",而ExtractFileDir只是在路径为根目录时最后才是"\\"
, w$ _' D" j6 }Table1->DatabaseName=filepath+"data"; , h4 N4 ~# Q7 W$ U( B
Table1->TableName="maindb.dbf";
; n% S+ @4 z. H- L1 G8 atry{
3 z4 d! f0 A0 j5 Z3 [9 Y* bTable1->Active=true; 3 ? V9 k3 b; Q; G/ y
}
8 [) \/ b, f1 l1 Q8 ]/ Qcatch(...) # ~8 g0 _2 C. f6 O6 D
{ & P) L. h2 b& U- z. ~ R
//...... " y0 ?. E3 ~ Q9 N. V. b/ A/ F
} . e+ U2 }3 J( V7 B2 {
另外有一个函数ParamStr(int index)与Application->ExeName有同样效果.ParaStr(0) 3 W# E E2 a8 m, Y4 u1 \( M2 [
就是应用程序命令行第一部分.也就是执行文件的全路径. * h- k8 x- A2 J, c; s6 Y. n* {# r
B.自定义异常处理窗口
) V, I' Y j9 h( v: e缺省异常处理窗口是用ShowException显示的一个窗口,其标题为应用程序的Title.我们
9 g" b' w2 j- `也可以自定义异常处理函数,以便对异常进行自定义的处理。
. W7 f9 x( q/ W6 ?, U+ E5 hvoid __fastcall TForm1::FormCreate(TObject *Sender)
3 |* W5 ^! F8 z1 ~9 ^( s{
1 _& ~) [0 t( k- z, NApplication->OnException = HandleException; + ^ `( s8 F+ M m/ a# N2 e2 V& h5 O
} ' r4 G( e, U; V
void __fastcall TForm1::HandleException(TObject *Sender,SysUtils::Exception 4 l% m) E( t& K% @* }
*E) " Y, Y) ]4 {6 y4 G( b% d( k
{
( u. r) _; H( B I+ t1 _& ^. e% n; NAnsiString errorstr="应用程序发生了错误.\n"+E->Message; : X; n9 ^8 m6 U! s8 W
Application->MessageBox(errorstr.c_str(),"发生异常",MB_OK); 1 T: e/ S2 T* y7 H. S
}
! `7 q X/ J4 Z5 l$ @0 TC.利用OnIdle事件做一些时效要求不严的任务.
1 j$ B n8 @) V8 d3 s0 q3 g我们用Timer定时处理一些事务。但Timer是要占一定CPU时间的,对应用程序的执行效率 l7 Q: y' q+ o3 m& Q% S
有一定影响。如果这个要处理的事务并不十分重要.我们就可以放在OnIdle中处理。让应
) ~5 s( i w! R4 K* F$ D- H! f8 C# w用程序在空闲进处理. " f# ]- Z# @; p7 Y5 ?3 p
2 h; [9 p* U" q1 P$ ]* T) }/ \; f% u
void __fastcall TForm1::FormCreate(TObject *Sender)
( L( x5 Y0 o, ?! o+ E0 Y( q) e3 w{ 5 I/ n8 a1 l2 U4 c
Application->OnIdle = updatestatus; ' [4 Q3 D7 M0 Z" w! }5 i
} ( a ~3 E7 [( J
void __fastcall TForm1::updatestatus(TObject *Sender,bool &Done) : w0 ~& P* Y) b" F8 |
{ 0 h# t) j# Q& Y% X# U1 N% @
StatusBar1->SimpleText=DateTimeToStr(Now());
5 J: t. y0 E: Y}
& L, y4 i+ ]6 Y8 d由于C++Builder5已经将Application做到了控件选取面板上。这使得我们对Applicatio % R) b' R) n3 o8 N: A! s6 h
n编程比以前方便了不少。以上的方法对cb5以前的版本是很适用的。如果是C++Builder ( B9 R/ K1 u' {( l6 P
5,我们也不用这么麻烦地写代码了,直接在Application控件的对应事件中写处理代码
4 C. ]9 u. |1 o: H% a. n/ R即可. * _# k- B: Q# [1 l3 Y1 D' z, Q( a
D.在一个长时间的执行代码之前或之中及时处理其它消息
: W& Y& p% z2 N6 L' zForm1->Label1->Caption="开始执行指定任务:"+jobname[0];
8 p) n0 \% q' v& j; }: s. [; nApplication-> rocessMessages(); : w8 N% w: [& A: v) A D' _9 n
runjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息 3 v$ V+ |, J+ y, d7 p& Z
|