QQ登录

只需要一步,快速开始

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

TApplication类的简要说明

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

. c4 ^. H& ~) ?+ ITApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一

8 l9 a# `: ]9 s) X

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

: Y1 J, l' V* k

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

6 m, Q2 m+ Z7 r$ `6 B

lcation的代码.

0 P6 t) K' W V

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

3 E, A5 ]7 Y9 c ]. V+ [# M

. m3 F i# |+ X9 v6 _$ I2 S" \

一>属性:

+ U9 b; j- C) ~* M( g" ~. u

1.bool Active:

7 L8 E$ x$ H6 ^; A$ a1 ^2 u1 x

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

' f; s" p0 J& ~% r7 Z7 L1 I

rue,否则为false

2 C- K# w* N- K. d* G7 r

2.AnsiString ExeName:

2 i. B' I! e" c" m

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

2 {6 f/ J! w/ ?2 a: d' ]

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

B5 r# C" S$ F8 i; W; {

的文件名部分

7 S: [4 T- {% \- N; w

3.HWND Handle:

4 y ]" z9 g0 z6 f

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

2 E. U' L9 i( q0 I. i: \, r/ G1 u

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

9 G( h* @' K- A& g; ]9 d

4.TColor HintColor:

* Q" j& `+ C6 F; j% W/ ], J$ h H7 j% D

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

! a3 y- a: A! U E6 R1 W

5.int HintHidePause:

+ k; {9 |; K6 Y0 p1 }7 j) ?8 j2 q

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

" E9 S# T! ~" {2 L

6.int HintPause:

4 |, F" B# O T0 S9 ^: k1 s

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

, z+ i. v7 j M

0ms

3 m" }1 @' Q2 J( T" }2 Z8 T7 B4 b4 @

7.int HintShortPause:

) i& R+ w& O" H

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

5 B p0 B1 \" ~% J, q9 \/ \

8.TIcon Icon:

: e' k/ ?' C; o

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

3 j+ j2 |- v( y( s3 x

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

l6 q. \, D& C# S5 \

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

, H5 Y: y3 y. B' V

9.TForm MainForm:

. ]7 z; ` k/ L* n/ P* I

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

' k; D* C4 b( G& O0 b

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

/ P) x( U+ P0 |9 b G8 F

10.AnsiString Hint:

2 G: F- Z3 O1 @0 K& K

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

4 H% T/ z W: Q" G1 \4 R

11.bool ShowHint:

$ b. R7 K4 d2 d' P/ T

是否显示提示

5 u( q/ e1 _: `/ g) Y9 G

12.AnsiString Title:

, x) l! [; P H# u4 d4 b9 U

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

1 z) m1 @3 i$ w4 X7 u/ i

13.bool ShowMainForm;

1 K, U6 E, D' Z1 U/ B' z

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

+ P' a. c0 l+ H: ^1 T/ f

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

! F/ z) N |3 p

14.bool Terminated;

+ }- x* G5 |8 ~3 w

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

