QQ登录

只需要一步,快速开始

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

TApplication类的简要说明

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

; f* I+ p5 X3 d TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一

* b6 D! s# g0 Z# X& Z& G

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

6 F) u: D5 C8 d% q) r

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

8 |/ a6 k; p+ _# T/ X% O

lcation的代码.

( Z, q$ a8 }/ e! J, ?, c# N

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

* X( A8 H, _* @* H- M3 d0 N5 t

! T8 H9 m8 K9 t2 @0 B9 e% }- B( A

一>属性:

. Z4 _! m, Q2 F8 M9 f0 C9 |1 c( {

1.bool Active:

5 t* c4 u7 S$ T7 h8 [- I

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

/ B3 J$ b( D4 r1 r4 l- \

rue,否则为false

! s4 R6 U! M( y9 }) T7 U; c) j

2.AnsiString ExeName:

" I; _' B9 O* a$ b

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

& [$ ?$ P5 l5 X5 Q

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

, z) f( i6 @# ^/ g. {! h# ^

的文件名部分

& v4 T$ g8 Z7 s8 C p9 O

3.HWND Handle:

5 k- d1 F2 e N7 F L

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

0 }9 g) W- F$ Q5 n" ^; q

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

3 l# T4 D* T' Q3 u6 r2 s& o

4.TColor HintColor:

( t! z' F- @* ?: t

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

" _. O6 h# I( `$ [2 X) U

5.int HintHidePause:

+ t2 z3 g" E2 a

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

0 v s4 K0 W5 v9 A; o3 Z

6.int HintPause:

4 r+ M) G6 S# h. I( e1 P( i

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

. ]3 v# I1 y6 M. _8 f

0ms

$ Y9 m$ K6 f8 U5 |

7.int HintShortPause:

' r$ G/ C/ P+ e

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

0 ?' o5 K" L& W

8.TIcon Icon:

; I. N/ J+ K9 k5 |- R$ K) N- P8 c

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

7 b8 [) y0 E5 G* F" b

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

2 \; H" O( Q& R( D& X) ]$ C! {

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

" i* T2 ^$ b" g. T

9.TForm MainForm:

* u0 y* }( F I. z+ H; I

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

3 M' D& l7 Z4 g% t1 Z1 T: q3 _

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

* m v V0 v1 b% X

10.AnsiString Hint:

$ t( W# p2 q1 K( W3 ^

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

; R K0 C* i/ O

11.bool ShowHint:

! z+ d" A1 p8 ^# o( e" H

是否显示提示

4 ]+ ]% ^/ s" t

12.AnsiString Title:

; o" h( B; \" U# G

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

( ?: }: [! x4 h* ?9 X* Z( R" j

13.bool ShowMainForm;

& J: _& k9 d. E2 ^+ L9 Y" M

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

6 r! T/ G% C! [) ?# E3 H4 O

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

& E0 \* b, t, p% y

14.bool Terminated;

( J- {$ J/ @. F& v% F

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

6 Z2 o6 q1 z2 S

二>方法:

; |+ P# c- q8 k) H1 P7 T3 q2 C

1.void BringToFront():

/ A/ o+ ~! b- h( v" W2 i

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

4 j3 p5 Y! {, Q( T' D1 p" Z

口之前.

( I9 N5 k7 w- n6 z2 L8 |

Applcation->BringToFront();

8 G4 y, Y% ?( \" J6 ^; s# k% n- _

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

; h1 l. K# d: C1 ^( v |

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

1 Q4 P$ d6 e2 \) e7 V. ]

MessageBox函数.

: P) C+ h8 N# P3 H- E$ W

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

" D( F* n' l: q% Y0 f# u* o

caption:对话框标题

- k9 i0 v7 P8 X. H0 k5 [0 |, d

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

! U7 K) u' z- J3 s- {

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

' k, g6 L- A+ _# G$ N# @2 d

MB_OK:显示一个OK按钮

) k2 R5 j8 m1 g& J% Z' w

MB_YESN显示二个按钮:Yes或No

+ _7 m& {7 c) G' X1 L' u

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

2 c P$ B& a4 }8 ^4 M) h

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

M; k% K6 F* Y

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

K) ]( ^- ?+ ]3 `. b

缺省按钮:

* o& \* o+ n3 J/ R) }& ]) n3 W

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

: }8 j- q4 |) Y

按钮.缺省为MB_DEFBUTTON1

' b- W9 D- H* Z" l

图标:

/ t% _6 b: N& y5 S9 \% \5 W

MB_ICONSTOP:显示一个红色X图标

1 Y0 ~# A) b9 s% \4 A! P' z

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

1 R$ {. C R0 W8 H

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

4 r9 D" O" D9 S4 Y& V# t3 X4 {4 X' B

返回值:

' a' i; \- \& q; [/ @; |& p

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

% y" d" {2 N4 Q7 z( C/ b' F

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

' O5 d. e# L" D! P' w

NQUESTION)==IDYES)

' Q6 X' l' ?5 ]# I: I& W+ E/ e% I

{

9 c8 q/ z* |5 w& L

Close();

9 z6 F; S" y, I- Z+ U8 l

}

+ t) D: Z8 F6 a# @" G' [

3.void Minimize()

* [! y5 L1 C: k( I. S v& m* U

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

: N3 d( ?; y% k! a- i1 j( N' W$ Q

4.void Restore()

9 a* _6 w& z) j% K

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

5 W' _+ E8 P8 Z L% e5 [

5.void Terminate()

' ]& n! |+ E4 z: I# C

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

9 U8 E" J j; [; u- o& R

6.void ProcessMessages(void)

# m! `) ]/ I, L$ J8 m- o

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

