|
0 p2 ?) z* \( q, ?" _1 R
TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一 6 e( [4 W, d( g1 p/ P6 w* Y' H
个名为Application的TApplication类对象.在Project Options的Applcation页中,我们 & P4 `: d- h, D
可以设置这个Application的Title(标题)和Icon(图标).也可以在工程源文件中编辑App
& r1 M) q3 c$ r3 |) Ylcation的代码. 6 S! D9 h' y) R8 h+ P0 N
Application对象不是需要经常使用.下面是TApplcation比较常用的方法和属性/事件等 1 A0 Z/ Y( n9 ^ u# x4 ?5 @
。 7 t( b) j4 @6 P5 N
一>属性:
8 W1 R; S' g/ |! p+ z1.bool Active: 6 R( Q" ^, X4 r g9 |/ ]0 S
这个属性是一个运行时才有效的只读属性.当应用程序处于激活状态且有焦点时它返回t
- C1 O8 i; x* brue,否则为false 4 R3 p7 ]3 Z1 }( I& k$ g
2.AnsiString ExeName: 8 H/ F- Z" a! | q) c
这是一个常用的属性.它返回应用程序的全路径执行文件名.运行时有效,只读.
: y9 ~3 i, [% o: t8 x& ZLabel1->Caption=ExtractFileName(Applcation->ExeName);//取得执行文件全文件名中 " p3 x8 p L0 G. u+ p7 H
的文件名部分
1 {. }2 z: A7 c6 [( a+ C- @3.HWND Handle: ( H( {1 A5 G8 V( X
取得应用程序的窗口句柄.调用API时可能需要.这个句柄是不可见的应用程序的窗口句柄 5 d. C0 A3 E7 G4 X$ F2 W$ e1 U( h
,而不是主窗口的句柄.要取得主窗口句柄,可以用Application->MainForm->Handle.
9 I: _4 a: A7 I& t x4.TColor HintColor:
1 `$ u% m) P8 C9 K确定工具提示窗口的颜色.运行时有效
4 n V z2 e& A! \5.int HintHidePause: 9 K; {& Q. Q- P: }& ?4 E( ~
确定显示工具提示后的工具提示显示持续时间,缺省值为2.5s.
) k1 L# C# _' ?6 p! ]: w6.int HintPause:
: {$ d; c+ l: a0 {$ c2 c( N5 c+ h确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为80
! `" Q: h2 c3 x C0ms + m. {8 o% B& {1 o6 k0 B- d
7.int HintShortPause:
; ]* X8 @$ c1 j- v3 l# I确定工具提示再次显示之前所需要的等待时间.缺省值为50ms
3 _+ j" D* y+ I$ E- z8.TIcon Icon: + G, g; h) g) N V! J2 `" Q. ]
应用程序的图标.此Icon出现在应用程序的任务栏窗口按钮上.并作为在文件浏览器中应
: N$ ]0 r; t2 u- M* _& z用程序的图标.一般在Project options中的Applition标签中设定.当然也可以用代码:
* i7 A5 }# W2 o' h5 m8 B0 V( KApplication->Icon->LoadFromFile("e:\\icon\\cb3.ico"); * c# y7 s- m% A2 A8 s
9.TForm MainForm:
( z$ v: U% n L; L1 f. H应用程序的主窗体.这是一个只读的属性.主窗体就是应用程序最先创建的窗体.可以在P 3 X9 A. ]1 k/ ]0 j
roject Options的Forms页中设定.当主窗体被关闭时,应用程序将结束. 7 i$ ?# a. b& o) j- D
10.AnsiString Hint:
5 ]1 T# p9 D' ]7 B( K应用程序的Hint(工具提示)
2 k, c7 p* u6 p! o* ?0 M. e11.bool ShowHint:
7 [, F; m% g1 ~! H, \) j& f/ i是否显示提示 ( L* a9 e6 w$ a- K( U
12.AnsiString Title: 0 R0 r% s9 ]2 {* k( g8 _
应用程序的标题,它显示在应用程序在任务栏按钮中 8 Z' R, Z, w$ [
13.bool ShowMainForm;
5 I9 ~! i! k0 h# j! |* _是否显示主窗口,缺省为true.当我们想建立一个不显示主窗口的应用程序时,在工程源
- v. ]; O1 w/ h. U! f, i文件中的Application->Run()之前设定这个属性为false即可. # X& u. R' s. n$ ?* u
14.bool Terminated;
; s; |) \/ L E7 P0 `: F检查应用程序是否已收到关闭消息.如果为true,表示应用程序即将关闭.
q' B% R7 L8 z9 v! j3 T3 E' Z二>方法: # D9 U+ Q% W+ D, S- s
1.void BringToFront(): 0 r7 l0 i: {: E1 `0 A0 x
将应用程序置于激活状态并且拥有焦点.它将使用应用程序的窗口置于其它应用程序的窗
/ n4 v {/ M8 L, r3 W! J口之前.
+ I4 m2 O( d5 \7 FApplcation->BringToFront();
" @! M! P9 D( Z C9 ?9 A2.int MessageBox(char *text,char *caption,int flag); 2 S1 B, A' X2 T/ Z' R# }4 v
这是最常用的方法了.显示一条消息的对话框,可以有一个或多个按钮.它封装了API中的
5 [7 z: ?, o* zMessageBox函数.
& C* q! F7 Q( mtext:消息字符串,可以是多行,多行可以用"\n"隔开.如"你好!\n欢迎使用本程序." " {7 h, H/ b% `+ O V2 p3 L
caption:对话框标题
9 D8 J% R0 i. ?2 y9 hflag:决定此对话框形式.常用的如下(位组合,用|)
* \& l5 B/ g4 p; I6 v, f按钮,决定对话窗口的基本用途
: y6 T, c/ d) R0 h8 F2 Y. Z- aMB_OK:显示一个OK按钮
6 C7 z# q& q* k5 UMB_YESN显示二个按钮:Yes或No
5 k, V: Q# o' ?. b: g, FMB_YESNOCANCEL:显示三个按钮,YES/No/Cancel & G7 L5 i; a1 ^& a( p4 d+ R
MB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略)
# u" r* A u8 x+ b& IMB_HELP:显示帮助按钮,当按F1或点按钮时触发Help事件
o+ Q. W- b w/ k! K- w# z5 E缺省按钮: * `& I& w0 _6 F' n1 E1 Y3 z
MB_DEFBUTTON1/MB_DEFBUTTON2/MB_DEFBUTTON3/MB_DEFBUTTON4:决定哪一个按钮为缺省
5 Z7 {6 D! P/ q0 W$ U; J# Y按钮.缺省为MB_DEFBUTTON1 : k* l( @2 v2 S" {5 ^8 H2 W
图标:
7 b! Z$ v' _* TMB_ICONSTOP:显示一个红色X图标 # d: {9 a/ Z3 Y/ M
MB_ICONINFORMATION:最常用的提示图标,一个小写的i 0 D2 [. X2 Y$ F
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
/ Z8 C( z& N( R/ Y, z返回值: 4 y5 n J0 h+ l& O
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回. 0 I; C8 X/ M; {3 V d/ ^
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
}7 ]& B( z! u0 Y2 x. E6 f/ ^3 ?NQUESTION)==IDYES) - O4 S* e; v9 H) r5 @
{ ( q3 g. V. G! i3 \
Close();
" O i) x6 ~4 H5 m, p} 3 d& {7 C7 H9 S, `. ]# |
3.void Minimize()
6 f; A( Q# s6 Y5 y/ B最小化应用程序的每个窗口和当前显示的窗口
7 m4 f/ ]5 ?7 b2 ?4.void Restore() 8 f! G# a) R1 _6 i8 ~' ?! [
还原一个最小化的应用程序
) Y8 L& R) _4 [# J+ u) K5.void Terminate() 7 Q4 }! V; a# f o J
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序 * n% Q, t& P- C
6.void ProcessMessages(void)
1 b; G) H5 \0 f! m常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列 1 ^( S, W Y% g: j, l
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 - h' g+ e+ W" G
返回值:
6 _! e/ E; q4 U: U" v9 ]8 P按钮.缺省为MB_DEFBUTTON1
: e* ]# {. _5 S( O图标:
" @' [. i/ F* c9 z, bMB_ICONSTOP:显示一个红色X图标 6 b; U. M/ h8 Z) K
MB_ICONINFORMATION:最常用的提示图标,一个小写的i
$ }3 D- ~3 Y3 vMB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
+ q' |( t7 F6 U) J) f. i, D$ U: d返回值: , f2 V( G/ }# K: A+ V8 a9 T/ m7 {
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回. w: k. P6 K3 v+ p4 [+ A
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
9 e1 M0 S( J7 hNQUESTION)==IDYES) 2 g) @! ~! @! l* V6 M1 r
{ $ e/ ]) C d5 T* C
Close();
; }8 b( {4 ?0 w0 X5 j @, ?1 O8 F3 _} ( c3 R; |2 M/ L% z& H+ X/ F
3.void Minimize()
1 c2 ^8 b: s* m8 x% Q' {2 K2 h! n最小化应用程序的每个窗口和当前显示的窗口
: q/ s$ Q$ u ?5 X# N4.void Restore() 9 y% U% H% B" m9 n$ s! `
还原一个最小化的应用程序
- b* Y7 j, Y7 u' B1 f7 e5.void Terminate() 4 y5 L6 w* N* X" b# K
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序 # P/ n/ e4 F1 F* q5 ]
6.void ProcessMessages(void) # r3 O# L, k, m' W
常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列 : d D4 w3 d/ t6 Q' r* V+ B' I
中的消息 ! @/ Q6 t8 Y* ^7 `5 S% b+ ]
三>事件:
' E, f. D! A0 s6 e9 r: `1 T1.OnHint
% {( V3 z. J7 F% A, e当应用程序的提示要显示时的事件.我们也可以将它指向自定义的函数中作特殊的工具提 % I# {6 u' T: g. \
示显示 , i4 C8 |; t3 c# u9 J0 @7 w/ L
例: 8 a& k {# E( L$ G- g& M0 ?
void __fastcall TForm1::FormCreate(TObject *Sender) $ z! D( e* R5 M6 U1 s0 U' Y6 ]
{
7 a" ]- }. |2 M; B$ S2 qApplication->OnHint = DisplayHint;
& K* H- ]0 r! J3 R* ~2 c# A}
0 i# H1 v* z9 R# L; Vvoid __fastcall TForm1: isplayHint(TObject *Sender)
( I8 V* |& Y3 M{
0 q" N. p+ p8 l5 @StatusBar1->SimpleText = GetLongHint(Application->Hint); 5 M7 }( S+ u8 ^$ L
}
: R1 e! W7 u5 ~7 P2 w//一个Hint可以包含由|字符分隔的二部分.GetShortHint是另外一个函数
6 E! S# T6 b; J0 A( \- y2.OnIdle: 6 t: ^7 J0 `1 g u
当应用程序空闲时的事件.通常在这时候作一些不重要的状态检测或处理要求不是很严格
! y2 G- b+ b+ V( X! ^的任务. # G( B! X, o/ m: o7 J+ f
3.OnException: % Y1 `7 e' [8 x/ d( ` c. N' D" A* a
当应用程序发生异常时.你也可以自定义一个异常处理过程而不用缺省的ShowException & C9 Y. j {' C( Y
# X, B9 S' l8 t# q3 i4.OnMinimize ) g3 p6 p9 k: |# h
应用程序最小化时的事件
; ~6 E$ O. e: [. i$ E d5.OnActivate:
- S0 @1 G9 @4 {* L$ k; ?4 V应用程序被激活时的事件
5 j c0 I$ e* u6.OnDeactivate & L3 k# _- ?( a
应用程序失去焦点的事件 7 v. t7 r: t: z4 h8 q* p
7.OnMessage
$ ^9 k! A0 f. t2 Y; ?应用程序接收到消息时的事件.如果你想作特定的消息处理.你可以按管这个事件
6 M4 G% ^8 e/ K: f2 m9 q3 V* ]8.OnRestore 2 w9 S* ]7 L1 c3 f6 f
应用程序由最小化状态恢复时的事件
7 L9 F9 J/ \' |' E4 WTApplication应用小技巧: 5 p5 S* {2 l# e9 G$ [# s0 j
A.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT
8 K, }# |. ~: W4 `9 {( y6 m/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的.
, |/ f# s6 K r, K- k0 D$ q! aAnsiString filepath; . W* s2 j l8 g, g f. B6 W3 `; e
filepath=ExtractFilePath(Applcation->ExeName); : L" H& l5 W& `1 \3 \7 V5 m
//ExtractFilePath与ExtractFileDir是有区别的.表现在ExtractFilePath最后总是有" * O" _7 d! j* k3 u/ e/ w
\\",而ExtractFileDir只是在路径为根目录时最后才是"\\"
8 P9 R" c; _& ~" v0 MTable1->DatabaseName=filepath+"data"; 7 d( `; x/ f& V9 w
Table1->TableName="maindb.dbf";
; p+ C1 n* _; ~try{ $ ^: X8 T, v {+ T
Table1->Active=true; ) }6 {: X6 X8 Y
} ( Q; T% x% F; N5 C0 B2 E" W( Z
catch(...) , D- ]2 H) I1 l* n6 p ~% [
{ ) Q. i" R* P( K! B# N3 D v/ n
//......
2 g7 O6 s$ ^" A- R5 y0 T3 i2 r}
+ Q0 l* r5 K3 k+ T M7 W1 ~3 @% x另外有一个函数ParamStr(int index)与Application->ExeName有同样效果.ParaStr(0)
: @! s" G# P3 }! d就是应用程序命令行第一部分.也就是执行文件的全路径.
$ q7 x; e" K: r1 t! @+ \B.自定义异常处理窗口
; R3 G. K7 Y7 E* e- _7 k缺省异常处理窗口是用ShowException显示的一个窗口,其标题为应用程序的Title.我们 9 f$ W4 M7 j' ~( M/ Q' ?0 ~
也可以自定义异常处理函数,以便对异常进行自定义的处理。
# Y4 l9 S/ U% {+ s, k' Xvoid __fastcall TForm1::FormCreate(TObject *Sender) ) e& L x1 {' \3 E: s+ j
{ 3 Q; g: `2 _* a5 Q( m; ]2 b! X8 {
Application->OnException = HandleException; ' ~+ t1 @" A& `& H3 O- o1 u9 S
}
0 J9 C$ B# I4 H! _' ?* vvoid __fastcall TForm1::HandleException(TObject *Sender,SysUtils::Exception
6 F, b7 i- c; l9 K*E) 5 X1 A( b$ Y: o+ s y) P2 b
{ " d* [+ r2 L ~6 i# x+ J. p
AnsiString errorstr="应用程序发生了错误.\n"+E->Message;
- J0 L |9 y! X5 [4 g) `2 S9 J7 UApplication->MessageBox(errorstr.c_str(),"发生异常",MB_OK);
/ N4 d5 `: t$ t# Y) r. S}
% H3 A- Y. R m& I+ pC.利用OnIdle事件做一些时效要求不严的任务.
7 M `$ ~3 |3 ]) i7 J( m我们用Timer定时处理一些事务。但Timer是要占一定CPU时间的,对应用程序的执行效率
3 L* l6 E% J! i/ R! Q( E3 d( O有一定影响。如果这个要处理的事务并不十分重要.我们就可以放在OnIdle中处理。让应 / X& l. u* ^: m& ~% m6 f
用程序在空闲进处理. $ \9 r/ |/ t! p9 G
* C& |1 i: R" k" _3 L, C& Y
void __fastcall TForm1::FormCreate(TObject *Sender) ' ^. O5 }: [4 R- {
{ ) ^% d( U5 o/ Y# O4 s; [4 g, s
Application->OnIdle = updatestatus;
. v; V0 [/ g' ~1 e} 6 Q# z" {+ A& Z& s/ k6 ?; y
void __fastcall TForm1::updatestatus(TObject *Sender,bool &Done) 6 p9 ^5 @0 \; i
{ $ \4 `0 e( X! c1 s" L( L& p
StatusBar1->SimpleText=DateTimeToStr(Now()); % o, S. V% U3 F7 K9 Q8 A
}
' g6 B6 B7 f4 N1 G ?2 R0 o由于C++Builder5已经将Application做到了控件选取面板上。这使得我们对Applicatio 1 S4 K$ J4 M$ H5 U
n编程比以前方便了不少。以上的方法对cb5以前的版本是很适用的。如果是C++Builder
) S9 I* M& ]$ d: D1 r5,我们也不用这么麻烦地写代码了,直接在Application控件的对应事件中写处理代码 " d/ i" f. B% j2 s7 `( F b* g' h$ \
即可. + m0 Y' z( W/ k- B1 f& i
D.在一个长时间的执行代码之前或之中及时处理其它消息 $ F8 V. A& K* v6 L- L9 L% @
Form1->Label1->Caption="开始执行指定任务:"+jobname[0];
# Y- p7 u" g" b2 u/ M- r8 [" X- YApplication-> rocessMessages(); , n$ T; A0 d% G8 k% N9 [/ \
runjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息 2 Q9 ~. ~+ T* L% b8 |& M: v+ _0 h) b
|