QQ登录

只需要一步,快速开始

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

TApplication类的简要说明

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

- [" B" c/ Q X7 `; x1 OTApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一

: _- @. l W* w) t

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

+ s; e& |- h9 j) S+ S

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

8 D, X- t; Y3 r. k$ X

lcation的代码.

! [- J+ W9 E! _( c3 e0 M5 d3 d

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

2 W3 i! o" k4 S* O

0 @3 t+ g1 V- Y, n6 @9 i$ G

一>属性:

( t* {" u1 }4 S% |! l5 c3 v

1.bool Active:

! t- Q8 R* i1 N; X6 Z3 D

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

. G5 B; P' h5 J+ Z

rue,否则为false

0 c, }6 R: e0 ^0 M4 i" m; n4 t |1 G

2.AnsiString ExeName:

0 }+ ]! P; S: J

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

I, L! @8 m& Z3 V' a: s2 q# E

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

; q- q: H5 L% N6 Y. I0 P' Q$ F

的文件名部分

1 _6 L, O$ @- b- h: D( R6 F, y1 g

3.HWND Handle:

5 e- E A0 G: W) r# C5 \

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

1 z( y( A1 F8 l5 R4 X+ i

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

! b. U' H( ^. B3 f. R

4.TColor HintColor:

! Y' Q- }/ f2 h& W4 P7 P

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

. m2 }7 F, Y8 N

5.int HintHidePause:

( E$ g* _3 F+ {' J

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

1 M9 `) i* Q m# j8 C+ J6 A0 T

6.int HintPause:

; L+ `* j( s1 \5 G; J4 _0 i5 N

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

! e& c; q) t& J% i% D7 q

0ms

0 q9 d! r# V0 u# X( C) ?5 t

7.int HintShortPause:

$ a; R) |% Y! H

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

0 ]1 h. S: a. Z- z4 X( @* g

8.TIcon Icon:

- [7 p1 z" j- o! Q2 v! ~

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

/ n5 ~( p) [" `6 d3 _

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

+ |8 t2 R& U+ Y$ S" N

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

! y- G) k7 q6 K! o

9.TForm MainForm:

0 M$ f4 C9 q, b3 L M

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

$ E2 u* m1 J. ]) f4 T

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

1 p: q; R; q* Z6 ]# g+ {

10.AnsiString Hint:

6 a4 y- u! g! X5 t0 F

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

" ^- ?/ R% Y( K) x! e

11.bool ShowHint:

( p* A( K) F+ E3 O+ B

是否显示提示

8 A$ i# k$ z5 c* k- Q1 r6 U

12.AnsiString Title:

' r0 }0 x/ c; t% I' }7 e+ g

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

7 D1 N0 c: w; @) e: x$ Y3 j

13.bool ShowMainForm;

: H# i) S" V, U- v r9 B

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

' P3 |1 j* F( E6 m! c; U' O K

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

$ P7 }4 H: Y7 D# S! M! ^

14.bool Terminated;

) Q9 M2 C) X8 P& N" ?0 a

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

/ \5 }2 |8 X% b% @; I% p' y# A4 `

二>方法:

, s) N& M+ ~' b

1.void BringToFront():

! H9 _4 P9 c* W7 n+ l

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

- v% w$ b. i. P1 b

口之前.

) `3 w& y6 W/ d4 P

Applcation->BringToFront();

. V8 F5 M* x. U o: y: j7 o

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

) [; h6 Y1 U' f! O

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

+ E' D% v# F0 H' x1 y

MessageBox函数.

8 h0 }; P1 q* L9 M

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

. e7 [* D8 B/ C

caption:对话框标题

2 E, V1 c, \2 }6 T; `' U( l) P; p

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

. |' X# f, D* h

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

