QQ登录

只需要一步,快速开始

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

TApplication类的简要说明

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

% ]$ n3 w1 |6 C) w& R6 J. B4 P TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一

7 h. r7 N2 ?3 y3 I

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

6 P2 l, Z1 V8 y

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

7 B; o' Z9 j l) U" @1 { S: r

lcation的代码.

4 T$ e" H% z( B z' d

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

; f N7 j+ z5 d1 }/ F

5 M7 {+ E0 K2 X

一>属性:

p2 B, I5 a' }) @; ~& h. Q

1.bool Active:

3 W2 A$ f9 ]) c2 o# h0 f

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

/ m/ q+ ?# |/ ~, T# w4 p$ z

rue,否则为false

$ S5 `9 f( H) C8 e

2.AnsiString ExeName:

7 h z9 y" R% q! y6 b% f

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

% p0 H+ a( Y) e8 k) T: W* V

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

; u9 R+ J0 b6 C/ b% {0 M1 H

的文件名部分

/ k! q! Z0 ?3 y3 k

3.HWND Handle:

) W& e) [1 Q4 u! g/ f4 F

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

0 F, R- Z1 {; N+ u% Z) q4 J

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

; Z2 _( q: U `5 O) B

4.TColor HintColor:

" J' p8 S2 y9 U4 h

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

Q, ~! }* d! I4 U8 y8 v+ u# R

5.int HintHidePause:

& R; u/ p3 {- Z' H, s3 D

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

8 P& T2 H2 t5 }6 |+ T; A5 _7 Q7 G

6.int HintPause:

$ m! l5 t8 P; u# }: x/ Q& @7 q

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

& b( @2 u. b, F

0ms

- N6 L2 O/ X8 S1 T& w. X$ M" Y9 z- n

7.int HintShortPause:

+ @ P# a! `( C6 F. V0 C

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

/ ^6 s0 w4 l' d8 v2 j" b, Y( w

8.TIcon Icon:

2 s$ s7 w) z- Y' }1 v. g2 N4 e; I

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

+ i* {% `* E, n

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

) Q3 S5 q! `6 N

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

" E; U! b* O" A( ^& I$ b

9.TForm MainForm:

, {) T9 Y. t( U; y

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

. x) g5 L' f! V- _* S. t

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

' `9 t& k0 z: l. [8 P, I

10.AnsiString Hint:

7 I% I. ~1 G# q4 l

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

, Q7 o$ z, O I* f/ s

11.bool ShowHint:

) f ^$ Y0 B9 b2 v6 C! u

是否显示提示

" ~' Z% L3 y7 P8 a! C+ O# D

12.AnsiString Title:

% q% a& U! b. V; j

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

0 T# {7 p$ s% J0 K( Y4 M

13.bool ShowMainForm;

' n; Y7 w. b* P- n6 F C6 G6 J

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

- {( K5 k' {$ g+ z" _( H

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

0 ]! e$ Y- x1 O6 n

14.bool Terminated;

3 y9 s+ f2 E- Z- U- C

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

- h W+ i q1 A% J

二>方法:

) f/ \7 A1 O4 K" C8 y! B$ K$ J

1.void BringToFront():

4 i& N) U- _1 Y* p2 ?

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

& F- c7 i( z ?0 W, E; h" d( C; R' c

口之前.

C+ j& ~+ ~5 N, \' |! s

Applcation->BringToFront();

% O H$ n- @! w1 z. J8 U6 U6 N

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

2 n) w( S5 Z/ j3 y+ P: s

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

- v* Y# @' J. M2 n

MessageBox函数.

# `+ L: ` H6 ^" Y" I+ s' h& e

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

6 n) s" Q. N' M! e

caption:对话框标题

& a2 {1 J$ }' w! s1 C9 P- q

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

7 Q# Q0 [! u' j- ~

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

- t; w) t# ]3 p$ W4 v, q9 U

MB_OK:显示一个OK按钮

* V& n; C1 R! ^5 O

MB_YESN显示二个按钮:Yes或No

6 M* r& o. H5 s- }1 E; m. E4 w

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

0 F- |# u" M+ C r* N7 [- X. a% V

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