2 L' c/ G/ ?' J9 U1 R0 s4 m1 ~3 s

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

9 D- E% z, R+ Z n/ E1 G) r; a/ g

返回值:

8 b: j7 c, i8 Z8 G, [ g+ v

按钮.缺省为MB_DEFBUTTON1

# _. N3 |+ A+ s- S

图标:

$ }9 a7 Y" E2 J$ W

MB_ICONSTOP:显示一个红色X图标

1 [( P/ r( S' ]! o7 m

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

. d# p8 |5 d: ~% i1 N$ q; E+ h

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

& E% ?% h' j1 D

返回值:

7 q6 U1 {) r U7 ?& {6 i: x; R

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

) V" j+ n$ J# H6 m

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

; H6 @( p- L, ?3 H! D4 X0 F

NQUESTION)==IDYES)

4 s4 F- {- ^2 ^' \& a( L

{

% @0 r: @* @5 E& [3 A

Close();

# ?' t7 @+ M* b8 O% F2 t

}

4 u( o" _! n* \+ k: L: k

3.void Minimize()

# k% [1 c. T7 N0 ?, e7 a; {

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

" r/ d6 I! d ]; {0 E) ]- [9 X

4.void Restore()

# u% m' k# v! ^- k0 Q

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

1 k; x8 \5 g" l% Y* t

5.void Terminate()

: ^0 y! r6 G# X! o$ ]5 ^5 ` x

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

% [6 B: O0 a+ m" P8 X+ J/ \. M' s

6.void ProcessMessages(void)

8 B- ? |! z. m: a+ x9 x& ]" p

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

' A8 n7 j! ]' N

中的消息

! ]) o$ j5 Y" { a2 B- P

三>事件:

3 w7 A& x6 c5 }2 P4 I; \' j

1.OnHint

" l, R5 V( F$ @3 D4 d

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

0 n4 ^6 F% G& z% X6 `) L; m" ]

示显示

; t% ^& R9 U( v8 Q( G

例:

; ]) v* f+ `/ V2 E8 o

void __fastcall TForm1::FormCreate(TObject *Sender)

2 `4 l: q2 r5 P: Q

{

, S" P/ {( Y, v" s

Application->OnHint = DisplayHint;

" n) z9 Z4 k2 Q% k) s

}

( H% ]* Y( R. S$ `

void __fastcall TForm1:isplayHint(TObject *Sender)

; u5 F% K9 |, D

{

/ U1 y3 R, w( y

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

6 D7 {% _7 u+ f

}

( b" m$ |( A7 G2 N. D

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

8 X& d' s- M, r# c2 E2 _5 q% F: n0 L4 [

2.OnIdle:

& K0 p* p: o0 G5 u8 A1 f& l

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

/ G& L+ s7 O3 u1 c

的任务.

8 \& X* {) y! x3 w/ x4 a

3.OnException:

' J% C* S; F* O8 G2 S/ t

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

6 j3 t0 E# d2 u) G$ l

. }, g" }0 c3 D% x

4.OnMinimize

2 }+ b! |/ o" r6 z% Q7 p2 h" e/ [+ E

应用程序最小化时的事件

/ [3 E+ ]/ [0 r$ R- i% Q8 w4 `! q

5.OnActivate:

( X+ w( \ @0 n: u5 ]1 a

应用程序被激活时的事件

+ H7 Z" r) |) P1 S$ t+ k& t! b

6.OnDeactivate

8 ^' |! D4 b4 N7 C9 t2 M( |9 C

应用程序失去焦点的事件

T3 L/ X2 _$ P2 Z

7.OnMessage

% J- ^0 x( w: `* D& f

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

; ]* W( K& C5 k" R! p. R

8.OnRestore

r P: p2 \( W+ b0 Q, f4 S

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

- a0 w! W1 }6 K3 y1 E

TApplication应用小技巧:

8 P# `3 X! Z; U7 b" l+ f% D

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

2 \8 k3 P# R" i1 d, {6 ]' n

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

" k, Y c# x* F/ N1 y

AnsiString filepath;

' d. q, v5 |: _% y. o8 y: }

filepath=ExtractFilePath(Applcation->ExeName);

, A9 ^0 g6 e+ ^# P3 a

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

; r' Q4 G$ w8 |7 M

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

' A& n8 c, {% x* U7 m

Table1->DatabaseName=filepath+"data";

1 L8 ^! m E3 l# z0 b

Table1->TableName="maindb.dbf";

+ S' J- W/ ^1 f7 z# [% T3 A$ u9 `

try{

7 j2 ?3 ?; d- T6 v+ {* v

Table1->Active=true;

, s k+ ]* `& J$ \: O7 ~* e0 K9 b; _

}

( p0 A) q" y! T; _# f/ y, s2 o

catch(...)

* |/ V2 @( n! c7 r# J

{

; r$ m, s; [2 l) N

//......

. C" f- `# r d" s4 W' x

}

* i! U3 P7 C7 @# N s

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

: U$ {. X6 _: S! e2 Z5 u

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

" r$ i. l3 J) V( j1 P; P( M8 Y* S& k

B.自定义异常处理窗口

* \ S5 Z8 W) L) v# p! R3 I& O

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

+ B& U* k: e$ l+ X, e

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

$ a/ k+ ]0 k9 _6 l2 x: u% m

void __fastcall TForm1::FormCreate(TObject *Sender)

, t6 j2 ~- s2 ?9 z+ t( B

{

/ t, e# R& [5 N( D

Application->OnException = HandleException;

/ h9 I0 @+ F! y0 U

}

s) u% U- ?* R: |! d

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

3 c$ M- C3 n" X1 T: x1 _, l

*E)

" ~4 V# L3 ?/ t* g

{

' L$ [$ U6 }# u) |1 v

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

9 f& L; c9 d# Z4 B

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

e+ E6 J0 e$ D" m P+ Z0 k

}

! L" [! F& t1 y& y* R

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

& p. g7 Z( K! V! }+ r. ^

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

3 w3 u0 \ W1 p& R) E( \

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

' {7 v+ c$ Q3 o$ v- R2 n& |: d2 P- `

用程序在空闲进处理.

5 K) A, M+ Q) v) o: j! t+ {5 `( p. ], e" y( }3 p- Y- |

void __fastcall TForm1::FormCreate(TObject *Sender)

# Z1 w& G9 Q' u: b! ^

{

' [7 ]) Q* b! e& a

Application->OnIdle = updatestatus;

, T" G6 R+ ?3 u4 i

}

8 f9 d& u8 K$ A0 K8 Q: i

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

# E$ I/ B& Z2 g$ P' q R* k

{

8 D: D5 {% p+ U" ~3 l: F8 {

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

- \' }5 F1 g3 F4 w) t

}

$ h' e5 M) _) ]* I

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

/ ~! W* B9 H7 n

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

, W, ~, r1 v+ i" @

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

. u0 H9 {9 X/ c/ z G

即可.

$ B/ f4 c2 Y# F; \6 }" H

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

, o. v; Q/ E' E/ I- }

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

- w+ r g' M+ l6 | D4 Z( _! ]

Application->rocessMessages();

/ a! g" v: O/ F& U2 G. h

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

. e+ X9 O; s0 G1 Z! n

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:40 , Processed in 0.399001 second(s), 51 queries .

回顶部