( [5 I- u& Q- R8 B* O. e( `# Q

MB_OK:显示一个OK按钮

& @# i7 F& k- C7 a

MB_YESN显示二个按钮:Yes或No

" ~$ h {) [' O4 y8 N- j' T. h' O

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

4 c" ]( z0 z( E1 d. o- s$ r

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

$ c+ X( R6 f' {2 L2 M

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

' i* Y8 O0 }+ ]: f' j

缺省按钮:

^6 Q; @. y& c# D. A0 u

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

0 e' P: O0 ~0 u$ _9 U3 k! Z2 `# U

按钮.缺省为MB_DEFBUTTON1

9 E, X# g; y% B' B' S: A

图标:

, [. {& ~% A- G o x. _. Y

MB_ICONSTOP:显示一个红色X图标

d7 A; V' [* ?( B+ g+ v

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

* x: n. k7 {6 O' j- A6 r \

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

% F r6 f) j0 ~ I: o

返回值:

& z* V4 n$ g$ k, q( z

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

, F3 j' N1 u; C; M! W

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

" g+ O7 C( e0 b9 K

NQUESTION)==IDYES)

4 A' N1 a. J$ P

{

6 [3 G E2 H0 d+ X. x# B

Close();

5 U8 F' x8 J7 @0 l5 o5 z3 H

}

8 q% w9 L1 g3 V" ~- U( ? _! M3 Z# t9 S

3.void Minimize()

7 s* z5 J. L5 ?/ \$ p: ?

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

' `- t9 E/ {6 G

4.void Restore()

6 x$ M% J: k8 m8 \

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

& a, K1 ^ Q9 R. {6 v5 ?

5.void Terminate()

$ A3 ]& \4 x$ ]9 D- r ?. _

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

4 i" ^) @. \6 o9 L5 k7 m

6.void ProcessMessages(void)

( `$ b! V' i& u

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

8 | K/ P! U, |* ?: Y& j) V8 S Z

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

% i9 a7 ?# F! x1 F/ t

返回值:

4 h9 z. g( {9 L2 @

按钮.缺省为MB_DEFBUTTON1

3 X! |3 O& o3 P: [6 q# u/ V

图标:

" f+ b t) y* Z4 j9 h3 S0 X0 J; |

MB_ICONSTOP:显示一个红色X图标

! {! Z* N4 T' e1 x+ ~2 k

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

3 w7 O7 y& m% X! V2 H

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

: _* ]" y& O5 q' r/ I

返回值:

& w& V0 W& ?/ q* {0 g6 O- n0 G1 U8 z& ^

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

9 V: |* [" r: ]! U1 }2 g

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

$ `. S. a4 n$ G

NQUESTION)==IDYES)

/ `& M, s/ E" i

{

! Y9 I0 A# o0 }+ x* \# y8 J

Close();

/ i/ \( x( \* w2 D- ?- B+ |

}

l- G- @, O% B& [; J" Z' w g

3.void Minimize()

( `6 s2 {& S. A4 h% W" M

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

5 x6 \# k& ~3 F5 ?+ ]3 Z1 L

4.void Restore()

( [% A: B% t7 A8 q% T4 U

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

7 r3 G8 f4 {! `

5.void Terminate()

+ r$ ~; a( a J0 K9 L6 A

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

$ M8 b# j: u) S/ t

6.void ProcessMessages(void)

7 u' w* @& ~0 Y9 Z, ?" B

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

3 D J- d' F3 s; c

中的消息

J/ W/ O# W$ e2 i& D4 n

三>事件:

3 ?5 r6 m. ?5 |( D7 k0 X* s m( b

1.OnHint

, t% e9 Q4 G9 o

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

8 ~% j* l) y) _, q

示显示

4 e4 {( K* i2 J9 s! }

例:

. D q h) B5 @0 d3 x

void __fastcall TForm1::FormCreate(TObject *Sender)

) y9 a) y3 ~: C# A0 h# o, E

{

: h J! ]$ H7 Z

Application->OnHint = DisplayHint;

& d! Y/ @8 h# a; P: B" r

}

# O8 ?- ]' |4 C6 A

void __fastcall TForm1:isplayHint(TObject *Sender)

% t3 j. O. } `" K/ w/ k

{

5 g: m3 _5 Z' T5 U- {

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

2 |* Z7 B1 q8 e% b# Q

}

+ [/ y; U. I1 h

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

3 ]' H8 o3 Z! m! a* o7 m4 f. K6 g

2.OnIdle:

# \3 @6 p6 G4 X) ]8 P& W

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

% o o& s) l0 s* k% I! W5 v' P' L

的任务.

( u: S/ {3 S4 L& l6 ]; i" y5 ~

3.OnException:

, ?' M+ B" b8 N+ Q/ Y- ?0 [

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

. A8 k5 @1 ?2 q( Q- d5 Y* z

l/ t+ B1 _* u/ N% \) z( j

4.OnMinimize

, t, X, _2 R$ b: `! O

应用程序最小化时的事件

P1 V: g9 X9 T

5.OnActivate:

! o9 b# w8 d1 ]

应用程序被激活时的事件

8 ~# N' E' f0 ?, ^ E, ^

6.OnDeactivate

1 z. d5 _9 c3 C$ c Z% J% ?

应用程序失去焦点的事件

/ ^$ H( Y* `3 \( {* ~' X

7.OnMessage

7 }8 E6 @- d6 G0 x+ s( A- K* |( j

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

8 x2 i, a- ~7 y# y+ p

8.OnRestore

/ X* ~# [5 b/ S/ U/ F5 f

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

Z' `5 L/ K7 x3 B D* s

TApplication应用小技巧:

* g) i$ E1 n# N

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

% B, v1 S2 M9 N. `# v- L( @

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

% o2 k L# \& m5 |+ d% s' [

AnsiString filepath;

' ~8 X) q( y' N. S ^

filepath=ExtractFilePath(Applcation->ExeName);

4 v7 w# g& `* B) I* P# n/ S

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

: M$ U, T2 `- f: h/ j! _' }

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

( y1 b# h2 x3 ]4 E' ^: U4 X: J

Table1->DatabaseName=filepath+"data";

& Q# B2 p; H7 S" F7 h1 p& y' a# f( e, C

Table1->TableName="maindb.dbf";

- V! s$ a2 d3 l. N' ?' r/ d

try{

1 T5 T& t2 S' i; z. o2 i+ ^+ }

Table1->Active=true;

( K: _& x" s7 l

}

9 x+ \$ _& | ^( M& z

catch(...)

N) z6 o) H4 A4 k4 O

{

0 R2 _9 L2 g. E

//......

( z+ R5 L ]8 O% v- s

}

8 z$ i2 B! T4 s* N2 E# W9 k

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

2 r# i2 z4 H: M

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

# }4 K$ }6 m% ?# d

B.自定义异常处理窗口

8 r- R- ]+ ]9 U

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

( I0 [: J, k% `) U/ |, W$ M

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

& M5 a+ U. Y8 M3 E: i( S

void __fastcall TForm1::FormCreate(TObject *Sender)

9 u0 }7 \* B/ m* H& s0 U' K3 G

{

" o/ o1 g% |( X8 C3 J

Application->OnException = HandleException;

% I( [" t, \7 l9 x" z; |

}

) N# ?% S. ~) u6 c2 k& v7 s2 Z

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

2 {% {2 J& V) {( P* {! u$ Z5 p

*E)

, ?6 o `! {/ x) V% M+ Q

{

! F8 V" n7 {4 h. [

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

( W- D0 @ R" z* B( n: }, M: W0 u- m

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

; b6 @. u3 T/ X/ T

}

$ b. m% J2 @2 v5 r' q+ Q+ [; C

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

$ ~3 @( g. Z4 }5 j! q& f' s( J

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

7 E4 s/ |! j: w+ R

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

r5 u8 z0 r& E

用程序在空闲进处理.

# ^+ j' o: \8 {8 X/ Y( M2 s ; x& w0 ?# ]* G

void __fastcall TForm1::FormCreate(TObject *Sender)

$ T% S* g* W1 n s2 D0 j" N

{

/ R5 }) c; {* F

Application->OnIdle = updatestatus;

5 l/ B% U& i- N" L& v

}

" N% Z8 J/ O. z" y0 A2 x

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

. P4 Y- R4 P8 K, r- h# I% g$ w

{

7 t; H5 S/ ~# p

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

( `# }7 D* C. t. m* ~

}

U2 [4 B' w9 H1 E K4 t+ b/ e& [4 q

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

% D* E V+ O9 k t1 A% P$ H

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

8 Q) P7 F' M- N% U* H

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

: v/ I# T" S0 j# X% t; C

即可.

" ?2 B" v" }( W7 l

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

$ I7 o. F' s3 }9 f: T

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

* e" |: _0 X4 ]1 g& C7 h5 w

Application->rocessMessages();

$ d0 @# P) r5 l1 m- @

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

' ?8 Y- Q7 }# S1 ?1 _8 B

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 06:46 , Processed in 0.377074 second(s), 52 queries .

回顶部