QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2315|回复: 0
打印 上一主题 下一主题

TApplication类的简要说明

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 01:10 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

; A' C0 d8 t2 v0 E. s' T TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一

; A9 }! \& `* ?/ z+ J/ ^

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

0 L# d1 a. ^. U# \& }3 ~

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

( W% t3 V+ E& X& t& T8 \4 b2 b

lcation的代码.

4 O0 u9 E Y x' J' c6 g4 O

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

8 X Y3 Q% {1 W, A, T, M

. J& \, u7 T5 N) Y9 U

一>属性:

& z$ x5 L" h1 s2 f; H

1.bool Active:

- a: q. v# E2 q1 k4 B6 w

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

3 G" P: V2 q1 j/ _) V$ [. e9 z+ `

rue,否则为false

+ h; C! Q2 S2 X5 t" q

2.AnsiString ExeName:

0 e7 a) \) U2 j* j

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

. Y2 T% W Y$ i# M" ^8 z/ Y# ^

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

7 V/ i: k, b% a* e

的文件名部分

& ^6 ~& r- `' `3 Y. Q

3.HWND Handle:

9 R$ s1 u# c5 T( ]4 ?! B

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

6 e& L. z5 M! Z* h2 e" x2 L, N

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

. I e% ~0 \" L( y/ `

4.TColor HintColor:

3 [ Z' k& n Z2 ?8 `" X

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

1 `) N1 u Z& F( t6 C

5.int HintHidePause:

2 K7 C- O( y$ H' [0 w; z" E5 S

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

8 J6 d9 t6 u2 Z

6.int HintPause:

% w! E* E+ i; w% P9 J! d# S

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

. _) y& D( Q$ l) F/ |

0ms

+ ]0 y( C% s5 Y5 r8 i

7.int HintShortPause:

& D `; ]3 Z! d8 a

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

! y2 l$ Y& E( |/ y6 H

8.TIcon Icon:

5 n, c U4 K2 y5 g$ U

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

5 R) V, n5 e9 X* A+ C& q

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

- E+ g4 G1 P W2 p

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

" N Q2 E6 Y' ]2 i# g

9.TForm MainForm:

$ w* T6 l) ]3 a; f6 |

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

& i0 I( l0 `$ q

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

) X* d& m* X' V1 {

10.AnsiString Hint:

6 u3 G m+ x9 S8 v

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

% d. a. K4 {! q. ?; J

11.bool ShowHint:

6 `! t% h, @& e. G' z2 T

是否显示提示

$ I* {" a" E7 p0 E8 Z* p

12.AnsiString Title:

8 V) b3 Q. g$ Z5 s0 }+ W: e

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

( y1 @$ x7 ~5 k3 @" t& x

13.bool ShowMainForm;

/ p# w1 W+ r* D+ K8 z9 i4 P

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

& M: n: ^5 l; t8 o: x/ V

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

/ ]. K3 }+ o1 m% l) D6 R

14.bool Terminated;

4 z0 D1 ?" E5 N- {

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

3 e* V, _/ m7 @, G8 k9 Y

二>方法:

# l1 S0 C0 u( k$ I# E% {

1.void BringToFront():

`) T& o5 I1 T" W Y8 `9 C

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

3 S* \! B' H/ u4 _# W" k; q

口之前.

2 a6 f7 ]6 T1 x8 e

Applcation->BringToFront();

) [ W5 ^( [5 }% U

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

3 [& i& S3 M) h2 S0 f5 U

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

+ O3 r' V- F2 o9 g) {# Z

MessageBox函数.

; e8 R1 ^- I4 Z9 J

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

9 C0 {5 b% u! Q! T6 [

caption:对话框标题

1 t, f* n' j! ^+ U$ I

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

( U" O( ?. T" w8 d; ] H4 N

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

+ s$ B) m( @ b, p

MB_OK:显示一个OK按钮

2 U' J3 o1 P8 E) F

MB_YESN显示二个按钮:Yes或No

4 G P8 S3 W9 N& T+ ?( r

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

- p* @% R9 a! G" A9 X

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

) L* a) q: F" D

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

9 H! n- W+ u7 J! H! K

缺省按钮:

' K8 T$ J, |( D, C

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

; `: J4 ?7 _$ V* I% m

按钮.缺省为MB_DEFBUTTON1

) w- Y c( U$ O

图标:

( ^4 A2 C8 G/ r: k) S6 O

MB_ICONSTOP:显示一个红色X图标

3 {5 J' l/ O& \8 d

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

5 U8 W6 Z n- J7 ]! D9 p

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

* h5 e; |( A& Z- a1 P( p/ \3 w

返回值:

, }: |8 @* P0 F& G) q `5 j

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

1 a; }# l6 D8 Z! B; `

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

' {) o! D9 ]# U; \9 Q* o1 X

NQUESTION)==IDYES)

