QQ登录

只需要一步,快速开始

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

TApplication类的简要说明

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

# I; T* k/ F* a) y3 }5 RTApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一

/ [ c% Q% ?1 N$ Q7 b6 Y. g9 n$ q

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

' P$ g: o( D# |5 l8 e8 O# d* C

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

{5 z' h; F% V; C4 B& F; t# m) [

lcation的代码.

% q- d/ _ D1 y

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

, T& ~: [9 `3 V% Y

2 I) j) g4 d$ d6 I5 a

一>属性:

$ i. z) z2 i9 q# c# Z1 l

1.bool Active:

' K7 J8 d8 k/ \ M

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

" e* _2 ^- U1 ~( j# }

rue,否则为false

' ]3 M' j' X% ~7 { J" G

2.AnsiString ExeName:

; ~( W- [) b$ K( Z% h' n

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

) s7 N7 ~0 U1 |4 r* }! Q3 q) S- T$ \

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

% z! U; ~- Q Y' ~- p; w

的文件名部分

3 l) [8 i; P& e/ j2 k( \( Q7 y. b

3.HWND Handle:

3 l. I+ [; G$ y6 p* a* |

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

% P8 o5 X# H n9 d# C# x/ W* k% n$ ~

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

& Z9 Q7 C5 F" j! ^. }( ~

4.TColor HintColor:

( e- u% N- \1 R& Z- t% A

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

# _+ |6 \) k/ ?# u$ ~0 w! q* E

5.int HintHidePause:

8 h9 P7 E& H4 j9 H3 V

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

9 \* ^% H5 g _! p& g

6.int HintPause:

3 k( `) k7 W$ M/ Z6 P

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

, V. `, D# c: S+ M# T: v

0ms

7 I8 a7 o% P( Q1 S

7.int HintShortPause:

& `! F; I8 ~ ^8 e& \: d: d: U

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

( _! i, ]' o$ J" S7 T6 j- F

8.TIcon Icon:

9 T" z6 v- }9 t2 m

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

' u/ K/ ~; M. ^% m: w

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

# c% L+ F+ K- `- |" h2 f. H4 G

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

C J* R2 g! Z t! I9 y

9.TForm MainForm:

Z) I6 }8 T/ H) _7 v! x

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

( q4 e" K' G4 c: ?1 |

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

3 R* @$ M, U& r+ B9 Q2 n

10.AnsiString Hint:

5 a" a5 _9 ^) B6 l' j& m

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

& h3 S% J8 M) Q1 ~- m- X+ @2 Y- ^

11.bool ShowHint:

4 r) [) S( n/ v" k

是否显示提示

. E* N4 j: N+ A4 J; W

12.AnsiString Title:

* V1 ]- x: L. P% ~

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

5 G& C, q H& P7 N* p

13.bool ShowMainForm;

1 ~ `( S: ^: Z H

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

; f* y* |- S- i/ f: `

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

( K# f6 L- K* h0 z9 R S/ h8 j) @2 i& T) Y

14.bool Terminated;

/ ~+ h) j6 _/ F/ u) ~) C% u

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

, o9 n4 [: S- p u

二>方法:

, F) F x9 ^- M6 D/ r6 Z; k

1.void BringToFront():

( \! x0 l9 C1 e

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

0 \4 V: X* R+ m0 a$ U+ T

口之前.

* B1 Q4 b* r$ d$ v# ~1 s4 x0 Z

Applcation->BringToFront();

( |! r! E" `6 }

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

7 P1 t/ U& O$ Q! |

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

) {) ?- I. `- ?% \7 {5 T( F5 w

MessageBox函数.

4 l/ \- M( z' H5 ~1 M

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

- ], K; `: J6 E- E7 s

caption:对话框标题

4 ~5 j6 \- ~, W t) z( s

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

# z x; C" `2 F* @0 i/ D

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

9 V1 _: J+ d+ E

MB_OK:显示一个OK按钮

2 e3 i" o4 J5 O t3 l

MB_YESN显示二个按钮:Yes或No

- f3 c6 w! x, U& g

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

/ p" V# x5 w5 H- g; h

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

9 [3 O7 d0 \$ Z5 }% T( ?5 h' }3 L

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

' |8 R( d4 {: r* u4 P4 p1 y8 }8 d

缺省按钮:

0 g7 ?! N% ~3 _/ `) y8 r& l F

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

; a2 d5 D1 Y& h. z. }, A2 {

按钮.缺省为MB_DEFBUTTON1

1 m5 V/ z) H# e, ^- h( {% W

图标:

4 Q( X; ]: z( {

MB_ICONSTOP:显示一个红色X图标

0 O& V9 u* \0 y- Y' B. b9 i

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

; m0 e/ U8 d! V1 A T$ N- j+ c C

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

& Y3 K( [: b- g, ?, j( |4 q

返回值:

4 A5 {# Z, `! q0 p& c

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

9 S! N; |! O/ n! q- q: B T

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

9 h5 b4 f+ j1 d

NQUESTION)==IDYES)

