数学建模社区-数学中国

标题: TApplication类的简要说明 [打印本页]

作者: 韩冰    时间: 2005-1-26 01:10
标题: TApplication类的简要说明

+ B/ V0 A+ ]% m, GTApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一

# i1 i9 b; u% S z) i

个名为Application的TApplication类对象.在Project Options的Applcation页中,我们

/ s8 s0 b7 z3 m+ O5 f* \" g

可以设置这个Application的Title(标题)和Icon(图标).也可以在工程源文件中编辑App

( {; D) t6 w% S9 X: S

lcation的代码.

$ B* C. e; [# F/ t6 X% r

Application对象不是需要经常使用.下面是TApplcation比较常用的方法和属性/事件等

2 o% B: e4 f9 S' m1 j) C* n

3 k# h' l& g4 J7 Y) z1 Y

一>属性:

' h4 E0 d. i0 x) W( ^, r

1.bool Active:

* E, d8 ?0 c9 J, T. q. f" Q3 d2 j

这个属性是一个运行时才有效的只读属性.当应用程序处于激活状态且有焦点时它返回t

* z' [1 R+ Q/ [0 x5 C

rue,否则为false

" v5 l4 u" S& D5 i, j( i

2.AnsiString ExeName:

5 `1 X4 o4 H9 p" z: O

这是一个常用的属性.它返回应用程序的全路径执行文件名.运行时有效,只读.

) u3 g h) H4 X. p# j* \

Label1->Caption=ExtractFileName(Applcation->ExeName);//取得执行文件全文件名中

3 x" E# j1 c! X0 b# {2 C4 x

的文件名部分

5 ~! m2 D- I0 g

3.HWND Handle:

/ i* q) p& p6 N1 M# F3 ~

取得应用程序的窗口句柄.调用API时可能需要.这个句柄是不可见的应用程序的窗口句柄

1 G8 s2 h9 [* _4 S3 W {# M3 R

,而不是主窗口的句柄.要取得主窗口句柄,可以用Application->MainForm->Handle.

0 T) U/ E0 F- q2 ~

4.TColor HintColor:

' X+ |. V& b+ R. W8 B }

确定工具提示窗口的颜色.运行时有效

, [4 i' ]" z4 W- P: q% ?

5.int HintHidePause:

; q2 v0 x c: R

确定显示工具提示后的工具提示显示持续时间,缺省值为2.5s.

$ g U2 @/ h2 H# D. m/ |

6.int HintPause:

. U- [3 b# u( W9 k/ h8 N. Y, o

确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为80

+ ~, Q: w" \8 t0 b

0ms

$ D% q0 v( f- W6 V. O( b

7.int HintShortPause:

2 A/ g6 V2 V" Q0 {0 n

确定工具提示再次显示之前所需要的等待时间.缺省值为50ms

: ]$ b s: u' I, \

8.TIcon Icon:

9 f2 Q! f1 W- l: o+ M6 z

应用程序的图标.此Icon出现在应用程序的任务栏窗口按钮上.并作为在文件浏览器中应

, B/ t8 z9 X& U- d$ a

用程序的图标.一般在Project options中的Applition标签中设定.当然也可以用代码:

4 ^7 {8 R; n% u

Application->Icon->LoadFromFile("e:\\icon\\cb3.ico");

4 F$ Y6 O. k; w+ m/ b

9.TForm MainForm:

! z, i) O0 ]) S6 |

应用程序的主窗体.这是一个只读的属性.主窗体就是应用程序最先创建的窗体.可以在P

+ Y( z0 y& |- Q+ g. t

roject Options的Forms页中设定.当主窗体被关闭时,应用程序将结束.

% C+ A( `, F+ j, B' e( B$ J2 i

10.AnsiString Hint:

. F9 `. C3 b+ Q* E u) a

应用程序的Hint(工具提示)

# P) R# g/ C7 o' g4 P8 U: c

11.bool ShowHint:

( B/ l- b% j! y+ k

是否显示提示

" f' ^9 u9 }+ G# {+ B# A

12.AnsiString Title:

4 P ~+ Y/ g: I$ o6 S

应用程序的标题,它显示在应用程序在任务栏按钮中

0 k# M3 ?, q2 Z! |/ {% e

13.bool ShowMainForm;

0 a' @" T7 x' j" d; _& q2 o' B

是否显示主窗口,缺省为true.当我们想建立一个不显示主窗口的应用程序时,在工程源

( g3 l' A& _6 ?

文件中的Application->Run()之前设定这个属性为false即可.

& r4 W; f6 u8 Z1 `$ W6 ?

14.bool Terminated;

$ O- B/ Y$ P6 c" ~6 u

检查应用程序是否已收到关闭消息.如果为true,表示应用程序即将关闭.

# w z6 |' S7 \7 r

二>方法:

, F; T: I8 g6 z) L( ]2 Q: E9 v. e

1.void BringToFront():

t- j6 T6 _, A2 I& N

将应用程序置于激活状态并且拥有焦点.它将使用应用程序的窗口置于其它应用程序的窗

6 `4 w. o% s9 e. ^) k+ K' f P. D

口之前.

8 t% O- F9 Q4 m3 _+ H

Applcation->BringToFront();

/ Q, v1 X8 {3 U F

2.int MessageBox(char *text,char *caption,int flag);

/ n" s7 K* ?* R+ G" t

这是最常用的方法了.显示一条消息的对话框,可以有一个或多个按钮.它封装了API中的

$ B6 v# E! k' X

MessageBox函数.

, C* i% `: ?. b$ u' b; o0 h

text:消息字符串,可以是多行,多行可以用"\n"隔开.如"你好!\n欢迎使用本程序."

( H& Z$ L+ Y1 p, |, `* l- h4 Y8 U

caption:对话框标题

3 o: d8 v. t- {

flag:决定此对话框形式.常用的如下(位组合,用|)

, i4 S) v9 {2 O' q- [7 S; y) x/ } U0 N. @

按钮,决定对话窗口的基本用途

( Z! x" e& _) h: P7 m. ~

MB_OK:显示一个OK按钮

3 l1 K) C4 ~5 [* J4 ^ \! T% @

MB_YESN显示二个按钮:Yes或No

2 Y7 v0 B4 j, Y G( r8 s

MB_YESNOCANCEL:显示三个按钮,YES/No/Cancel

U" f7 U; F, E6 R+ R

MB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略)

& ?2 X* a' R3 k+ S, q

MB_HELP:显示帮助按钮,当按F1或点按钮时触发Help事件

, ?4 e- n* X O! l" U+ j# T

缺省按钮:

0 e; S- g* Q; N+ q

MB_DEFBUTTON1/MB_DEFBUTTON2/MB_DEFBUTTON3/MB_DEFBUTTON4:决定哪一个按钮为缺省

2 Z6 O j# P* ~$ p1 u5 k

按钮.缺省为MB_DEFBUTTON1

* P6 ^( P8 p6 ^4 |& T

图标:

# [0 }( }( ^* D+ `

MB_ICONSTOP:显示一个红色X图标

$ S+ T; t+ Y5 ?, W \! H; T2 @

MB_ICONINFORMATION:最常用的提示图标,一个小写的i

) s& I) I1 m* o: q( d, T" z

MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标

1 `: a- D6 p6 @' G' ~

返回值:

) I! i2 G# w+ h' X/ b/ S

IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.

; h3 |0 V4 G( t3 E' Y* B

if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO

. q: f. f& B$ I: ?

NQUESTION)==IDYES)

* I/ a5 E6 f% [6 r' x/ v

{

( N7 u4 E+ {4 t& U5 M

Close();

% X: B6 X7 B' k- k

}

/ o, g, \3 f" n! }( Q* c

3.void Minimize()

. e9 H4 |+ o$ A5 `

最小化应用程序的每个窗口和当前显示的窗口

) x2 h) W' n7 t4 C2 t& f1 b

