数学建模社区-数学中国

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

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

. q( f) w% S g" ]6 R7 \+ c, k TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一

r# q, E& B5 S8 Q2 \

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

& w1 O! T# M& r' F6 @* K- W C) I

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

: K0 s2 {( L2 s, W

lcation的代码.

: |+ [9 g1 |% j# D' S& F( [

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

4 T; [. |1 g8 K; S# h

5 p F! z$ G( u" M

一>属性:

- q, r3 p6 t# R) A8 u& i

1.bool Active:

* }1 s& }3 U8 @- Z: V* z

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

5 D# e+ s2 S# O1 S) B0 Z8 k: J

rue,否则为false

( j( x( }' c- F7 Q& u/ ?1 |

2.AnsiString ExeName:

6 v7 ]: Y( G" i+ ?

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

o& u& E: e5 d5 O

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

D0 H! K4 M. b

的文件名部分

+ E" }' k& P5 d( E/ X0 T7 z4 u

3.HWND Handle:

1 k( P/ W0 Y# ^: E% H

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

, x+ y; W# e* Q J- }# W/ Q j

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

# G+ v: u7 K/ m/ c: y" K

4.TColor HintColor:

, K( ~8 j* u! D: l

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

- x( T/ L) F9 ~

5.int HintHidePause:

0 J& v- o" V' c4 Y

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

& c5 V) |1 H+ ^7 X+ d

6.int HintPause:

; d; |' f( X' v1 {+ n

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

2 J6 C! y9 h7 T+ h' E

0ms

' o" j& } u' Y' F! a

7.int HintShortPause:

, \# x6 P) N! u" F

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

. ?; s8 J6 w9 @

8.TIcon Icon:

, f$ H O/ O2 X/ h4 O

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

7 F- W# T+ n/ A1 |# l4 l! a

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

2 a/ i0 g2 [' Z! h& x% S

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

' e s8 u5 z$ D

9.TForm MainForm:

, E* g) u$ O# ]1 H

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

9 C! k* I Q" _8 @" X3 O

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

" D7 R0 u8 ^3 h5 y1 Y

10.AnsiString Hint:

0 y: p0 m/ P: {2 e( }

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

[. ^4 v0 [4 n, h; i7 \8 m, t

11.bool ShowHint:

" _. M+ x, @0 j/ c3 Z1 X/ i

是否显示提示

" z1 y0 @0 [) i9 I% ^

12.AnsiString Title:

8 Q2 e' \: d) G6 l& H0 x! V/ n

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

" ?' }0 c$ `8 ^. y: c

13.bool ShowMainForm;

- G' V1 p7 T7 p: r

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

6 ?+ o3 R+ J( O, D9 T0 T

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

( ^. o" b! V/ I3 {4 X+ ?& c1 E

14.bool Terminated;

; L/ e$ k, Y" f

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

( W3 }7 q, y, S9 r4 U5 b" I# ^* N

二>方法:

$ l+ |/ [1 U# F. F& a5 a. B: P

1.void BringToFront():

% ^. X/ x- I1 j% ^

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

3 P0 C3 u- L2 u) g( ^

口之前.

$ S' f5 x E) T2 _% t# w8 \# E

Applcation->BringToFront();

/ R5 [" e E! c! q1 f

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

+ @, h! V$ B6 U- n7 p$ s( y

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

6 e. N `2 C. V: P/ f* I# J6 {5 f

MessageBox函数.

B8 j( D I$ K4 F

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

6 C9 l0 [( w, V! Y

caption:对话框标题

6 S9 g1 W7 U7 Z8 K2 x

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

r. h3 O+ N7 R0 q5 n. r& `

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

4 e9 A3 M p& v( y2 t4 P

MB_OK:显示一个OK按钮

6 B6 S# i) x! W" F/ ] m

MB_YESN显示二个按钮:Yes或No

: Q/ W6 ^- n, T. o2 J

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

$ r; n/ j$ f* H! q" p& C3 Y

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

% v6 T2 S9 U! r4 j

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

0 X8 l% E# ^/ t# n

缺省按钮:

6 ^1 r6 r6 j" ]' [, d

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

* N: h; P" L% }& a

按钮.缺省为MB_DEFBUTTON1

, C9 l6 {. g3 p" D1 K" R* F1 }

图标:

1 E6 u+ `( S" k9 c; e

MB_ICONSTOP:显示一个红色X图标

: i8 l0 ?/ C5 e" P

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

7 _- r6 u* U8 h6 Q2 a# ^4 O

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

" R- W0 B: `" D1 z$ c: T+ H; H) X

返回值:

, s* l+ b! A5 i! P+ R

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

/ o- f1 [. b0 L

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

: e1 b. a+ F# o9 R3 k

NQUESTION)==IDYES)

$ [" i3 S6 l) p* \* f! Q/ i `

{

& E2 k4 S/ E/ d0 g

Close();

, k6 o0 _3 ~; [- h! C2 ~

}

6 e' K; } W- K2 a i2 [7 {8 B

3.void Minimize()

; H! P# ~" m2 F% |) z& x( @

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

; u, }% @) ]9 p+ x

4.void Restore()

; g5 D0 i/ O- ?$ L6 Q4 \. Y9 }

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

- e3 [6 D1 k6 y; h, @4 K

5.void Terminate()

: `: D: S0 W4 s7 Z, w

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

/ f" M! [. \1 P

6.void ProcessMessages(void)

* L5 Y) L0 d9 Z9 h8 W7 }8 H

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

/ o7 e' Q& p6 q

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

' R* x, x, T) C$ v8 i

返回值:

, n; ]! V& F" z) `0 [' r' t, O

按钮.缺省为MB_DEFBUTTON1

6 k4 d$ o7 \+ C) S6 @8 ^! J

图标:

9 [4 V& [5 Z" `' G

MB_ICONSTOP:显示一个红色X图标

' N0 X3 F* ^& v5 Z% k9 n

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

1 v" y4 d' [' \6 W$ q5 Q

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

) W" q) D6 i+ Q: W( a6 U

返回值:

4 Z* b ?% I2 R" A& N+ ^

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

J$ Q* o$ ~. ?7 M: V$ k7 \* R2 r# J

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

, A$ G1 q8 @9 \' f) K# X, c

NQUESTION)==IDYES)

* d, V( C, z4 B, h3 n

{

+ }" i6 I* g8 r

Close();

6 J+ x! l: O) W8 I# ?% Z$ ]% {; _

}

( W$ d/ g m% e0 Z* K

3.void Minimize()

- z; a) ~3 E5 Z3 c# g ?! {

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

3 c1 D5 R- ~' T" \

4.void Restore()

& N f" @* _' d+ E* e

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

1 Z& d/ `, o3 Q3 O& L6 Y

5.void Terminate()

' W. E5 e C: y4 |. ]& j

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

* }6 }9 x, A. R- f( G1 n8 w

6.void ProcessMessages(void)

' n% w: }# P6 f5 D+ s" Q0 w2 \/ e

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

( A7 U! J0 U. v3 F$ m) @/ m! Z7 Z+ O

中的消息

2 o9 u P+ W. B% M1 @% m

三>事件:

+ C4 Z; [* ^$ Q2 l5 `

1.OnHint

5 R' T/ f+ W- o) k4 [

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

5 u: }6 m# w- n9 T! z Y5 F

示显示

8 {% D- T, k$ U9 v/ |; n3 S& @

例:

) P Y+ D9 b0 Z5 K/ B0 \( \

void __fastcall TForm1::FormCreate(TObject *Sender)

& W( ?' ~; N2 `

{

& V; t6 s1 r7 W) [% k

Application->OnHint = DisplayHint;

7 V% o, U5 ]: W/ Z

}

" d( f r$ A! K" D3 k

void __fastcall TForm1:isplayHint(TObject *Sender)

- z$ ]4 }8 C! l$ f* g

{

! X7 D2 U# o& g; I& ]* L* |% O

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

+ U+ ^. D9 x! w; _5 e3 N

}

- k6 D$ }* R& U9 A6 c6 ~

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

8 m# v7 O* S$ E" a

2.OnIdle:

- j9 {& ~: t+ K2 O% U

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

. p- s1 i4 A9 r% t# ]

的任务.

; b6 b( I4 u$ A, W2 E4 d5 J1 x

3.OnException:

6 J' y# v! }: }$ x3 u

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

/ A. P" i. D- @4 v1 r3 X! Y1 c

: c1 T7 }: K& ?2 @9 e# }6 L

4.OnMinimize

* V1 v6 f0 O; s3 L

应用程序最小化时的事件

: e" V4 F Q3 c# O; _ S! Q

5.OnActivate:

# P: C0 t+ {7 u |

应用程序被激活时的事件

2 U# @9 G+ Y: O H# _

6.OnDeactivate

! t* b8 ^# C, D8 y s. N/ W

应用程序失去焦点的事件

) g7 W: u1 V; C

7.OnMessage

d. p) @( f0 k; u1 f: E$ t; [

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

# [' y% _+ P; M$ Z0 D' i

8.OnRestore

/ o/ U: Z# W. W$ v

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

$ g/ q! e) p5 n* c3 P& {

TApplication应用小技巧:

# D& S* O9 M' G" J, {2 F

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

' s$ F* M8 w) j9 a$ H# W/ D! ~/ e0 k

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

5 B1 i5 h8 `: [. O

AnsiString filepath;

6 Y- ~9 P" ~2 h7 e0 j0 |

filepath=ExtractFilePath(Applcation->ExeName);

% F: ^% r% x S* g/ e

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

, q$ ?9 X. n& S# f9 E

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

" r% ~6 j3 y# T3 n" i

Table1->DatabaseName=filepath+"data";

' x# J% ~5 A% h* s

Table1->TableName="maindb.dbf";

' \3 l5 E+ {* S% k9 e

try{

. b# x* z6 R( ]* P

Table1->Active=true;

/ g& |. ~3 @# a+ v5 S! z6 S# V

}

+ {( P- |9 e: R! q

catch(...)

) \) o. f1 T% o% j( J& f

{

H1 |! ]& n) W' x

//......

8 T0 B) p+ X, n* l u z

}

( p6 B+ d# n1 @; _; x1 [

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

' Y2 A/ a) V" V0 `: K& g% H7 t

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

3 X( `( L& b# l, O7 Q7 G+ D2 e

B.自定义异常处理窗口

: e$ Z* n' Z% w

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

6 l! q6 \0 T" \" e" W( V9 z

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

! B7 L5 \3 {2 ^! P8 P) R

void __fastcall TForm1::FormCreate(TObject *Sender)

) A7 A/ T/ j2 [1 T2 @" [

{

) B$ G; H0 h, E8 F

Application->OnException = HandleException;

8 v2 y: U5 s* U9 n3 d( ~

}

. l% B- `+ e7 b

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

! ?6 m/ h. O3 x7 x8 @, l9 h7 u* L# N

*E)

3 t* H, e% |* ]

{

+ j- }* {) h4 `

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

4 Z6 @5 m. g4 q5 f. p' n# F1 m1 z

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

8 @, V, Z% p2 Q, D' U0 y# w

}

1 ~0 K5 T A) N6 g7 T

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

0 i/ ]# U+ g R9 P# n! F' P, z1 L5 e

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

- G" ~/ r2 w. F' l* K' ^

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

]+ B9 B8 Q# J. Y( ` ?: o) c3 S

用程序在空闲进处理.

$ K) Q. l0 o" H' {' @& [. ?/ ~1 |. Y4 o* ~# U

void __fastcall TForm1::FormCreate(TObject *Sender)

9 o8 t$ E! B, r! U

{

8 o5 v0 m' M. Q/ t

Application->OnIdle = updatestatus;

1 t T+ A6 `' q0 s C) o' a0 m6 ?

}

% x0 G! a4 M- p' O- s A4 V

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

/ |# t% t. X# }0 G4 ~

{

% A6 r `& {, ~6 J3 t

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

9 q2 S& b$ U+ R; z8 t

}

7 C3 h4 A6 a9 |

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

) k" c0 b1 u# \; B+ l

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

" j4 h; b1 e; H6 h

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

' ]; e& e* B7 [# @* I* d; x

即可.

( y/ }/ {3 I1 G( e i3 W: s5 \. y

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

7 g! M0 ?/ W9 v* N8 ~' E

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

& j& K2 N W8 y

Application->rocessMessages();

$ I9 Z- D. g f8 R$ K. L1 {- G- R

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

8 |0 L# `9 m8 k9 F* \2 v: u( u* n8 p






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