1 ]: r+ r$ |2 i. @) H

{

6 p0 V v( j8 f2 P% M

Close();

7 X- s- I# B6 E5 A4 k: q

}

/ L0 g# J6 j2 w7 l

3.void Minimize()

o' n3 _9 ^, h! A* }

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

, U) Y ?& k- O$ x" I4 l# L# v

4.void Restore()

# N* x& a) E: Y a

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

" {8 @/ c) X% a7 B3 m( T' B4 K

5.void Terminate()

, A' V9 N' y0 A

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

3 l8 C$ z* e* C H& s* s! @( S

6.void ProcessMessages(void)

y7 z @9 L7 L, T& G

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

+ r7 ~1 y$ c: n7 X

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

" q, f# G8 h4 r, F

返回值:

" X6 N3 u$ z6 B

按钮.缺省为MB_DEFBUTTON1

: s% Q, N- o6 ^

图标:

, p* V- G8 Z* S. {9 l

MB_ICONSTOP:显示一个红色X图标

$ l$ p. x1 w; c c4 E

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

p: h7 z$ [! F+ q+ s" }; ]

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

, j) Y# r; h- a% b& U8 _( V1 Y) T

返回值:

1 W1 @* |5 u2 m! M K

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

: O' M5 _ F S

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

7 ~ C# k9 }6 h' d7 Q. l

NQUESTION)==IDYES)

" R; z1 u& _2 k- O+ e

{

( Z6 W$ k) Q( ]+ o

Close();

" ?; \+ [$ X; U' E$ w9 ^% q2 I

}

( U, N) } u0 }

3.void Minimize()

/ k7 G3 [. `# C1 `4 ?( H- L; c5 \

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

) [" k, @4 u* n' w

4.void Restore()

) S# O/ @' K/ c7 C

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

; X4 J5 X% Y& u9 S0 J, j

5.void Terminate()

& J" V# U. M K3 m q; x

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

2 h" T$ ~/ U$ A/ O

6.void ProcessMessages(void)

; m/ J3 b+ p5 g$ j2 Z$ |) a- c

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

- ]6 l) L( q6 [2 ^

中的消息

2 d. h' H0 @! n

三>事件:

/ A7 F- A v7 r" ]2 p, H+ Y

1.OnHint

; N" S- k8 l, I& P# G1 ]

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

. k. y. r4 a0 l( m7 m0 d" `$ G

示显示

) R, ^, U! E9 D' @

例:

8 p/ s% H T2 U- ]3 G9 k* c9 d- b

void __fastcall TForm1::FormCreate(TObject *Sender)

9 W% z6 u$ }* P9 B: F: a

