QQ登录

只需要一步,快速开始

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

TApplication类的简要说明

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

$ o6 _: m4 t! d2 [: O( z8 y TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一

1 Y+ k0 ?8 E8 o6 j, y# g) {3 p

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

_8 ^9 R9 [7 b( g: B3 v" X

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

( B- l i, \1 [$ n& \' n

lcation的代码.

# q9 z2 m7 }7 ^+ m1 f: e

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

: [) W, Q' ]- d! E8 v$ [' y

: r# p% @" Q9 b, M

一>属性:

6 V1 i |( E' X; ?' o

1.bool Active:

0 k, i6 D$ A4 n) {( R" Y! m' M

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

9 g2 t1 f3 x% |

rue,否则为false

) g' E5 C) ?2 K/ J

2.AnsiString ExeName:

& i- N2 x0 I4 F( H

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

3 q$ Q* y" I6 ~

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

( q/ r& }* \" ]# q: B

的文件名部分

- U W; B6 M9 P) c$ L) R2 b+ R" x

3.HWND Handle:

" v. L8 M" y, d! o* G9 {

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

9 O! L! Y9 Q$ f o( D6 E

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

/ F8 I" x9 t; I, q+ c8 I( w

4.TColor HintColor:

_, a, |) l* W& a

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

r3 q. ^' s6 {( W% x% c" o5 X4 t; O t

5.int HintHidePause:

$ C8 b- V4 Q) W$ [' P ^

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

. Z8 G# A, l4 j' F0 L) y6 Z/ K

6.int HintPause:

{# H' V$ @4 n

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

6 c }, T: k- v' r! B

0ms

$ }3 V# ~0 [ D- F

7.int HintShortPause:

}6 n. N! w1 f% r% ?

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

1 m) k8 F* _" K8 R, t& d* K8 q' }

8.TIcon Icon:

* v& K; k3 l1 p3 t* O3 D7 ^

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

9 ^, k7 U$ G2 b2 q

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

4 X$ d5 n" z& G) B$ r: v

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

& p# d' r; R( Y/ J# y

9.TForm MainForm:

: ^6 Q3 S, ?/ L

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

3 t# e1 l0 Y: ~) m' s; Y; i

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

* U! Q3 J) V+ z+ t9 ]* |

10.AnsiString Hint:

% z* I: _, ~$ @ i% l

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

2 G2 y: }3 @6 s" X& v5 d& I+ [

11.bool ShowHint:

/ X( C0 [: ^9 \% K

是否显示提示

% w# x/ l, P* D, ~' q1 ~ ~

12.AnsiString Title:

& h) S' V7 n2 k( S5 d, D

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

* E: h7 L j' l9 T6 i8 w2 T

13.bool ShowMainForm;

8 K8 `0 [6 K) B3 R

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

; j5 B* V$ p3 S$ }

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

+ d! h% e: n4 @7 q

14.bool Terminated;

8 ~; V' B% a9 Y: q6 H2 W& f6 H" G2 Z# z

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

! q2 U! W' d& `! p

二>方法:

+ j. n' a4 d5 a8 i2 x: u

1.void BringToFront():

# w0 g5 i- [) {/ ]" k5 d

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

/ K2 V! T) T# c8 l6 p$ s6 ?) ^% L

口之前.

T8 Q0 y3 y- g: _% T

Applcation->BringToFront();

9 C y% v6 W& b) d* ?$ N0 `

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

' b. }7 P+ ?1 M* N

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

6 T& k4 Z6 ~9 |6 q7 W3 W4 `

MessageBox函数.

2 q. U4 Y/ Z- e. r4 N

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

0 @/ W% d# r$ |% M5 R

caption:对话框标题

8 U$ V( R, v% m& r& b

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

$ y: o% O( Q) h, L; w+ E

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

% e5 O8 P' U* {* a

MB_OK:显示一个OK按钮

, o1 P# Y# _6 H6 ^% [0 y

MB_YESN显示二个按钮:Yes或No

8 Z, |* j! \8 ?8 u8 o9 u1 m. m* i; @

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

& A1 N8 c, h E w! P2 M" d4 [ C2 o

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

0 f3 e, A O0 V6 p/ K, I' K! u* \

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

3 l) _- P" D" a3 k6 `

缺省按钮:

5 C( ]2 l `; }$ f3 n# c$ k f2 |

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

