QQ登录

只需要一步,快速开始

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

TApplication类的简要说明

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

T8 e, u- w ^' Y3 Y% u0 v TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一

5 }' S2 C6 N- u5 w8 |6 c7 V

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

) n7 Q3 R, p3 Z

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

9 }& O V9 ~' ^* x3 b- H- W

lcation的代码.

- `# K$ U8 a# }9 @# n

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

0 Q, p/ S8 n1 z3 \

* P8 i0 Y) v4 u

一>属性:

$ `/ B2 d8 k! T8 D* ?" s

1.bool Active:

2 c* ?0 U( K1 i

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

# j X3 ~% G. G

rue,否则为false

7 A/ z' R# H; o# h! U/ _- Q

2.AnsiString ExeName:

( }. w7 `& Z8 g! i; @( q( }' f5 w

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

; g" z0 R8 k* U9 ?# n5 g

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

c" b- b. y" v9 ]& P( U

的文件名部分

) ^7 O- y0 A) E: _

3.HWND Handle:

' k2 ~- b2 [' K( I! K

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

+ C" l5 r4 ^0 j( B

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

9 F$ s; Z' i( q6 _; y. V% o, @

4.TColor HintColor:

. [0 x8 @: G# f! k4 [

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

6 ~& D% c' |( k+ `6 E

5.int HintHidePause:

( ~3 F1 T; V- ^9 o! B

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

' d% T' Z' X. y

6.int HintPause:

# a G6 w: x5 m. h

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

) e- Q: g) o( W7 }# z: S0 R' M

0ms

/ W2 X! d+ Q' a% O/ u/ ]' b

7.int HintShortPause:

2 {% W/ P3 b7 x/ d* \

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

- E% E) r- d% Q! }' w! }" r

8.TIcon Icon:

8 f0 f _1 H, d) y6 a1 c5 k7 B" d

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

4 e. Y1 o5 ^8 n0 A: S1 [2 L! u8 D1 S

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

; M% X; Y E2 v# C9 d I$ C

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

, c* p2 [+ H" w( m0 u# q+ `; m

9.TForm MainForm:

. e8 ?7 X$ Y5 ~% n/ j$ I

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

9 i, Y* y0 g$ T2 Y# a

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

$ b% Y+ \# V4 `8 L5 z

10.AnsiString Hint:

- x: u- k1 [1 L3 {

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

$ C6 J% I6 q; b/ l& c: Q

11.bool ShowHint:

' n' O) V/ V* N/ N2 |# H

是否显示提示

8 k5 ?5 D# @# c/ O/ r

12.AnsiString Title:

" l; I- o; ~4 T

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

$ i* Q% s$ U, }, E) N5 }

13.bool ShowMainForm;

8 F8 a+ M8 D! a$ i+ U6 z. V7 I( F

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

9 f! _* K: X- u. v- ]

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

2 Y7 l" m' [6 b0 B+ \

14.bool Terminated;

% c! z/ L) V9 V) O9 q

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

- ?7 K, N& `" p8 \6 C* h F

二>方法:

6 K4 I1 E( p1 _# n2 B

1.void BringToFront():

5 e. {, d8 a: S, s; s9 x

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

* T& g+ T1 q- F6 ]% {6 i

口之前.

) B' l; d$ {/ }7 x, J

Applcation->BringToFront();

+ F6 X3 v3 E0 R/ F

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

1 [. o2 B4 W Z4 l$ w9 Q% T$ ]1 b# ?

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

) z! J+ J" X2 N3 I; u/ B

MessageBox函数.

& c8 [$ c0 k/ B

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

- v* N2 F! o. d- s* V

caption:对话框标题

( C% [- p- q! }/ n2 o& }

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

7 Q* w7 U+ L# P( D& h, F

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

) A' j8 G7 Q! V( ]2 p- I1 c$ u

MB_OK:显示一个OK按钮

0 h. r; Z. X) x! Y2 k; S

MB_YESN显示二个按钮:Yes或No

3 T8 G9 @' L2 o! i

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

5 n: ?9 \' X9 d: N b

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

+ a, |, @" C, }5 ]# z0 n, Q

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

0 B5 f% ~" U) a& d- y

缺省按钮:

+ C$ w* m! x* U. p* R

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

) K; W* u( l7 E: F& x

按钮.缺省为MB_DEFBUTTON1

1 F( s$ b# ^0 e, o# Q- I- ]/ y' M7 @

图标:

% ]' k9 k2 Q [& z

MB_ICONSTOP:显示一个红色X图标

6 S% ?& f9 n/ r G3 j7 y

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

2 o' u* f( U3 o7 s! w2 c

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

, ~, j- y! r) Y9 k( m* H& g

返回值:

/ ?4 I! C3 \( Z7 U

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

5 y/ u% `' Z# J) s: m \, _5 o

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