4.void Restore()

: q# X+ B" z6 p& [1 M0 A9 W- s* E/ D

还原一个最小化的应用程序

8 x5 M5 D* K) J4 Y* l3 }

5.void Terminate()

o, L, X8 }0 e2 g# w

自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序

% ]3 j' h P- `/ X

6.void ProcessMessages(void)

5 z5 L4 F( S1 k/ f

常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列

/ b' h8 D1 k' H5 Y) J) `4 [% \2 l

MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标

7 l X1 q y& x9 a

返回值:

2 d9 _1 e5 g6 c5 o

按钮.缺省为MB_DEFBUTTON1

% v. r0 T3 h2 O- G" F) ^( x

图标:

& L$ q! Y$ G; i1 C1 b7 n$ a8 N

MB_ICONSTOP:显示一个红色X图标

# h: n: ~& ~% ^0 ~# ^2 U1 F

MB_ICONINFORMATION:最常用的提示图标,一个小写的i

3 a C$ o6 ~" C8 W R

MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标

0 f6 m$ V. ?; ]: j) ^% F8 I- `

返回值:

! C' S+ f; a! g+ d

IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.

. D, Z3 J$ A2 e0 n- m

if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO

) z& G c" a& p+ h W

NQUESTION)==IDYES)

8 U: l: P1 z/ G) @0 q4 E- {

{

0 M5 n' D) d6 S6 Z: O

Close();

" q# C( k, Z, ~2 S) G2 K4 A

}

- [; S6 S) ~! O$ n3 r& N

3.void Minimize()

# t$ h9 j! {7 r. E3 `$ f

最小化应用程序的每个窗口和当前显示的窗口

$ \9 g0 ?8 h. r/ R3 L

4.void Restore()

- \/ K3 U( W* ]# q7 R! Q" _4 }7 \

还原一个最小化的应用程序

4 ]) G9 i$ @* U2 y( s' Q8 [

5.void Terminate()

6 h+ O/ {" l. l0 P' X/ ^

自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序

P5 f& a- g% B9 @! v

6.void ProcessMessages(void)

- K0 I% y2 V8 g" q4 D6 T& T

常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列

5 A2 A6 T( U8 j& o

中的消息

. k+ K0 X6 t$ i2 L, o0 e$ y

三>事件:

: [7 m( W" ?$ d( t1 M

1.OnHint

: @/ g1 t3 M# M

当应用程序的提示要显示时的事件.我们也可以将它指向自定义的函数中作特殊的工具提

5 d# A( j2 ]" z" L0 _0 }" K

示显示

% ]% l; ?( g5 e! `; G

例:

3 K1 n/ z- H" U2 V

void __fastcall TForm1::FormCreate(TObject *Sender)

2 W6 q* U7 d6 v

{

8 k7 Z. s2 E7 ^% O8 s

Application->OnHint = DisplayHint;

6 ]# W1 ?3 s2 W+ }

}

/ }( @0 W: n2 _& x1 t) v" H j

void __fastcall TForm1:isplayHint(TObject *Sender)

/ j% h9 z5 ?# R; p; ^5 j6 R

{

j6 n5 s( ^* R" X# b6 W$ V

StatusBar1->SimpleText = GetLongHint(Application->Hint);

r2 ^8 b2 m4 i, _+ T0 c

}

) H# ?, j6 I* A# I3 F

//一个Hint可以包含由|字符分隔的二部分.GetShortHint是另外一个函数

+ K/ ^2 b3 R8 @6 z" \' F3 K5 a# ^

2.OnIdle:

" z: k* z+ }9 b2 ^1 [2 U9 o

当应用程序空闲时的事件.通常在这时候作一些不重要的状态检测或处理要求不是很严格

- v! ]3 I6 W& }7 i, K

的任务.

" c9 }* p# T/ D4 h; t; I

3.OnException:

' i) @* {& d2 M2 ?" ~/ Y

当应用程序发生异常时.你也可以自定义一个异常处理过程而不用缺省的ShowException

1 S# ~2 `' l! `- z& L# f

) w1 Y* Y @9 P! P; i8 x

4.OnMinimize

6 I5 T) i; V9 z6 D2 w

应用程序最小化时的事件

- ?8 o Z* S4 y. g0 e, k

5.OnActivate:

. c! D- ]. u, F$ o! H/ f& @

应用程序被激活时的事件

9 N2 R( g: u7 a$ y1 r

6.OnDeactivate

, H& v1 s* p9 u1 V9 \& v

应用程序失去焦点的事件

: U m3 p8 O9 N) A4 ] D

7.OnMessage

. m! n7 L* D; l0 \, f

应用程序接收到消息时的事件.如果你想作特定的消息处理.你可以按管这个事件

2 w# v0 T) g1 x: T" q2 H: S4 c

8.OnRestore

! N9 X. y/ _( {. `1 p

应用程序由最小化状态恢复时的事件

6 ?- k e- `( r( X1 c/ t( h

TApplication应用小技巧:

: Y# f* J# |9 O7 V. ^2 a5 y

A.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT

3 }2 e! i2 R! U1 B0 B

/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的.

8 p* @' c, O5 [: c( {, A

AnsiString filepath;

7 U& c8 q: a4 x& F' ]: F& T

filepath=ExtractFilePath(Applcation->ExeName);

, \" [* @. N4 v! g' e) A/ \" b

//ExtractFilePath与ExtractFileDir是有区别的.表现在ExtractFilePath最后总是有"

" E2 I3 Y6 R& ?$ t" |5 s; C. T

\\",而ExtractFileDir只是在路径为根目录时最后才是"\\"

/ W! [2 `/ B( A0 E

Table1->DatabaseName=filepath+"data";

) `, I, o( V3 c# u/ T4 r9 l

Table1->TableName="maindb.dbf";

0 ?4 y$ f% M8 w2 i, h9 \

try{

6 t$ _' m+ x; M1 G8 q+ L5 Y7 \' I

Table1->Active=true;

! X! ]7 f! N1 x

}

6 k" p5 i! t5 G

catch(...)

# ?; P) t* N# [, h

{

# T' [: o+ Q6 J$ u0 }( \1 z

//......

8 a- u$ ~. X1 e* P: K$ s6 a

}

! l2 \) ~3 o8 i! R/ ^5 Q

另外有一个函数ParamStr(int index)与Application->ExeName有同样效果.ParaStr(0)

: c$ P. R0 x5 |1 L8 }5 _( M/ P

就是应用程序命令行第一部分.也就是执行文件的全路径.

7 W- l; B6 c) ]$ k

B.自定义异常处理窗口

3 W: E5 J/ G2 }, X$ ?) `7 ?

缺省异常处理窗口是用ShowException显示的一个窗口,其标题为应用程序的Title.我们

: v$ M* H( Q: A$ p/ y# t

也可以自定义异常处理函数,以便对异常进行自定义的处理。

5 Z2 g& r! m" F) T* H3 F; B

void __fastcall TForm1::FormCreate(TObject *Sender)

3 ?. ^8 ]( U3 Y5 w7 l; |% L d

{

$ }. V# }. |4 F

Application->OnException = HandleException;

% z3 Z+ o# C0 O" v# v" N2 L5 {

}

. j. k, B# ?: d2 }, L; n

void __fastcall TForm1::HandleException(TObject *Sender,SysUtils::Exception

4 W0 A3 _* E: v" l

*E)

2 h* k7 a& v D& f3 B8 M, L2 b0 S

{

7 b9 ^5 A! }( J8 y& J

AnsiString errorstr="应用程序发生了错误.\n"+E->Message;

. q' u' M! z, G% \

Application->MessageBox(errorstr.c_str(),"发生异常",MB_OK);

2 { ]) Q, g$ M" R/ u5 R

}

: U2 k) {3 Q5 e+ _' B" K. H

C.利用OnIdle事件做一些时效要求不严的任务.

/ B% S& I7 |. C9 x

我们用Timer定时处理一些事务。但Timer是要占一定CPU时间的,对应用程序的执行效率

/ _9 e* I% o' i; G( q

有一定影响。如果这个要处理的事务并不十分重要.我们就可以放在OnIdle中处理。让应

7 U7 L) Y7 b, ]4 M1 b+ z

用程序在空闲进处理.

. r! ]' H. J6 @# m1 T; R. `0 |' L" R . \5 R9 R/ c- f. \, `6 R6 D N

void __fastcall TForm1::FormCreate(TObject *Sender)

* q$ }" |0 g) F( E# \5 F- \