7 H6 D% P# q- f2 |, p( Z

按钮.缺省为MB_DEFBUTTON1

6 j7 g; F" Y* }+ N- m! {9 p& W

图标:

! G. Y0 @: Y r% S9 O- n$ _

MB_ICONSTOP:显示一个红色X图标

, n E: V5 A) P! G+ b# ?: r5 W

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

! s0 K' c- f' u/ ^$ U! O& j& E) d9 f

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

6 H2 N: T/ k. @/ c+ _

返回值:

. u5 d* `/ I" d" R; w E

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

0 b7 O+ ]4 X( S# f! J3 R

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

. M8 K" k2 R% @) y! O" @9 Q: V4 i

NQUESTION)==IDYES)

5 }9 f( T! M* O7 } o- r

{

, K0 A. a+ R: ] ~/ f4 W5 i

Close();

- P: W( `4 d% D7 }

}

5 z) a" Y" [: B7 o# a6 s

3.void Minimize()

5 m9 ~1 h+ x- U1 k

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

/ L# R. L7 s7 ~

4.void Restore()

3 P7 B' b( F% V+ I

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

4 O! G. Z( `2 {8 h

5.void Terminate()

6 N2 \) [) p' k9 |

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

; _" E9 e3 H% J, A. o- q8 I# K

6.void ProcessMessages(void)

# L2 @6 Y9 e/ T2 ~. S* @$ C

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

Z; V7 m. z! ]9 v6 A2 x E

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

# V8 e4 B! S W3 e# h* D3 |$ D

返回值:

8 M; e( ~/ e0 \: Y: u3 T! i

按钮.缺省为MB_DEFBUTTON1

. @+ B v6 l" x# w: N

图标:

/ `2 b* {: S/ b5 U" k

MB_ICONSTOP:显示一个红色X图标

6 e* R% u1 W! J; c' P: J

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

' {, X! q4 I# Z) T6 O

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

# f8 Q/ B5 ~6 c V& t

返回值:

( ^ r8 ]1 z, p/ L

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

5 w( ?9 Q' u: z. D, o

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

9 Z5 Q/ I- [9 Q5 V7 `: b% ?8 Q

NQUESTION)==IDYES)

" ~2 x; |6 C8 M( s8 x; h4 }

{

, o4 F6 {" V+ \5 n7 x. T

Close();

: b: \: Z1 W# @; u* }: g1 u0 s$ m

}

8 a3 N0 O( i" w/ j* q# n1 f; q S

3.void Minimize()

. {9 r! I6 s6 p3 M# f# x

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

& O) y- H' x4 k2 D# S. O

4.void Restore()

% v# k& t* v( G! i* E: Q

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

k2 R: J! M+ W9 ]' D" f

5.void Terminate()

' h4 m7 A! Z* Y$ y

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

# U) j: y( x- M

6.void ProcessMessages(void)

; N! a3 p/ r f

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

3 |: m! o$ e: v) z# {

中的消息

5 l2 Z a, M+ u m- D/ Z- z

三>事件:

5 g# L. F6 Z7 J/ R

1.OnHint

! h! Y: b- x8 E; Y# ~& e. c% P

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

7 l3 x3 `. v) h1 ^. m4 g. H }

示显示

- q2 w- _( x5 K/ ^/ F& M& {4 v- |

例:

. U6 }7 ]% x2 f+ t

void __fastcall TForm1::FormCreate(TObject *Sender)

" y7 O/ I8 q6 K0 w+ q, A

{

# s; h x- A' [0 W# c, j

Application->OnHint = DisplayHint;

& e9 \) R4 I5 ?/ R5 w; \

}

! u. _0 N; `/ [! x

void __fastcall TForm1:isplayHint(TObject *Sender)

& r2 q5 R& o* L" D L

{

8 X6 P. N2 {6 X Y6 f& [5 ?; o: I

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

6 l7 G* e) ]- h; \

}

+ p: j, J b$ | O7 O

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

: ?: j. X: j2 n5 ]

2.OnIdle:

$ o: e( \( |' `0 n$ O

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

$ d' b; O2 I' q8 z$ [2 a. y) Z x

的任务.

7 z+ X7 d8 k2 i0 A( B6 n8 g0 I

3.OnException:

5 V- N6 ^0 a2 a% E# J8 v

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

7 W' d( y) F' S( }6 F

$ f% `6 H8 G" g4 j+ b1 c" C

4.OnMinimize

+ C6 {4 b6 Z5 Z% \- i

应用程序最小化时的事件

* i' z% o7 K3 W

5.OnActivate:

) y6 I T* O! N" M0 m' r; B

应用程序被激活时的事件

# q2 z* p3 `& i, g; v+ k

6.OnDeactivate

# v& u5 m5 v9 ^! | t5 ?

应用程序失去焦点的事件

: ~) k3 t" M: @! c$ K

7.OnMessage

+ `4 W4 R# }) V' I

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

6 h' P) s" c! t9 |

8.OnRestore

7 n) y2 h# N* [+ }* ]

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

+ [3 Z$ i' r4 J# l% d9 |+ C4 ^

TApplication应用小技巧:

, Y+ n; h" ~7 Q, n+ ?+ L# g

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

/ W6 \+ p' {" ~8 z- w! i; ]. O

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

5 J1 d- w' _/ l8 g+ a# D% r4 u- M

AnsiString filepath;

" c- T, n' U$ ^9 h$ p+ o

filepath=ExtractFilePath(Applcation->ExeName);

; l0 P6 u2 h" w

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

( S( e& L' r" L* g" ]6 A) b

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

+ z9 B/ r2 r% r' [

Table1->DatabaseName=filepath+"data";

{+ o/ G6 m; D# k7 l5 `7 |0 T1 C Z

Table1->TableName="maindb.dbf";

! v1 Q5 e8 F+ {- M7 J- Y

try{

8 O: @* a. d" o5 K- Y3 Z

Table1->Active=true;

; @9 M4 U% g+ \ I) d A

}

V, P+ K" ?: k% _! D

catch(...)

" K" K' e; D4 B6 \0 I! z

{

5 n: Z( q/ L$ L6 g

//......

) F; K/ J" h4 k( c7 H+ B

}

( _7 t$ |0 a( g1 o, C

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

: y, G: `2 N! M0 C' w

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

& O4 Z# d2 H7 _9 k% S. g$ m+ ]. z$ p

B.自定义异常处理窗口

+ C3 G3 G9 ]& Q

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

}7 t2 e& y) c. C* ] i: b

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

, L, t7 U/ z) k

void __fastcall TForm1::FormCreate(TObject *Sender)

m+ K# k! W, j8 R

{

/ f9 n/ E+ h1 k$ k3 ^9 f9 H

Application->OnException = HandleException;

6 t: M8 u( P) j! a3 D$ Q0 n

}

. }2 m. n; v6 T3 c

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

' u) ]& _% ]; x: e1 {2 E

*E)

+ k6 F O4 |, L% p+ ^ A

{

( ]9 v* ~! e* u# o

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

2 w8 O; ]$ X$ k3 O4 k

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

9 s5 x1 g: Z& }$ h

}

, W7 H9 I% h/ ]" c/ Y

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

3 w) {- Z9 J% H/ h8 d

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

8 \. i" S. b: F4 x+ ?# D- U

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

2 ]0 k6 w& v/ E0 n

用程序在空闲进处理.

: J4 [" E! N9 C) X6 A9 L4 } 3 N6 u4 x0 s/ B5 K* {5 X

void __fastcall TForm1::FormCreate(TObject *Sender)

/ y, V7 s5 C' s8 _4 X. l. d9 b3 T

{

0 j$ ^2 M7 f3 u1 o0 j: O' q7 Z

Application->OnIdle = updatestatus;

+ P$ b9 z, J0 j( _ }* t

}

4 [) f7 _3 I' k1 e

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

+ h+ B; ]4 H/ H& d5 i A, A

{

4 I6 {# h: d- Z' {

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

$ o6 J3 P% ^% W9 _% j

}

$ b6 k6 \$ i4 b! A( I7 a3 A" W

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

+ L- A) w. a0 T

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

2 u1 p! O2 l. [# p

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

( _* o5 t0 e/ N3 y: e: _! L. |

即可.

2 E F( U; \9 ^

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

, \, `. x* m& v# C+ G; }

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

$ e" C1 ^) E+ Y1 ^/ i

Application->rocessMessages();

( b- H- ~' r, o Q- }4 j& |

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

& q! U$ _! T. e+ N8 q" 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-4-19 03:49 , Processed in 0.405477 second(s), 53 queries .

回顶部