; {( W0 j# j J& I/ ~* n! `8 r9 G0 K

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

: P6 N1 l6 X( D' z

缺省按钮:

8 d/ N A5 ^3 z* J, f' d1 N

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

. R( g" z$ E! @

按钮.缺省为MB_DEFBUTTON1

7 ~9 q- `0 ?. r0 y7 C% l: T4 O% `

图标:

- f" k. q. N) `+ j! s2 W

MB_ICONSTOP:显示一个红色X图标

7 z0 h7 U5 o$ n" a5 k

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

/ R/ j& ^4 P3 Z; o: L$ U

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

. O5 U% R2 X( f! P

返回值:

! g; I. g- |5 E0 B: ?7 U8 U# `/ V; b

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

- m- g! g8 u3 ^" H% Y

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

0 ^2 a2 S5 f. G3 B! p- g

NQUESTION)==IDYES)

. n4 d5 x& G# R3 ~3 ~. K

{

7 `! H+ T) d& j7 p3 B

Close();

# t$ R( v1 y; K- D/ W

}

4 G9 H8 W& `' s( B% t- m& s

3.void Minimize()

. i6 `9 ~- z& H* N( B. p4 z0 b

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

7 X+ {* w9 F0 ~% p' y; z$ m0 q. w9 i) D

4.void Restore()

' Y* F {3 O( D! ^' m

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

1 e! y3 A% ]; @6 [9 L5 y# |

5.void Terminate()

! P% X C9 ?( Z8 Y* D4 j% E

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

! j' S f. [5 r6 K( l4 Q

6.void ProcessMessages(void)

+ W0 s, g3 O; n% X, v" k; g2 D

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

; S3 m t- m- J

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

: N- G. O/ p2 v7 g8 s

返回值:

1 Y* ~! B! ]' Z6 e( H8 Z

按钮.缺省为MB_DEFBUTTON1

4 g; O3 d. e7 W/ v1 a( n4 X

图标:

# S* h% K- C. T: e! v+ L& I2 P

MB_ICONSTOP:显示一个红色X图标

' z! M V$ f7 |) A% i" U

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

6 b* t q7 H$ \7 O

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

: N" O- e( c+ B( E

返回值:

n+ {# `# J; f$ b9 d/ b/ Y

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

8 c" U; j- v( Z q

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

. `4 F. |7 S, M

NQUESTION)==IDYES)

. x' V- p: c( v# l: X

{

9 w' q. y9 o* A2 v& n

Close();

3 J8 Y: H5 R( P; c6 a$ h7 k# D( v

}

( d: W) n" @& ^3 t+ X: ]

3.void Minimize()

: Q/ x; b# d9 u$ ?! J; I0 b

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

; g% U; a8 D' i9 f P. y% I+ x

4.void Restore()

& P: |, _8 e3 ^4 K7 U, @ h9 ^

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

' R, }, J5 q- `2 _# @& D

5.void Terminate()

4 _( s# g1 H: e( P

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

8 B4 T, b/ F" r% Q3 w% m

6.void ProcessMessages(void)

$ I1 C. s2 k( |' r- r# K

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

( z2 {% ]. ^$ _

中的消息

2 w. V4 G# n1 U- ?. R

三>事件:

+ |" x! \, w+ e, s4 m; x* `

1.OnHint

E% T6 L. k$ C, E4 Z' p& X

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

5 @, A% n" R5 i- L

示显示

% o& [: H4 {- z1 t. [

例:

: P7 Q+ i( j5 i

void __fastcall TForm1::FormCreate(TObject *Sender)

; O" h, J: C- Y& \1 Q: n

{

8 N& c6 b3 L. B7 U

Application->OnHint = DisplayHint;

, S4 r$ `' N }2 s3 T0 H* ?2 {1 E

}

5 ~& e9 a* m, k4 o- _$ a

void __fastcall TForm1:isplayHint(TObject *Sender)

, a d1 d! P- i7 X1 e

{

- K! k4 K4 k, @& v; k8 Y# `

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

" l7 j4 x$ `# j1 p

}

3 e* Z0 G" V- p: j* B) s+ V

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

1 O1 [; `+ `% R6 V, b

2.OnIdle:

) \8 S$ D) V# b$ h- P

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

# ]1 j/ z" p) w# f5 v9 R

的任务.

8 `" c, h; E5 _5 g6 Z; k0 a! S- U

3.OnException:

, z* s5 a* K2 N' N& _1 W4 ~

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

8 R2 j' _0 K" m+ V+ d

( \8 C0 m4 \5 w. i

4.OnMinimize

1 \/ |6 c" F0 @* M Q

应用程序最小化时的事件

0 R( R& B7 _7 i7 {( a8 N$ M* F

5.OnActivate:

0 O$ @- n0 \ v4 f/ o$ [' f

应用程序被激活时的事件

* [; W9 Q; \; H9 ^, F

6.OnDeactivate

) B+ ]4 H4 ]/ n" Z

应用程序失去焦点的事件

) ? D# t2 y6 s: D) ?- C+ ?

7.OnMessage

" p5 J: m, j. i" j X" d

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

/ I+ Q; j/ M, g4 N) r

8.OnRestore

& b7 t/ z0 _1 ?3 F/ y

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

& s9 [! D& R! L4 a/ Y

TApplication应用小技巧:

~1 g+ O2 X, O/ _+ ?

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

7 b9 K" N# L! r3 Z' A- V

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

! U) T& H4 C0 ~5 X- P7 t/ e

AnsiString filepath;

' m0 G# T ^: h1 v8 F

filepath=ExtractFilePath(Applcation->ExeName);

0 @; z" I6 J5 {* j

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

) P* k a2 _ |* Q

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

8 B" ~* Q$ E, i5 h

Table1->DatabaseName=filepath+"data";

6 z( ~6 F( W; e7 ~

Table1->TableName="maindb.dbf";

, w+ Y9 i6 M- ?! O

try{

8 _8 V4 n3 X1 Q; }( }* I

Table1->Active=true;

$ E% A, h* `6 z$ x7 K/ b

}

- Y/ ]9 F2 L9 t4 _8 G6 p* U

catch(...)

7 F, N7 \- s6 }* W) f7 Q2 G* s. Z

{

: `. l J( v4 g7 v) u) w

//......

7 {9 _, z J, r

}

" N9 ]& i1 N; Q

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

- h7 W# @. a5 c+ T$ @* t1 k5 ^

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

8 v) v& A3 ]8 U( h- V: H- U

B.自定义异常处理窗口

7 C# l K5 V+ c! P1 w

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

4 N" y8 f- T0 Y

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

4 k f( l+ Y3 f- G8 S0 M

void __fastcall TForm1::FormCreate(TObject *Sender)

5 g Y+ ^* [' z3 E: f# y- g. X

{

6 ^ N$ m/ g4 k( Y; a6 I( }

Application->OnException = HandleException;

8 _+ ~7 J8 a5 Q6 b; x2 q+ }/ l* d

}

' Q3 B- j% @1 {7 z _1 Z, m2 V

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

: l3 j3 R! ~5 x6 l

*E)

# d& j2 i" m! B0 J" q, I$ C" E

{

) b4 t2 [+ J2 a5 R, S7 h

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

6 g! j. o, {, ~$ H$ m# r e

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

' Z$ |3 B Q* L) q# A% _9 ]

}

' Q4 R8 g3 k7 C% v: S+ G( e, N

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

0 n) @ `" [0 o9 p

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

! c9 q/ d& p; ]% d* d

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

" h7 Y& r+ V5 D3 i9 e1 _

用程序在空闲进处理.

# e V s2 M& G5 e 8 K4 \0 v: v/ C) J- \" T* i

void __fastcall TForm1::FormCreate(TObject *Sender)

$ G+ K. t( \' u# r0 ` g

{

" n0 {* _% ?) c- i$ W8 }# Z

Application->OnIdle = updatestatus;

' F4 x2 o/ Q# L! c; F/ c$ `

}

% H/ S* t, J3 }% r, H

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

' I. M) M1 [3 U: t9 A3 b) r' r% T$ m

{

, J1 Q4 P8 U$ b3 |( r! _ ?& ]

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

9 h! T) E4 Z* v! O) g8 `: o0 ~. j; n

}

7 e; E. j$ s1 |: p7 y4 Y: }! @

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

L4 ^+ A* _. W: M2 ^" `2 z

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

# R! S( R. S' L) x+ U, W

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

* M% k" i; j- r! Z# I. p

即可.

& D) N, O. G% ?' Y4 a: n

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

2 b+ e b0 [4 e( T6 d6 S2 ?1 F" u

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

& x3 X/ `& }" y0 V

Application->rocessMessages();

1 Y# v1 Y( t; ^. m* {

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

, Y6 U$ R0 {! S, C

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 05:44 , Processed in 2.302633 second(s), 52 queries .

回顶部