2 H. n9 G; F8 G* r; {+ G+ m

NQUESTION)==IDYES)

1 x' m% @% \7 y5 n3 b

{

0 H- s& n; u) M

Close();

4 ]3 e5 E4 L s% c Y. O% E9 ]# Y

}

5 \- B# v7 ~& r7 A( v& }# f

3.void Minimize()

. `) q& ^7 t3 C: ] u

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

9 x% V# q5 @" L4 j! L

4.void Restore()

, {) Z. W2 b7 [

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

2 l' @* G, D: X" c- J K, i% c

5.void Terminate()

& G# y6 Z3 y ?- E" D g( W

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

+ ]7 ?; Q. K# K$ G, Y

6.void ProcessMessages(void)

4 \; J: K" s& \, P* a k4 ?

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

2 R4 a1 O/ d, S9 _! o* L+ m% ^5 }

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

5 c4 Z& z1 N% C0 A* w& F

返回值:

3 ]& p( E9 x' a) ]0 E+ S- R

按钮.缺省为MB_DEFBUTTON1

2 z2 l6 h# H$ j, O

图标:

6 b" ?" g2 \* Y j2 e. A% t

MB_ICONSTOP:显示一个红色X图标

: ~7 y$ y2 h% U& B' E- e" D

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

) ?9 C: B+ A( V! a4 b

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

, j+ K3 l6 u, w+ a4 b$ R- }3 S* E

返回值:

! e3 B: l% K* h

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

. H3 N) E* P6 O4 I: n8 v" F/ @

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

8 u5 O, i" _6 y0 j, I0 ~

NQUESTION)==IDYES)

% l; ~3 \" `( h9 M' _% F6 Z3 [

{

( q0 z# u6 X) p6 { j6 t

Close();

- N& i' h: [' P& h- g

}

% ^1 r ^1 I2 {5 p

3.void Minimize()

2 q" F4 Q* ~2 x

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

' O6 V d) I& _; _' W

4.void Restore()

" S( i7 D, a$ b, a

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

7 y7 P s/ }6 h1 T! z

5.void Terminate()

+ w3 o' _& O" F( k

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

* b3 v# W8 \" ^

6.void ProcessMessages(void)

/ o6 j# { i4 x5 A% y

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

* a: t3 }; z5 k. e

中的消息

2 x- k( D( y, }6 M

三>事件:

* g$ }. v- n) S( O5 A

1.OnHint

" J# v' A2 l& J2 F8 _% r1 t

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

+ V- O7 v5 K) Y

示显示

9 u2 M2 w+ Y6 ]) j

例:

