数学建模社区-数学中国

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

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

8 a! w' @% e1 {/ S$ ETApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一

; N: }/ g% {8 b( G

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

, c, b+ K6 t% `* i

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

: R1 u6 z( E$ ~* V

lcation的代码.

/ b' W; n8 H' y3 A

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

: m5 u9 ~( f/ t

2 K% e: r; P+ P! t' j7 Y

一>属性:

( U# C; ^6 z& M3 r: Y8 o

1.bool Active:

8 O' z/ Q! A6 {6 v, A5 e. D

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

$ n- ?$ r$ I9 C

rue,否则为false

# Z- ]' D8 M; @" C: A

2.AnsiString ExeName:

& W7 I4 i$ }4 |: Q& I6 L) |/ t

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

* w$ v4 c4 ~2 I! q) {# p

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

( E. Q- `4 r- @% _5 o

的文件名部分

9 c( Q9 P O- ~9 T7 ^0 S2 J. l

3.HWND Handle:

% C6 Q* a3 E l* i7 o3 S

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

, M/ X* o; d; r9 E

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

8 Z7 k* c5 A0 q

4.TColor HintColor:

% Y. w& F0 P2 O( [1 w" Z; G

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

; g, c# b% F; P# @& [

5.int HintHidePause:

+ e% D( _3 P0 z. U" Q) |8 X+ S7 n

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

9 Q# H+ z- R# a9 g8 f

6.int HintPause:

% p0 N# F1 x( i( Q" ^

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

8 k( c/ E* L: R3 M% `

0ms

5 L3 B% z3 Q I

7.int HintShortPause:

* L) s2 ?9 t5 v. |

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

- A7 m; v7 D! y3 G/ c% M

8.TIcon Icon:

- F7 c* Q& }# d% z9 M

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

) G$ B) M# R5 i

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

- k6 Q4 i: Q6 W9 |3 Y

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

1 h) K# g6 \! S& B7 U% \% A+ N9 Z

9.TForm MainForm:

0 w9 Y& D% \# g; I

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

4 J! J. @5 l+ ]( H! ~4 m

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

( G$ h6 {9 A4 K# [& w5 s" D

10.AnsiString Hint:

7 q7 U4 l- ~; R5 Q- c2 y; H+ ^

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

: t7 n/ }4 q: o9 Q! |5 P" i/ N4 r

11.bool ShowHint:

5 T. E7 L/ I" R$ A: q0 q

是否显示提示

) o2 a( K& v% ~* M. s' K+ U* q

12.AnsiString Title:

. H9 p" u0 T$ Y4 k0 x2 g

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

+ d8 L& E; H% S, |9 v

13.bool ShowMainForm;

% G% Y0 k N$ f7 P

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

2 T m" M$ p6 e" w

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

( a" z8 P4 Z( s

14.bool Terminated;

7 l6 O- p0 h4 @" {1 O

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

0 i1 V9 K L$ b2 {8 z" z6 V; m

二>方法:

* \9 z# H! e; w+ B. v

1.void BringToFront():

, T9 P3 L! G, E+ a8 ?$ |" N

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

* Z, x, D8 I1 I6 ?

口之前.

% N% ^! }1 L& w4 y, w O

Applcation->BringToFront();

5 }: H! |' M3 b, F

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

/ \8 B# {6 l. s* k" f4 R

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

$ ~! H2 u) [' q6 w5 I

MessageBox函数.

* Q# _. m3 g9 Z) C" [* B* R

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

, D$ J2 Z3 [5 ^+ x* s; u) `

caption:对话框标题

. R, J! Q: C) g; Q: R& @

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

$ X, b# \8 ?9 x' P

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

* e5 ~, Q0 s4 Q3 n l' s

MB_OK:显示一个OK按钮

, m2 d! }0 N; P7 i# @* m

MB_YESN显示二个按钮:Yes或No

" y* J" P, e/ I% `

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

( `1 L9 q( A% F* }. O

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

4 l0 @, P8 p! }. I" t( l% W* u

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

9 O) {2 f1 o+ n" K

缺省按钮:

: G0 c" \2 w: l' |, W

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

$ `# }. G4 O9 [4 Z5 l6 P0 |

按钮.缺省为MB_DEFBUTTON1

. P- y2 h. {# Z. E

图标:

! N/ m. [/ E7 y

MB_ICONSTOP:显示一个红色X图标

. M* o. D2 E1 ?9 k

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

; J& H* c/ P9 U |7 I$ V l

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

( h. S3 _+ R( q5 {3 p2 e e

返回值:

7 k$ u( m- k; n* u3 ~0 r6 B

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

) ~# \( ]/ K- E f- S

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

7 s' |' c1 w/ \. S' P

NQUESTION)==IDYES)

$ H$ t+ X! K* a b; M) x; t

{

0 }& q$ c; n" k/ j, N, N

Close();

: g4 w" ~0 v' i

}

# b: y6 S* X( C3 G# @* j1 q/ G# ^

3.void Minimize()

; x- c$ @0 }. _! d

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

" j* y/ X2 T8 o# m) W5 x) q7 w& S

4.void Restore()

) H4 r9 d# v8 T! [* r

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

' L! ^9 g2 z6 X! G

5.void Terminate()

0 f! K* r. q5 u9 J' j

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

7 ?5 o. }7 x# v8 m7 l2 _

6.void ProcessMessages(void)

& k4 J( J- z+ L5 C4 S# v5 p

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

$ T% g. V2 H/ H# r. E+ ]' g- t

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

3 z2 M% k9 g- I/ R

返回值:

7 `" ?8 W z3 N" m$ s

按钮.缺省为MB_DEFBUTTON1

7 |- k$ N6 J8 }' o1 Y9 L% P6 m: M; }) S

图标:

- Q& U9 f* U# n5 e% ~; K3 W" d

MB_ICONSTOP:显示一个红色X图标

$ ?3 D5 t# z) f- D

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

4 A. ]: i: P" G. F4 k6 d4 m

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

5 T. t8 U+ ?% C

返回值:

v6 S: w9 K) K( p7 E" V2 N

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

/ `9 N8 J: Z4 ]0 A6 |

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

; u3 B- V, R7 {* F

NQUESTION)==IDYES)

4 H0 }5 r7 q1 h" }& L

{

% S) ~: }' S) _" Z9 Q# t

Close();

3 X% E" d# T2 u: o$ |+ r9 _1 ], [) N# i7 T

}

; A) f; i, i3 ~9 t4 U' ]

3.void Minimize()

5 F9 R3 w. s/ s& Y( F

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

/ q. Q# N1 m7 D

4.void Restore()

9 {4 X$ X1 H: W+ }

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

$ V: j/ j4 }- M% V

5.void Terminate()

. [( P3 \& n! L) f( g

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

$ S+ J- h" F6 {2 M

6.void ProcessMessages(void)

3 X- \1 e% Y% }- E

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

5 ?0 G# Z: X" M0 d

中的消息

; w O* q6 N& P# k4 [( l3 s. t

三>事件:

8 c: y2 @% r! W( r& x1 A

1.OnHint

" f" M" @9 l b( C' w/ O, A+ f# e2 q

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

8 d; W7 Q- p6 E# C8 [

示显示

8 A+ C1 o O' X, X4 z5 m

例:

# i! i% \; F! D# R. Z; ~

void __fastcall TForm1::FormCreate(TObject *Sender)

- b" G: u {( Y

{

" ^! \ V$ m+ X- D# x0 o4 ]

Application->OnHint = DisplayHint;

- L Y; G& ]4 N7 ]: x' T8 W. X

}

: M; x, A2 P, ?* w4 W: O

void __fastcall TForm1:isplayHint(TObject *Sender)

2 k6 I; U7 A7 {8 m n6 |- V

{

2 S, \8 ~- M% V8 m5 v7 o: W/ W% K& L

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

, b. J6 h/ X7 F6 ~# ~: R

}

9 l1 t! O8 n- L# I/ R/ N g) |

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

8 o( E0 ~: k& I; G. ]# |

2.OnIdle:

7 d' y* c/ r5 V

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

# _, ^$ h# p' [ I

的任务.

$ [& @. w9 o) G7 z. F. c8 \

3.OnException:

" D* D+ Q% y5 s; S% `# X. b

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

/ ^( R* h/ c/ f' m" d

6 v9 M' S: G; Z1 u" u

4.OnMinimize

9 B+ A, o, k. ]( Q8 x; S' E

应用程序最小化时的事件

9 C# @3 Z/ t2 w2 g

5.OnActivate:

* J" V& N+ _: a6 e+ }* i

应用程序被激活时的事件

! n8 c7 w: U% u7 y

6.OnDeactivate

) Y( ?( f! {( E8 R9 j3 ?$ ~" P) ^

应用程序失去焦点的事件

+ j9 G0 x' g: k" k% p, @

7.OnMessage

$ N7 e! O0 }: @( _( q# h4 ~: S

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

# z3 }" z' r% r! {3 g# b- n

8.OnRestore

# L- I+ L' O+ J( R+ s

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

! Q; w l2 }" y/ k9 }" g

TApplication应用小技巧:

8 N" W" i$ ?# M' P1 U* M

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

: _1 h, t/ G2 Z* q

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

- W9 f' t0 W! S! O

AnsiString filepath;

; ?1 k# l$ u( e2 \3 T& }. D

filepath=ExtractFilePath(Applcation->ExeName);

0 L) F5 c% C: S" n. d

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

. X. P2 ?& \- I3 g, N5 N+ `

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

( K0 ~* y8 Q1 F7 I% N# ~

Table1->DatabaseName=filepath+"data";

- f1 r" \8 x; N, K q" m

Table1->TableName="maindb.dbf";

4 H4 j, i' }5 a4 w ?% T- ?

try{

! o8 Y$ V& N- T2 k6 I1 p7 L

Table1->Active=true;

6 w0 J; e3 {& v4 H* S d$ A# c% u

}

( d: Z$ x3 C. [, d

catch(...)

) {& I( V# N( r) l0 z& B

{

8 p0 r/ |, k- u4 m+ B6 K" |

//......

, e2 D1 g/ @2 T" U. F

}

1 ^3 T, G. Z6 q5 J3 n' e& Q; M

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

" a, @( y" |; c" E, b j- A' d% R( X

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

; T! i7 F& Z2 U: c/ D

B.自定义异常处理窗口

2 a& q: _" k A# f

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

, v, ] C$ Y [0 R, J

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

) W) o6 u' f S' ]2 F( v& I$ N

void __fastcall TForm1::FormCreate(TObject *Sender)

1 {8 ?( } E1 b" S1 ?

{

3 o, B8 ?& N# f6 c0 P

Application->OnException = HandleException;

: Y4 A0 w& _6 s+ u

}

$ n! @ E* c3 D9 H) h i" I' B

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

6 t8 f1 s8 I1 @6 t7 r% q

*E)

6 c- h4 W7 q) D+ `! t5 z _6 `

{

6 I$ M& t% F$ `) N* g

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

+ v9 U0 K( N- `/ N, Q' X0 F

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

! g9 I# ]2 \+ I( [

}

7 F; Q- J- K. g! ^0 r- ]

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

- q1 P7 ~6 @( D8 i4 b) @* }

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

; G0 m% C3 G2 e3 X7 @

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

& O) P9 f2 _+ V/ t

用程序在空闲进处理.

8 \6 D5 E: G5 S% I7 R Y* W : K' C5 C! \0 ~$ F0 @, Z! p

void __fastcall TForm1::FormCreate(TObject *Sender)

- X7 W- C; E1 {# g

{

$ R9 x, h2 X) @1 R* O; b2 L- X

Application->OnIdle = updatestatus;

% C2 _4 Q2 u* j" M

}

, U5 D1 r+ G# k m7 Y

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

Q$ k( Q* t: X. f3 S

{

$ A3 V: I9 X) ]3 B: ~) {' N9 ?+ z

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

0 ^& U$ g6 [2 g' S

}

$ F! A% V& d- G. c& G

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

4 D! ?- c* c$ V/ w8 j

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

( M4 D8 \/ \# I. j/ t7 B9 K

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

. t( T0 W7 T: H4 N& j7 o0 l

即可.

$ H; u* U! C* ^' A7 B/ L# Z$ Q* y

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

# d8 R5 O9 ]" d# C

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

( e! }* j3 g w' @5 B+ E: A

Application->rocessMessages();

; P7 t7 W8 ~' ^0 `0 F; X

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

$ T: @$ U& \0 b; r% [






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