{

9 E* X* I9 k+ X/ i$ g; O: _

Application->OnHint = DisplayHint;

i$ n& C, l- [! y/ {; V

}

6 k3 v4 V: o, L) D8 x) [

void __fastcall TForm1:isplayHint(TObject *Sender)

# p) ?% q+ ~$ u3 N

{

; s& j- Z* |7 W1 ~/ y

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

6 Y, `7 W' r b4 m

}

( R( m" d1 n( R* q% Z% J& y

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

- y q1 \" i) u: u/ k

2.OnIdle:

5 i8 ?" e% {6 x) n2 \

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

- [9 g3 |3 m4 m; L4 ~

的任务.

2 Q: @- }2 e7 k6 W i9 i3 L

3.OnException:

) W$ O* }. ~4 }$ ~( j0 n0 j# D

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

8 P# Y& o a1 C- @4 u! A% q

# B. z; G! T0 D% v

4.OnMinimize

1 @$ H+ ], Q; [0 j/ y8 w9 ~# H

应用程序最小化时的事件

4 `8 G6 r# ]6 j

5.OnActivate:

/ J) }; [+ f- C# W L

应用程序被激活时的事件

4 E$ W1 K9 `5 U% k: B, n' i! }+ I. E

6.OnDeactivate

1 A, J8 B, i& U% }3 ^0 |# I

应用程序失去焦点的事件

" F/ W" X+ g) h# d" t& W; Q4 G' t; V; E

7.OnMessage

( o9 Y, I, s/ ^: p

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

1 r p1 O3 V# ]+ [

8.OnRestore

& o6 n0 A, H8 h. d4 S* }. [

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

$ O( w( m# L r6 m

TApplication应用小技巧:

( A+ E e& s7 x. K) k

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

2 u5 ?) D* T( @* @4 B* o

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

$ c( \5 V' M2 g; D- d5 c# s

AnsiString filepath;

2 n1 `9 ]6 c: H8 ~1 R0 ^" o

filepath=ExtractFilePath(Applcation->ExeName);

5 X# t, k* }8 ], D6 d5 j

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

9 w$ `$ }/ Z+ m1 z: ?

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

, |# f/ W& F, V; d4 j; _5 W

Table1->DatabaseName=filepath+"data";

f4 p: }, I6 K

Table1->TableName="maindb.dbf";

" y% ~" _$ c. s9 S6 {

try{

/ O x {3 h4 W2 E O

Table1->Active=true;

# u/ n+ m# ], B% I8 s5 M

}

- I: v/ `4 v3 O. X/ V0 U1 d

catch(...)

: b1 n8 `. ~+ T

{

: W0 \, }# A* L* e" t4 n

//......

) e+ M8 b7 Y5 }9 n. f5 A

}

2 d* c% g( s( M* w) r+ }7 C& a4 d

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

) ?& S/ H3 v5 F9 L( j. u1 h

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

& |8 g( X2 x% }! O- s

B.自定义异常处理窗口

8 W) D6 ~3 L* q: k: A" \$ x9 n

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

+ c- z/ T1 S1 T/ r& R

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

5 \2 ` X& v2 T3 r

void __fastcall TForm1::FormCreate(TObject *Sender)

7 d5 ]4 R1 V: c3 z g( v1 b

{

( B8 z/ l( |6 S4 L- P$ c

Application->OnException = HandleException;

; p c$ Z3 `+ Q

}

/ P1 n$ ^! [, _6 g5 e2 a/ e# ~

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

( X! f, k+ {7 ]

*E)

4 F8 T ?3 k. }; }/ X/ i% J

{

( s6 m# F3 d$ L

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

i4 k2 L" c! n7 v) `

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

- E r# H/ a2 B! u% t0 a3 b H. Y

}

( ~4 c) H5 k, O" J1 @* ~

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

3 H9 ~7 P9 s! k

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

; w: p9 s( d! P* I' e) Z5 M, W2 B7 v e

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

& g& g2 i b" y* z

用程序在空闲进处理.

# M, ]5 u4 a0 g3 c. L / K1 M* n* C' \8 J2 H

void __fastcall TForm1::FormCreate(TObject *Sender)

& i' B$ d4 r. ^2 D& p0 D8 l- x w

{

3 s! Z' D9 l& s

Application->OnIdle = updatestatus;

) j) V. @& k, G3 ^

}

) s% L) I8 V9 y/ R. s

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

! E( Q5 i& j6 L& `2 C1 w

{

8 s& p1 ^, S' _) [

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

: u% p ~( j# @8 d" h1 s

}

$ l0 q4 [, V5 P

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

3 @+ o6 B4 x% C' g4 i4 M, S G

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

3 J2 z/ T( l; y2 O. s% h0 Z

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

0 x) Q# [: U2 Q1 F" e2 y

即可.

; y9 R- u6 G1 S& K

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

7 L( k. `6 c9 W$ j8 U# W3 @

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

6 P: W0 v7 P$ T0 U5 h

Application->rocessMessages();

2 i4 y" b) Q* Q8 z$ O: z

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

* q5 Q3 p6 [, n: h: G

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 08:40 , Processed in 0.442799 second(s), 53 queries .

回顶部