+ z. N T/ m0 r1 u+ {

void __fastcall TForm1::FormCreate(TObject *Sender)

% R: r6 z, X9 X& c+ A

{

3 y1 \3 p1 o: Z6 E q) `

Application->OnHint = DisplayHint;

" W. i6 c- \" S8 b! T

}

9 Y+ h ~+ ^. A2 m6 |

void __fastcall TForm1:isplayHint(TObject *Sender)

2 S$ d h8 c; @* O" W7 I

{

. X" C: n; B9 L8 L# i5 @6 C

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

/ N) k2 _! z9 ?* D% c5 ?0 }

}

1 ]! k! u& i/ h/ K0 c& U

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

! Y( ^0 e$ I8 Z2 A( r

2.OnIdle:

: X# U2 N% _. T2 Z" \+ H

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

+ u2 N" f7 x; o$ R- c7 y) E$ S' t4 M E2 x

的任务.

. ^! I' J8 `: C( O0 C/ f; [

3.OnException:

' S: i! d: |, {9 O+ g

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

2 P2 j& y, J$ S7 Q

9 H" K/ H# a3 n6 o1 _/ _

4.OnMinimize

$ V* e. x' h7 l8 \# c

应用程序最小化时的事件

, j* d& x( d6 g/ z# N ^, X' o

5.OnActivate:

8 [* s/ g% S! W/ B5 B

应用程序被激活时的事件

" i4 R3 R7 s% d

6.OnDeactivate

; j L7 s9 f6 P

应用程序失去焦点的事件

/ u" r' h' }8 M4 b' a0 a

7.OnMessage

8 E, W' ~" P) }% U4 t- x, {

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

- n3 x7 s. a/ V% O7 g

8.OnRestore

$ ?0 e6 Y. J ]

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

8 z6 h! o$ b! K! D3 X0 B( g8 s

TApplication应用小技巧:

4 `( G: z8 H- O+ {2 X" F9 B

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

1 A* M. m ^' U* [

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

& M& _( W) q5 O# J& n

AnsiString filepath;

5 w$ F2 Y' i: K0 y S7 V, _

filepath=ExtractFilePath(Applcation->ExeName);

1 A4 O5 Z0 M! ~' e

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

$ N* Z& h. C( A2 C/ p

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

6 b) Y& ?5 T8 T; v7 u3 [6 J

Table1->DatabaseName=filepath+"data";

' S/ J6 P+ x: Y9 } Q; ?' S

Table1->TableName="maindb.dbf";

, v5 X8 F* A; I# R% k- M8 l+ v

try{

; ?6 @/ k- y! w& F

Table1->Active=true;

( i& r; Q. h* s

}

7 a5 D T5 V: Z6 v! v( c% S

catch(...)

# a& C5 l7 O+ u1 a

{

3 a# h6 X1 s6 i& w9 R

//......

0 l. l3 m7 `& c1 O& L

}

* {/ {+ R0 d: @) I

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

4 n- D( O+ g- G/ W1 H

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

! o& D' }+ t6 E8 I

B.自定义异常处理窗口

7 {/ F8 r4 g$ r: |

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

* F l2 ~$ r3 f* Z6 s7 j/ E

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

2 w" ^4 H; C1 F* D/ _

void __fastcall TForm1::FormCreate(TObject *Sender)

: c" G( V8 T4 Z/ g

{

8 s/ O# j7 ~3 B; o

Application->OnException = HandleException;

1 _3 `6 R$ C% l% g5 \ Q

}

' X' f, G: g- o

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

" m) G0 b' n4 J6 @- X$ a: ~

*E)

1 L, X" Y4 C) f. V

{

5 l1 k5 E3 }! T8 w. {& s. ^

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

) u1 s' M& O& Z/ ]

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

; L( k: v; B* `

}

$ u4 t& y! O2 R* |4 W) W

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

- i* K; S+ t' ?+ g4 L$ Q. O1 p4 V

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

/ C! k# T& f" K( P

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

: Z' V0 R, I$ C8 w9 O

用程序在空闲进处理.

' _% q9 t& }7 d+ ?" S% `1 a6 _9 b! x3 o& r. h" U

void __fastcall TForm1::FormCreate(TObject *Sender)

) w# w- t) w' `5 X

{

: W8 T: ?0 c. A: L

Application->OnIdle = updatestatus;

2 m% K1 d6 T3 K% U- G, |7 G, b: c

}

8 q3 |# W5 o' D. x6 b2 r

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

- z, Q& M$ `( z+ h- y# D

{

- g1 ~: n* Y/ P/ M; |

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

) D7 p1 K" \( H0 H( q' I9 q" P

}

: G8 x7 J- l! Q3 ^; S

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

4 @* {+ I& q) H

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

! z% t# Y* i2 i; f/ c

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

: q3 G' ?4 g, k4 `7 u( S6 `2 E

即可.

% x( g$ I9 ~1 g

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

1 @# F! k- K6 W

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

% I4 {1 Y( S+ E; _2 ~

Application->rocessMessages();

( ^+ u- t, z3 i/ e- R+ ?9 `, B2 v' B

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

: s) y6 B6 c& J e5 E3 a% x

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-6-12 20:07 , Processed in 0.478115 second(s), 51 queries .

回顶部