|
0 v* W: |. u4 z7 g. U7 E
TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一 ; f; C6 @: G& O
个名为Application的TApplication类对象.在Project Options的Applcation页中,我们 : b d1 k' }5 F
可以设置这个Application的Title(标题)和Icon(图标).也可以在工程源文件中编辑App
* j3 S2 ~* J O8 M/ x, tlcation的代码.
1 B: b; d! e; E" @Application对象不是需要经常使用.下面是TApplcation比较常用的方法和属性/事件等
. j9 I' E$ J* v7 j+ t。 ( g& ?+ v5 Y0 a- O7 n$ e4 L# W( Y
一>属性: - M; p- o3 D2 s l* q" U1 Y
1.bool Active:
P$ `% K6 t i7 ^这个属性是一个运行时才有效的只读属性.当应用程序处于激活状态且有焦点时它返回t 4 H6 L, y' ]: g( g% K) w
rue,否则为false
5 g$ l0 P9 H1 P5 Q; G2.AnsiString ExeName: % D) _6 ]- h' `5 P
这是一个常用的属性.它返回应用程序的全路径执行文件名.运行时有效,只读. 1 s3 t \# d X* Q
Label1->Caption=ExtractFileName(Applcation->ExeName);//取得执行文件全文件名中 2 N2 H! Z! m% b( B# a& C
的文件名部分 2 G, v( }& C7 C6 K0 z! e
3.HWND Handle: 2 @8 R4 S& k3 r3 p
取得应用程序的窗口句柄.调用API时可能需要.这个句柄是不可见的应用程序的窗口句柄 # b$ f7 ~# T) A. ^
,而不是主窗口的句柄.要取得主窗口句柄,可以用Application->MainForm->Handle. 1 h! M3 v. o- j6 e9 K, T! n
4.TColor HintColor: 9 `/ D- X3 e# I: x$ K s
确定工具提示窗口的颜色.运行时有效
) V2 h. I: [, L: O5.int HintHidePause:
+ X5 q) P5 V0 A, K确定显示工具提示后的工具提示显示持续时间,缺省值为2.5s.
, d* m! D, J+ G$ O, y8 J* L1 R1 J6.int HintPause: # W9 g; F. r7 Q S/ v9 L8 m
确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为80
/ X. T2 k6 f; [( E+ s n6 I: V0ms
; }) e0 g Z0 u( p- j e' q+ d9 F( ~/ ^7.int HintShortPause: . }# \ v9 A. n4 n
确定工具提示再次显示之前所需要的等待时间.缺省值为50ms
& u5 i/ L- e4 M" I% y8.TIcon Icon: 3 L' R9 V" N# R6 p
应用程序的图标.此Icon出现在应用程序的任务栏窗口按钮上.并作为在文件浏览器中应
# Q* U. X N( o+ m, V% {用程序的图标.一般在Project options中的Applition标签中设定.当然也可以用代码: 1 h9 y I7 c0 f4 D3 g' X% Z
Application->Icon->LoadFromFile("e:\\icon\\cb3.ico"); # Y+ V* m+ x: G" }# N
9.TForm MainForm: 1 t5 r2 @- t; l/ \( B5 B
应用程序的主窗体.这是一个只读的属性.主窗体就是应用程序最先创建的窗体.可以在P
( q: b& i" U$ o, P7 F! B+ Broject Options的Forms页中设定.当主窗体被关闭时,应用程序将结束. ' r0 f# l- w% ]0 g% f
10.AnsiString Hint: 5 u- _0 Z# C5 ]6 j
应用程序的Hint(工具提示) 9 s, o( X6 ~. ^# G
11.bool ShowHint: ]' [/ B; A) A+ j
是否显示提示 # Y1 L! F2 Q- ~$ m- i, Y
12.AnsiString Title:
! h9 q4 j% j4 v+ Y应用程序的标题,它显示在应用程序在任务栏按钮中 4 M) q0 @5 z0 v1 G$ V
13.bool ShowMainForm;
* c8 p E' ], K/ d$ K: ~是否显示主窗口,缺省为true.当我们想建立一个不显示主窗口的应用程序时,在工程源
. Q- ^. Y4 d( |$ m2 P# M% J/ s文件中的Application->Run()之前设定这个属性为false即可. ; R) Q' K: K* J: i% v3 x
14.bool Terminated; + D9 ]' {* a9 L& s, @
检查应用程序是否已收到关闭消息.如果为true,表示应用程序即将关闭. 9 J8 P1 b. b) t
二>方法:
( b# P$ _) s& J' Y1.void BringToFront():
2 ?: L6 m( H9 d. ?将应用程序置于激活状态并且拥有焦点.它将使用应用程序的窗口置于其它应用程序的窗 ( r$ ?% |) r u
口之前. 9 F4 O3 D& A' {& F3 B7 G2 F
Applcation->BringToFront(); 5 d9 k$ Z5 B! z7 }7 B7 n7 I
2.int MessageBox(char *text,char *caption,int flag); & {, Z; f7 P7 t" W [
这是最常用的方法了.显示一条消息的对话框,可以有一个或多个按钮.它封装了API中的
; J) M% B) c7 p% ~4 D+ tMessageBox函数. ; Q3 Y" v( Q4 f( q
text:消息字符串,可以是多行,多行可以用"\n"隔开.如"你好!\n欢迎使用本程序." 2 r3 l2 N8 m! O2 ?
caption:对话框标题 ( o5 E/ s( C5 q2 U8 S& A5 H
flag:决定此对话框形式.常用的如下(位组合,用|) # |6 T+ N0 d; d
按钮,决定对话窗口的基本用途
; ]- V5 J3 U1 {; X- ?MB_OK:显示一个OK按钮 2 g2 g8 [3 s& a8 T1 |& H
MB_YESN显示二个按钮:Yes或No - r' H9 w' T9 f0 ~! b
MB_YESNOCANCEL:显示三个按钮,YES/No/Cancel 3 X% y, f) T! b8 D. {* X
MB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略)
3 Y# \/ |% V9 G# o4 P9 ~) v, H% ZMB_HELP:显示帮助按钮,当按F1或点按钮时触发Help事件 ; n9 t$ Q& ^7 g$ Z
缺省按钮:
) i6 Q1 ^1 R) k, p* yMB_DEFBUTTON1/MB_DEFBUTTON2/MB_DEFBUTTON3/MB_DEFBUTTON4:决定哪一个按钮为缺省 0 V; ]0 y1 v) u, e7 U& Z- o
按钮.缺省为MB_DEFBUTTON1
( B0 T/ i4 f* O; C9 H* s$ u9 H) U图标:
2 [/ V( I' F, k+ [MB_ICONSTOP:显示一个红色X图标 4 f$ v! E4 V" y- g# A$ P
MB_ICONINFORMATION:最常用的提示图标,一个小写的i
3 i7 T' O- c+ l# a% @2 _MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 ' W% K' T4 n9 b" a& h, O5 |; h
返回值:
. B& r0 A( k1 W GIDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回. 5 E4 T) l7 N. g% G1 s% t0 H
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
3 {) @2 Q& h. d6 q$ BNQUESTION)==IDYES)
8 F# i0 |" z: S+ O3 o: d9 _2 y9 g. P{
8 O6 y. v( X- }+ G) EClose(); " v0 e' y# _) b0 `. f9 e
} * g1 c0 Z5 o; z
3.void Minimize() 7 I5 Q3 }1 N3 d/ D: ]
最小化应用程序的每个窗口和当前显示的窗口
+ u, l* l* f: t% W4 ]9 q( ^" c4.void Restore()
( A) n' G" S- G! W% o还原一个最小化的应用程序
- I' j: N" {7 H5 I( E9 L# l5.void Terminate()
, |* y( q' o- B自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
$ L% z- I# \0 u4 @/ m6.void ProcessMessages(void)
9 @: t, J, B' ?; |* u- |1 G常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列 1 H7 V& h1 H( O7 v
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 8 V' L; R8 F: p5 d
返回值:
1 h' J" Z, g0 E/ K按钮.缺省为MB_DEFBUTTON1 : w; E0 P# Q& @- C5 y
图标:
" V) Z5 i& E6 NMB_ICONSTOP:显示一个红色X图标
4 m" g, [; ?5 Y JMB_ICONINFORMATION:最常用的提示图标,一个小写的i 4 o0 J; K c/ }2 Q6 H6 T
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 L# G8 I: ]* q( F5 E. U
返回值: - ^( a- ~ a, ~
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.
& d; [2 E3 _* A. Z8 wif(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO 5 Q, L; p0 o' M6 w
NQUESTION)==IDYES)
7 l1 _+ U: [( C) ]2 K& m; I{
4 t0 i' S$ O, |4 d4 v" B8 |Close(); x1 t, G. v4 p4 f1 ~; l; u# q
}
+ H; }; {7 p$ j( U b3.void Minimize()
2 M4 u7 C/ |8 j最小化应用程序的每个窗口和当前显示的窗口 + z. L2 G% N- F& K# }
4.void Restore() / y, u1 O+ R7 v4 w* E
还原一个最小化的应用程序 / Z, B9 W/ M& `4 h( `3 {' Z. ~, k
5.void Terminate()
/ U5 m3 @5 y4 L. d; F9 o自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
0 l( D2 r4 {; U9 G7 c* ~! ~: r6.void ProcessMessages(void)
" S# c+ ~7 [1 f* Z! F1 b6 }常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列 : n8 ]7 W6 e7 o6 ]9 V& l* ]/ I
中的消息
8 q# Q4 |3 D* k+ y E0 m三>事件: # V1 A% ?' L, V% E; y# x
1.OnHint 6 Z' Z. t* ^; n/ X
当应用程序的提示要显示时的事件.我们也可以将它指向自定义的函数中作特殊的工具提
. ~/ J1 Q# n0 p; M, W# U# N示显示 & N+ p& g5 ~5 h6 d! O X
例:
, p: }! r7 u svoid __fastcall TForm1::FormCreate(TObject *Sender)
7 |: `- ~( u- J5 U9 J# `{ 3 E+ Z( V3 d& L
Application->OnHint = DisplayHint;
5 y, V7 m' O* {1 k9 V}
4 {2 B% z! ]7 w4 R4 lvoid __fastcall TForm1: isplayHint(TObject *Sender)
" ^( {) v2 B* j) E{
" S5 m- g7 |9 v& g6 x! g( ?StatusBar1->SimpleText = GetLongHint(Application->Hint); # ^* E$ w9 C/ T$ x5 M! r- m
} : y0 G- p" C( R, I* B
//一个Hint可以包含由|字符分隔的二部分.GetShortHint是另外一个函数 3 n6 s% x& ^" L' O! G* J
2.OnIdle:
: c, t0 N* p. Y2 i) P) K; v当应用程序空闲时的事件.通常在这时候作一些不重要的状态检测或处理要求不是很严格 2 e: q9 @- S9 {5 B5 q% Q8 }. a
的任务. 1 j3 B3 O5 o$ p: F' Q, \
3.OnException:
; Y- ~2 S# [" E9 f) a当应用程序发生异常时.你也可以自定义一个异常处理过程而不用缺省的ShowException
2 r- A9 m# J3 X( h7 T) h
- Q, K- |4 _, N- |4.OnMinimize
9 u- h, K' h1 {5 |/ Q7 ]应用程序最小化时的事件 8 I s3 z: U( d) a
5.OnActivate:
" v/ ]6 t& c( I& T& V应用程序被激活时的事件
9 v8 U; g; q- B( D& u }6.OnDeactivate
9 J' ~' O4 Z9 r应用程序失去焦点的事件
/ N \( K7 {2 c7.OnMessage
3 ]7 [: F! g. S1 _1 U; R7 u应用程序接收到消息时的事件.如果你想作特定的消息处理.你可以按管这个事件
) ?6 W/ S; t$ w6 E6 ^8 H O8.OnRestore & ]- x- S% b6 p3 m9 V- K8 C
应用程序由最小化状态恢复时的事件
U1 o( }7 D) HTApplication应用小技巧: - F" t: Q I9 Q6 E
A.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT
9 H: l! B9 W' @1 x- T. P/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的.
9 g/ c/ V7 S o; y( x; r) D- F* lAnsiString filepath;
3 ~& | L9 ` F5 Z( ~. ~filepath=ExtractFilePath(Applcation->ExeName);
1 A. K8 t% x% |0 f( f//ExtractFilePath与ExtractFileDir是有区别的.表现在ExtractFilePath最后总是有" * q/ M0 h: I+ w9 V6 E( j' i ^/ o
\\",而ExtractFileDir只是在路径为根目录时最后才是"\\"
& Q; q$ S! R+ i6 Z, y$ \Table1->DatabaseName=filepath+"data";
" X' X1 k3 L( j1 O+ q+ q/ ITable1->TableName="maindb.dbf"; / |; A% X' [' Q
try{ ) n2 e: C5 i- {! d% J1 Q
Table1->Active=true;
2 E9 f) Z! [, s/ Z- A}
% }5 t I' L) G, q9 S, t6 Mcatch(...) , N( y, Z: G1 K) D% n7 A
{
; `+ M) ^1 q7 U0 [$ `//...... 2 P E7 @' i. o* H: Z- m
}
4 j( m2 O0 i) [4 V) P1 U. S另外有一个函数ParamStr(int index)与Application->ExeName有同样效果.ParaStr(0)
( P( y/ d7 c3 M/ ?9 n( t就是应用程序命令行第一部分.也就是执行文件的全路径. L" i# x( D5 ~0 ?9 V* f' i
B.自定义异常处理窗口
{( l# _9 k6 i( A6 F缺省异常处理窗口是用ShowException显示的一个窗口,其标题为应用程序的Title.我们
9 Z+ t! J/ n, Y也可以自定义异常处理函数,以便对异常进行自定义的处理。
6 A" A3 z; T2 o+ nvoid __fastcall TForm1::FormCreate(TObject *Sender)
' r# a. o! H' M# g! F4 Q& p{ $ b, W9 k# I+ n G
Application->OnException = HandleException;
2 w* Z( h; @3 X& l} 4 n8 N* u1 |' [4 _
void __fastcall TForm1::HandleException(TObject *Sender,SysUtils::Exception
1 l# b8 t! a$ Y" K# J& {( ~: P' |*E)
6 e# A0 R/ \( `% G4 X# R: F{
) }, T4 H* A+ }AnsiString errorstr="应用程序发生了错误.\n"+E->Message;
& P4 U, h1 S4 u$ P7 FApplication->MessageBox(errorstr.c_str(),"发生异常",MB_OK);
" c* \. R- S! c- y/ H8 f} " y) C6 W0 w( ^4 S+ K. t
C.利用OnIdle事件做一些时效要求不严的任务.
( \ Q$ [! t3 n我们用Timer定时处理一些事务。但Timer是要占一定CPU时间的,对应用程序的执行效率 - ~+ f8 B( c2 Y, i4 Z# |( @
有一定影响。如果这个要处理的事务并不十分重要.我们就可以放在OnIdle中处理。让应 6 p" b; W1 U( Z( b8 Y' Y1 O4 ~
用程序在空闲进处理.
) e4 O& t) c7 z8 y- t
, N+ D1 _3 A8 s" T4 z5 [' tvoid __fastcall TForm1::FormCreate(TObject *Sender) , \. _& \) J7 ^( L9 s) c% m
{ ! ?' } |! s/ E t: Q# s; q
Application->OnIdle = updatestatus;
& t4 ^' u; {: ]6 D/ c} 9 ?" T! c R, b+ }8 W* v) F8 ^: y M4 H) i
void __fastcall TForm1::updatestatus(TObject *Sender,bool &Done)
8 Z& q. D9 r5 J: U2 f) v1 t6 x2 Z{ # i6 Z8 M" O$ y$ a
StatusBar1->SimpleText=DateTimeToStr(Now());
1 H6 Q% P/ c) D} 0 P: N |" e0 L" L% T1 ~# o, B
由于C++Builder5已经将Application做到了控件选取面板上。这使得我们对Applicatio
& L7 Y" k6 S# Z4 {1 z3 Fn编程比以前方便了不少。以上的方法对cb5以前的版本是很适用的。如果是C++Builder . `6 W" y$ Y3 g3 {2 c' [
5,我们也不用这么麻烦地写代码了,直接在Application控件的对应事件中写处理代码 8 L' ^$ D4 ^. }" D# \6 q
即可. h/ ]4 C" B2 T; n7 C* T+ Q
D.在一个长时间的执行代码之前或之中及时处理其它消息
+ G6 e' T: g& }+ J& D. CForm1->Label1->Caption="开始执行指定任务:"+jobname[0];
0 ~% o$ w& Y- r/ w# d$ [Application-> rocessMessages();
/ Y) b: e$ S% W( \% a. p6 Drunjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息
2 x& E- g( A2 v& y1 B |