数学建模社区-数学中国

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

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

( s1 Y- r+ z8 f; c. X, RTApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一

7 V2 h- ]% T% K+ O

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

8 o1 \0 ^6 c' Z0 _

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

' M, s& V, c/ A5 n/ m. O9 s

lcation的代码.

, G- U# g. l+ e3 z& M; ^

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

) i2 K) E5 c5 |. I9 Z3 r

3 Z3 F z# V( E) y7 B$ C

一>属性:

0 u2 j8 {( V0 V

1.bool Active:

& j) z* o C& r; L$ } ^- g) {

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

( K9 O" U' S- O o

rue,否则为false

$ R/ I! f8 G5 N$ y

2.AnsiString ExeName:

; u4 h) s: r9 O% e) n% L0 i7 v

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

! C( } p7 `) H% } h1 ]

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

+ o$ V# ~$ E H! a1 L$ Z0 ]

的文件名部分

3 Z6 o& C3 _$ W8 C9 @2 G+ e

3.HWND Handle:

* ]6 P6 y% P( L3 ^4 y# Q

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

. a" a7 n" `2 e; T8 H( o' [

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

4 G0 J* c; `+ a3 J

4.TColor HintColor:

, i+ M& t3 m. O- Y* m8 I

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

: {$ e& y! p' S0 x5 u: R6 ~

5.int HintHidePause:

+ j: A& o, t$ D# q4 n

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

; U! O1 r' Y9 Z4 T, M& z' I- a( j' U

6.int HintPause:

0 |3 [, L( c$ t7 f3 Q1 f

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

8 v3 Q# D/ K; R& X+ I" }" e! a

0ms

+ w/ `8 o1 \ N( _4 Q# {" b

7.int HintShortPause:

5 ~2 Q4 ?+ Z9 d7 Q( t9 A% T

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

( g8 S0 ^6 A- Z( `

8.TIcon Icon:

& E! D* j- s$ V( C/ M) C

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

+ |1 q+ T$ C; A4 h& a

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

) s! c3 t) t6 ~/ L! C( |

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

8 v/ ^+ f% Q6 S4 H1 `1 |) Y! I

9.TForm MainForm:

( e9 \ W. H& \* ~# X7 }0 u

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

& A# t6 T' J+ h1 d" L

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

1 `, h( u( n0 g8 F5 I6 u8 ]1 s

10.AnsiString Hint:

9 ~$ [4 h' u; S- T

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

$ ], v7 k& Y* ]4 ?$ e! W

11.bool ShowHint:

* ]4 F, ?3 T3 |1 j- U; h

是否显示提示

7 m2 D1 l6 }( Q( D! v5 A2 m

12.AnsiString Title:

& O* c* q; F8 `- x

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

4 Z) \5 T" F6 T# I) Q' Q& R

13.bool ShowMainForm;

; s5 G; X, N$ S4 l" G' }/ r

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

' k( a2 m% t! K, y) p

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

8 I2 g! H! {/ s* r+ [

14.bool Terminated;

7 M; a. o" N; ?+ C4 S- z

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

4 g! P: _; G+ L3 D" r! L5 c* r

二>方法:

" ~* i2 w/ z/ z/ c' c2 ]

1.void BringToFront():

' y* @) B4 s) n0 U$ {3 @

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

. B& y0 T& B `* ^8 \& w

口之前.

: _" B& U& K+ n' P9 s) c0 \3 {5 g

Applcation->BringToFront();

5 Z6 u# F3 |3 C

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

$ |2 I. k! [* f. P: X6 i9 w

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

9 Z+ |8 e/ T) Q3 J3 T4 s+ U2 t& Y

MessageBox函数.

; j D) j' d; p# _

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

* n4 P& @8 o2 ~. R9 F `! V" N" Q

caption:对话框标题

8 k6 ?$ w$ ^7 }9 Y7 y

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

# z5 r9 w: W D' B! f/ b

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

3 p3 l7 H* r4 F; }

MB_OK:显示一个OK按钮

2 N8 {2 R( {6 i' q

MB_YESN显示二个按钮:Yes或No

; o0 I$ E9 D# g& O' v

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

+ w3 H) Y, T7 u8 m9 _

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

0 S! \) ~3 c# z* h1 B2 ]4 A

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

) k2 g& b, B: V) p' Q

缺省按钮:

3 q* Q& K& S$ M+ q; l+ t9 a2 d

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

$ H$ t; Q3 H, j

按钮.缺省为MB_DEFBUTTON1

: v+ v! q; M# M8 `- q( c: ^

图标:

; S3 ~6 ^( w0 f

MB_ICONSTOP:显示一个红色X图标

2 o. L6 C! x/ e t( g

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

8 a- I; [3 A D

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

$ p& \- W, j6 P9 O+ _& F

返回值:

1 Q; I3 [ L6 w9 t9 p+ V+ d0 o

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

5 E( n4 z" d: c* d. `* W

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

# \2 s$ g9 G0 Z5 C

NQUESTION)==IDYES)

3 _& r1 m& n( F3 Y. `& U

{

' J& R% q4 n; d# V+ K; V

Close();

! {$ x' f8 ^& |8 R) a2 \

}

8 i7 A" C5 i1 x4 B$ F

3.void Minimize()

* u+ B, @' R: R e' S9 Y( w, w7 n- G

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

5 e( c9 c8 `6 ]# q7 z4 _$ \" @8 k, s

4.void Restore()

" }, E( |: u I$ b( v/ ^) A

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

- m2 G9 ]8 u. H; C5 [) x/ x

5.void Terminate()

# q% P6 j6 F; h9 W

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

^: ^4 r: H2 {) p6 l0 N) M* P1 D

6.void ProcessMessages(void)

' L/ i0 O6 g! P n$ O

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

& ^* M, Z' d* N4 ?

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

$ {6 q0 q, J0 O% N$ E$ k

返回值:

6 Y1 S; P9 Q1 }# M; h- a( T* h

按钮.缺省为MB_DEFBUTTON1

$ r' ^* h7 w8 N- O

图标:

I( x) r7 K: [0 l6 ]2 Y

MB_ICONSTOP:显示一个红色X图标

+ \: u" S" D+ K! g

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

8 Y/ r8 E$ `. Y& P+ N5 g

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

* Y s v+ o* m* o3 X7 m

返回值:

- w3 Y8 V) X- Y" k7 C; K' ?( B

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

- q5 e, W0 _+ u) {7 W

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

2 @& X _; F6 W6 ]6 q5 t

NQUESTION)==IDYES)

; v+ ^% K; V1 x

{

4 J. S' e% q- Z# ` ?4 D Q+ y

Close();

9 S. L9 d8 p) [9 d" A" D. N. H9 \ `

}

$ R8 h' F: f/ v6 p. t3 v+ Q

3.void Minimize()

( e- ?* Q: A: S) b3 U: u

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

4 z/ n# q% P* }8 G& C5 C) ^

4.void Restore()

2 j1 S. d; v( I7 }

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

+ [, u5 X% u f- i# _

5.void Terminate()

' s w8 g# B7 n0 e

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

" B7 d0 g9 h# { l/ @

6.void ProcessMessages(void)

0 G1 j" i b' s% f' y, d

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

9 ]$ ]! I' j6 ~+ Y

中的消息

6 ?0 e; R6 \+ r* H# `/ I P

三>事件:

6 c+ I% d8 I! ?5 _

1.OnHint

* K1 L+ F. ~9 z+ G% H( ^( }

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

8 y; `+ [( G" M/ f. P

示显示

4 ~% j5 n A. n" A$ u! \$ i4 Y: l

例:

x( K6 N, E) w4 P* {" m$ B

void __fastcall TForm1::FormCreate(TObject *Sender)

9 _+ ~$ z5 l0 G9 m0 \, |

{

3 B; A9 y( Z O `. c

Application->OnHint = DisplayHint;

- I" h, c) i! Y! h- k6 N' V5 S( b

}

" H" R& M4 u4 z& A5 K3 H

void __fastcall TForm1:isplayHint(TObject *Sender)

5 T& B g: q q3 S- K* S

{

" u8 K$ _+ N$ L3 O# a

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

0 }' f2 j/ m- Y- t3 h* o9 s3 ]5 V5 u

}

, h' g6 r+ y' S4 D- K. D, a8 l0 t

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

6 G& b8 {' ^3 K4 r. j1 R$ D6 n

2.OnIdle:

2 w* j0 X+ J% A' G) ^4 ]0 M

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

" P4 R$ n: J% ]

的任务.

% p3 W$ D5 P& O, U: E* i

3.OnException:

$ o2 f0 d" c1 K' _

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

' i8 o9 j2 M$ x+ _

- w9 M5 Y( r, u8 J# u

4.OnMinimize

8 `: B' a+ \& A3 U! @7 \

应用程序最小化时的事件

# F2 \$ e0 P; G( z

5.OnActivate:

3 Z) W! p4 F5 w- N& }

应用程序被激活时的事件

, o. j( R8 L% r

6.OnDeactivate

" y, `' M6 P$ e' ]. @$ p; k) N

应用程序失去焦点的事件

6 B$ a6 B! R! C" Z- k K' @. ?

7.OnMessage

3 Y7 L5 h# O, I. n

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

3 ]* G0 N4 {. [' m

8.OnRestore

0 y: W1 I' d) W5 r$ K; p

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

7 e. g; d! b$ f' X& r

TApplication应用小技巧:

8 y! v4 s6 O9 f* e, J

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

( f4 H) c9 M! o2 _) k8 S

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

' M! Z, G+ X& X, @0 p, t7 @% O

AnsiString filepath;

+ t% K/ N7 t$ I% \ I4 o: q8 Q0 B$ U7 v

filepath=ExtractFilePath(Applcation->ExeName);

% _* {: i# B( J% x* _

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

% Z5 g" B% T! V+ \$ ]. O* q

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

( j; l' Y( y) W6 Y

Table1->DatabaseName=filepath+"data";

& V: {$ \* J \$ x

Table1->TableName="maindb.dbf";

4 R) t, Q" H4 T: r: A: z

try{

3 x+ s0 O; |) A: j3 N& w

Table1->Active=true;

; X$ L" r; P( D# D8 n f( @

}

& y" G7 r. q5 U1 B

catch(...)

3 ~4 k% h- G2 v" [/ r* Q+ K4 Q

{

! x6 ~" v$ [ z) J

//......

( v' t5 O/ J h- `- Z d

}

$ x# B/ p8 {: x' G" K

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

" ^' f! S: ^" |- R B" w

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

* f) m, s9 q1 m' w" o' i

B.自定义异常处理窗口

" T, d0 a7 S$ ^' p* G. D/ F2 k5 I

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

1 w( {8 h% L# j, Q

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

* S- G7 _/ i) k* v# L

void __fastcall TForm1::FormCreate(TObject *Sender)

! P0 L' k: T. ^9 i3 {8 W

{

6 x& G4 w: I) z* O! `+ [

Application->OnException = HandleException;

5 u; p1 H' @2 j: W; a9 T9 b: ^

}

. r: ~* W/ e( ]

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

+ k( L; ~* \/ C( h% l( C* L

*E)

# X& U2 H. J i4 r1 p

{

4 L" `+ K+ ~3 R3 s3 d

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

7 M- w4 p) w* {1 Q( ^( B( V

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

5 p3 k2 u5 R+ r4 E+ Z6 C+ h1 R6 ]

}

( l: ~# k2 l9 b

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

) ^) W. ?! B( a5 w2 t

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

}" W6 K! K! }# M. \

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

1 |9 w% X, O0 K" q3 N

用程序在空闲进处理.

8 u2 M; {% Y$ W6 D# g ) x& X, r+ `9 D2 N9 B

void __fastcall TForm1::FormCreate(TObject *Sender)

, y) u! I. n& z

{

& c# w: L3 \5 M. T6 V% u$ W8 q! r4 r

Application->OnIdle = updatestatus;

7 z# f! B% ]* t) F

}

( J: G/ u0 n( i

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

* A! e3 W$ ]8 q1 _0 W9 M: |

{

( l) O [2 i5 o2 L1 K

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

* _ @3 H) U, y% M. i

}

/ N$ x0 \2 ?% K2 }

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

9 a! M! p- X! G5 H* m8 ?

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

$ g. T3 e2 M: m, a/ ]' B& H

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

" G' C9 r! K2 Y% f. [2 ~

即可.

3 Y& a2 ~- x! f/ S4 v; F6 ^

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

& a% X! Q3 ^7 B1 M) y9 |) U5 Z

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

8 V# X$ p: h- K! |4 y3 f

Application->rocessMessages();

' c& _ x/ T. H @

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

; f5 R9 X# s: t! @6 g% c* T3 }; g






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