. O4 u$ L8 T9 a" T

{

- S& e. S) H) n i# f( n

Close();

7 |) M1 m6 |0 D4 }) C' x

}

Z) P1 a2 i7 j( _! i6 p* x

3.void Minimize()

9 {7 K& i" w& Z' e' A: W

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

7 `& f3 f; W% l3 _% y: a

4.void Restore()

8 e3 Y8 F! a, u1 n

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

% A( K' {" t7 p3 z" C" W# |7 B. t

5.void Terminate()

5 }4 H% d) O- O/ Z

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

" ^5 @+ \3 c, x7 k* E1 H

6.void ProcessMessages(void)

" E' A$ @ a4 [

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

. T. d& s( P9 V) G4 U: B8 i& |

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

) r. {0 j. U6 `

返回值:

. N# K% Z W3 P* h; e

按钮.缺省为MB_DEFBUTTON1

+ A. c0 w+ K/ O+ h6 k# _

图标:

+ Q2 J! _/ g0 H

MB_ICONSTOP:显示一个红色X图标

8 `0 w, k+ M2 ~

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

9 Z7 t; ?7 _4 k7 d* B

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

e- J2 I' t9 |$ U. v( `$ z

返回值:

! R7 ?1 |6 ^) ?1 I

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

! t4 ]; o* J- H6 E

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

' a2 U( s" b. ^4 Q- s- g

NQUESTION)==IDYES)

& L; l( R9 ?% p5 F Q1 H

{

9 n# N& ^. y2 x) P$ M! h

Close();

; V; J) g% {2 N- F' n' n, }

}

9 L# c6 ~( z/ p. C

3.void Minimize()

% B* [ }4 z4 R% H* }' l7 h4 j" r

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

( \7 b/ l7 O t q4 z. e' K! a

4.void Restore()

" `$ d9 P1 t6 t, s: T

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

/ @! j V' [9 e4 V& @: i: u/ h

5.void Terminate()

0 `8 ^9 ~6 m) C' H8 T- |

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

1 E$ ~5 o. Y1 o0 t- l

6.void ProcessMessages(void)

. |* g" t3 i% E* v

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

3 g% p: s- o s5 m, l

中的消息

. N+ G- z3 [3 A8 a+ r4 J

三>事件:

+ ]' s+ h6 Q7 R7 ?

1.OnHint

! ?- e& m @' t8 ]+ m

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

: C; j. q1 Q- \ g! S4 [( H

示显示

7 `2 |/ N% o* a7 H

例:

* Z/ N$ I s, r3 l$ g) L' X

void __fastcall TForm1::FormCreate(TObject *Sender)

3 C/ W0 i" k1 ?

{

, V) d" L$ V5 x! x! p* h% ^7 A

Application->OnHint = DisplayHint;

' F. {) r8 d# @% p

}

% H; o3 y% a1 q9 E

void __fastcall TForm1:isplayHint(TObject *Sender)

: Q2 w1 _/ D2 a! ?/ B3 ~! e

{

2 O, Z) V- k7 g9 c3 }

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