& _! e) P* h5 [+ W( E, |$ H

二>方法:

0 _0 e I0 l8 H4 m, W/ H: O p! t

1.void BringToFront():

! |& g6 j, B) B( }3 X. o

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

, T9 Y9 W# ^8 O& K

口之前.

2 t+ ^( h/ S7 H3 p, {

Applcation->BringToFront();

3 b) L, i) I' r- M6 w' f# x

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

o" r7 S/ y6 d9 `4 \% }) X

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

- S. b1 |+ ?. j; Q% B! t

MessageBox函数.

" F$ X! G- C' p: k

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

2 w* T# n: A( t2 D- b! L

caption:对话框标题

6 Y/ f& }2 c* h% [* u7 \

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

1 Q' G0 B* W- I3 U2 F

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

7 l6 w9 [, F* Y2 E6 t& @, r8 P6 ?/ D- |

MB_OK:显示一个OK按钮

" z# n+ ?8 x* \1 t6 R- u8 ]1 n

MB_YESN显示二个按钮:Yes或No

$ Y. S# i) A1 s; u

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

4 k w* n& x" L y

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

5 d8 R& C% k( D* `

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

; {! C8 G8 f, z V4 r$ `

缺省按钮:

& ^7 r1 V" h. R+ ?

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

: n3 y0 R E# I7 _* n6 J/ X1 S: h

按钮.缺省为MB_DEFBUTTON1

1 q; G. i r. m9 g

图标:

; [0 D+ [# W5 H: Y

MB_ICONSTOP:显示一个红色X图标

" @! ?9 J3 J+ S" y' d- a, }

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

2 _0 f# \! ~2 y$ n

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

) t$ @" e+ o8 w7 ?! _" Y

返回值:

$ l o, i, c# g8 ]0 ?

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

! _' w6 E* Y% H5 S% |; w; L1 P

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

* W' ]: k! h$ S J

NQUESTION)==IDYES)

0 e$ Y* W# A0 I3 K5 C2 ~2 ]. G6 \

{

7 `" U2 W9 |" U6 S

Close();

g/ ^9 Q" l x1 J3 z9 @# \

}

3 T% q. H: \1 E9 {* o

3.void Minimize()

9 q+ d8 N1 R) N" {

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

1 o1 o" A- A% r9 c

4.void Restore()

' V2 A4 e$ u O+ i: B

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

' t( L: [% B4 v5 |% P

5.void Terminate()

; ?/ r- K# u8 a+ Y- R, _) L- @9 m

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

' e; i0 b2 _0 ` l+ |- ]

6.void ProcessMessages(void)

1 L' \! G2 @& E6 ]/ n$ Q

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

. p; h& |4 @; S- y- M( E- S2 u+ O8 p

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

& h0 U5 {* [+ X' M! Q

返回值:

/ M9 T$ \. M, X7 U( k" C6 f

按钮.缺省为MB_DEFBUTTON1

- Y# \3 Y9 N( v m r* f, {7 y

图标:

9 t5 y6 P7 [5 R$ o

MB_ICONSTOP:显示一个红色X图标

9 c# S, q3 f! E/ ?, y" c7 X

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

7 s- ~) N! G+ f# n

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

' @0 z: K4 t- J m* L0 F6 L

返回值:

, I5 D6 }& R' R4 f

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

- l& W" Y4 e9 v

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

6 @* n. W2 ~, E8 g. d, `* x

NQUESTION)==IDYES)

- k- _0 A; Y, U- B9 X& H8 f7 u( x6 C

{

3 Q* N. `* z4 n } F

Close();

* Y( c+ O* ^, E) P' _6 b

}

7 \+ u- h8 Z6 H1 k7 |

3.void Minimize()

) {% D6 `/ r8 B; c3 o/ X9 ~7 v

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

4 ~( j# l) ^: J1 d2 D9 t: r

4.void Restore()

8 B( u" u' [0 L; g; m

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

2 E) Z. y# j9 a' `' s+ e

5.void Terminate()

" G1 O7 S- m: @& @* i' T

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

- e5 Z/ r2 W6 D, X

6.void ProcessMessages(void)

8 h0 F# _2 f& ?2 j; h+ \8 R% }

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

# k3 v9 `& i! y+ w- U' r

中的消息

! t1 L) s' S- o: y- F/ T

三>事件:

6 P# m9 p! d3 S, a

1.OnHint

! _! a8 R$ m( p% z

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

, ?# ?3 ]& B3 Y0 F6 t) Q5 H

示显示

3 V( \/ o w0 ]* s! S4 O" i

例:

7 a5 b H% u, ?" D- M

void __fastcall TForm1::FormCreate(TObject *Sender)

' t$ P( k8 i9 i1 W8 \

{

) H2 c1 X, B. O

Application->OnHint = DisplayHint;

" ?% g5 e8 d! j% h- l" A

}

7 N' U3 ^! J" q" r, H+ z

void __fastcall TForm1:isplayHint(TObject *Sender)

- n2 w5 @5 p- {# Z

{

: p- g* U: Y" X8 n* L* z T

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

: w: ?4 N* N9 ^1 T9 ]

}

g, S) r7 b& d# C8 i2 e& o& z

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

8 H0 _$ N( _# ]' s

2.OnIdle:

s* Y) ~$ P p( D7 [

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

9 K, s* [" G) y7 k

的任务.

( I! x o, D$ u* D

3.OnException:

, t7 p+ _" g/ t/ M( o' E" R

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

: U) X: q7 r+ h6 L) v% p3 x: v f

j% v$ Y" j2 _4 O* ]

4.OnMinimize

# `# p& M: ]* Q

应用程序最小化时的事件

7 }' I3 \" x- k& w/ z9 N( u2 r

5.OnActivate:

/ G1 f+ {6 N% [

应用程序被激活时的事件

' m+ z! j) b* A( g# b: A

6.OnDeactivate

/ q/ P4 n% Q3 Y

应用程序失去焦点的事件

' h9 ^0 I3 v5 q. i

7.OnMessage

8 g. r! S3 A& n* ^- g. o/ j

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

2 }+ \8 d# ]3 L/ @% Q: d2 \

8.OnRestore

/ n3 q1 U6 X) M& z# |4 v! i

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

* g y/ p# D% u) k; T8 O

TApplication应用小技巧:

% A' I' _6 k1 e

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

1 Y- E" V( B/ ]- ?2 e2 G6 e4 e4 Y! h

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

+ e3 B( x- J ^ S6 n) F; L3 {

AnsiString filepath;

9 q& q, h9 y3 V& S$ |

filepath=ExtractFilePath(Applcation->ExeName);

; X9 w6 D( _7 x$ I3 x! h

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

4 o# D3 z& R! }5 c- B

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

1 {6 q. _ L& h/ s! K+ E+ l

Table1->DatabaseName=filepath+"data";

' Q; q5 t7 f, r1 t( @0 B# i

Table1->TableName="maindb.dbf";

" r7 R' r/ C9 F5 L e+ G

try{

" s( S) X4 k; ~. p8 x, m+ j

Table1->Active=true;

3 b- n. R+ P$ T4 `: N

}

$ J! O; _. z3 `3 {

catch(...)

7 g v/ E3 E: p) \: ^; W

{

7 s7 y' e7 @9 b! Y) ~

//......

8 K4 T3 R" A: g+ Z

}

7 y3 i' l9 p& b [( ?; w8 k7 p

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

& a' v: S/ O3 u; N; e J( E* i

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

# U. U) g: c7 M5 B1 O

B.自定义异常处理窗口

( w6 h8 L; L4 ~

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

2 F) U7 G. p+ F. K: D5 u7 w8 @

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

' U- t8 {- \+ R* z

void __fastcall TForm1::FormCreate(TObject *Sender)

+ ?$ ?% b$ @4 Z* i+ h

{

# E* E) j5 `3 g1 C% @7 t

Application->OnException = HandleException;

$ Z) d+ F* o# X2 w

}

" d( r# W$ y9 F- K) p! U3 O

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

1 M% s4 J/ \7 D/ @! F

*E)

) Y" S$ k0 c, C" A$ V6 \) w

{

" Q3 V+ ^9 x% y0 I

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

; `/ s) y# l, T: B

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

! I, U6 u3 P2 f3 C+ N$ t

}

5 p7 k9 @4 K8 R' t* [) Q: Y

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

7 c: v! V. T; ]! P0 i9 w

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

; m/ R9 v! r$ _7 j: B

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

7 L/ o' |" T! z& v

用程序在空闲进处理.

, j3 Q- m! R$ a" A/ b" G6 T8 C# P3 b. g6 [

void __fastcall TForm1::FormCreate(TObject *Sender)

; V5 E$ s [! ?# m% D

{

9 }$ g6 p* D; h. q6 k

Application->OnIdle = updatestatus;

, b2 W; M$ k* z& s8 n/ X3 O k

}

& E1 P! G9 b) G

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

& P/ }( ^9 R b4 {! w1 @; ?

{

4 o3 [" k" S4 f4 w5 f

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

/ r; m! L& }& z, T1 x: L# W# z

}

& `8 K, h+ J" ]7 n, F" M

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

0 T" Q' H5 _* U1 |

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

6 n' D+ q h) M

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

* | j9 D L( E0 q$ m( h

即可.

7 b# a/ p* H2 z$ R8 A) r! [

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

! H( Z' O% q% j! }+ c

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

7 ]7 @) @2 V+ K+ I/ d: A" V1 @( w

Application->rocessMessages();

9 g7 [5 n1 ~# l" P! M

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

$ W h) e0 y8 T! g' k

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-11 19:50 , Processed in 0.437448 second(s), 51 queries .

回顶部