{

5 i( u! \0 \5 ?9 c+ ]

Application->OnIdle = updatestatus;

% {# Y6 R! P2 r/ m* ], e' B! m

}

4 `6 t- K; y8 s6 ]6 N! W6 B# \3 l

void __fastcall TForm1::updatestatus(TObject *Sender,bool &Done)

, b8 s8 s9 U0 K+ \ |( i

{

, ]9 a. x6 ^) c# B

StatusBar1->SimpleText=DateTimeToStr(Now());

4 T+ F9 o& ^+ _. g2 k

}

* W T# g5 r0 ]" `9 d2 B

由于C++Builder5已经将Application做到了控件选取面板上。这使得我们对Applicatio

7 X7 j1 I& r' X" P" C+ _+ U4 P

n编程比以前方便了不少。以上的方法对cb5以前的版本是很适用的。如果是C++Builder

& q' ~9 T4 b; P' n1 P

5,我们也不用这么麻烦地写代码了,直接在Application控件的对应事件中写处理代码

' y2 m6 p) C' L9 X

即可.

$ ?* b% w& V0 a c( Y

D.在一个长时间的执行代码之前或之中及时处理其它消息

: h. @; W& n8 `6 M# V

Form1->Label1->Caption="开始执行指定任务:"+jobname[0];

1 W7 ^4 Y) i/ L. j- Q

Application->rocessMessages();

. P/ K- }" B# N m7 n

runjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息

( V. V; J% {) j7 c6 N' ~






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5