7 A4 z0 \ M( `& }9 Q

}

* d$ L: I" A/ D5 W* J

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

: V& V# }# B" b

2.OnIdle:

! X' p9 Z! Z" r3 b2 u) B

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

N8 p: \3 h: d' ?/ y

的任务.

5 j1 k; C8 |% ~1 B5 b g; |( h0 T

3.OnException:

* g: V# G2 c6 f6 y1 L" X) _( b

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

) g5 w+ f$ M! y' h4 x& x1 i

6 I q0 J" j9 N% X8 _3 j

4.OnMinimize

6 l( h' p5 E4 l! y: H v/ U$ i

应用程序最小化时的事件

! C- \% e+ U; d$ r Q; \' a( ]

5.OnActivate:

" p/ _- m6 d. B0 ^1 r; \

应用程序被激活时的事件

' _+ M' f/ O7 w; A

6.OnDeactivate

3 i2 b5 B: D, e

应用程序失去焦点的事件

: k$ Q( o6 y, b: g" i; I y+ m( X

7.OnMessage

* L6 n) N- |& x" f1 F

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

# j* G8 B" H1 H; w1 @- P( q

8.OnRestore

4 Z- \# z4 b* H, d) ~, ?+ u$ o

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

2 P1 Z4 D9 k& ^6 [2 |2 |7 ?$ V* X

TApplication应用小技巧:

9 ]5 h# q+ Z3 I& \* i) ]7 C& @

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

/ q$ H4 V6 I; z

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

% v# i4 k1 p/ T+ o

AnsiString filepath;

5 a7 S0 M& P% M' v

filepath=ExtractFilePath(Applcation->ExeName);

C+ j% P' R% m; Z. c8 g' s' c

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

! a3 E) I- [, L' |3 R5 ]4 I6 |

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

* j" Q4 Q4 {3 X/ j, y* \2 q5 m

Table1->DatabaseName=filepath+"data";

8 u- {" G( Y3 }+ @) e9 j- |

Table1->TableName="maindb.dbf";

0 @0 Q8 o( l4 v( X6 q

try{

8 j9 d i5 k2 e. J5 E

Table1->Active=true;

) Z% h# G2 Q1 n

}

6 D2 ?! Q# g4 P" R

catch(...)

4 p" J5 H# l+ Z

{

3 g- E. I( H& I. [6 `- o v

//......

# B% `- t2 ? R

}

- E3 K* ]. z* R# ]& y, A. X5 g

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

: r% a) ^4 E. L% }6 x) f% U6 [7 P7 z

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

# y2 G7 {, N6 g, W# Z

B.自定义异常处理窗口

3 }2 a) w8 J9 G# Q8 |9 _+ J

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

) }. l- N! |% C# C7 U0 u7 o# ]7 y

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

+ `' m/ B6 Q( `2 d4 x

void __fastcall TForm1::FormCreate(TObject *Sender)

4 G8 ~7 {( W( H7 S( r7 o+ N4 K

{

6 |( U! w8 P6 I" G

Application->OnException = HandleException;

3 C0 U# ^: N6 W: L; p9 f

}

! V8 Z4 _" `2 Y# c. w% i

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

# @ t5 _7 r8 V' h) `! Q7 l

*E)

+ ], b5 ]0 D, p

{

, U2 d V! ]& n3 f+ \

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

& D% e% B, }3 x( A, }9 U* c( o6 v

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

, I8 C* s. P( Y3 E0 O+ O1 X

}

% [& L! X3 ~8 g2 ?

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

* M8 R! O5 M* o

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

6 F7 g& o1 d2 T

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

+ o6 R5 Y% ~3 U2 }" u

用程序在空闲进处理.

/ K6 @/ n( l! X2 i2 q % c, i6 B5 u- ^' |, `9 J( n6 q2 s

void __fastcall TForm1::FormCreate(TObject *Sender)

. y5 {4 m' O# z( m5 s/ l( {2 F- v8 ?% G0 s

{

' C/ K8 ]* V' m2 E" I* i7 H

Application->OnIdle = updatestatus;

* p0 B% ^* j( J/ e( K9 q

}

# M. C M+ i# S! x$ ~

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

5 h4 C/ J" t' r

{

3 }5 A7 u$ ]; X* N# {( k9 s

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

! X, k- G0 _, R; B

}

Q; y) ?- W+ ? L. O

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

5 i6 i/ U" }9 g& o

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

" m4 S1 g( O( R H! d

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

3 T! n7 P" n7 y

即可.

7 U3 \ G! I4 }, G

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

5 \0 e5 j. \4 z

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

z" R1 D# E0 E

Application->rocessMessages();

/ A' D6 F* J7 ]( |

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

& J8 n/ O2 g+ r- T/ b! M

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-8-13 05:44 , Processed in 0.413569 second(s), 51 queries .

回顶部