QQ登录

只需要一步,快速开始

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

TApplication类的简要说明

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

K0 M# n% y% a; |8 y4 |. c9 s3 STApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一

7 n4 l2 Z8 \0 i; F u: J

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

; U. A$ u, Y& v

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

. H% n& }" z2 E0 v5 @

lcation的代码.

. q7 X0 S1 _! p; D( }$ E

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

8 ~/ k1 Q, \! K

0 f) l; ~7 T% Q6 ~# F I; x' P

一>属性:

! U# S0 T8 M3 ^- p# u, H" E4 t, w

1.bool Active:

& G& P3 B+ } C: i2 e# U- D7 b

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

$ P9 }/ C. G9 h! P9 F

rue,否则为false

; X6 W, H1 Y$ R& ^: Y4 \

2.AnsiString ExeName:

. h2 k3 F7 \1 M6 Z( l

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

, y5 k* d7 I4 d8 p' e0 v

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

1 y( T5 ?8 _1 i; C

的文件名部分

! d, y& v/ z7 T

3.HWND Handle:

/ E" I4 s4 L) a; G, D

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

& ^& }, C8 Z; [, h7 t8 \

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

7 K3 Y7 H7 F# ]- ]* u7 K

4.TColor HintColor:

, f2 H& u* H' W

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

+ l; h" D: A3 G3 Z5 ^

5.int HintHidePause:

$ N1 p# w$ j( t* h9 G2 }

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

: `( y; I) g9 ^4 [% R

6.int HintPause:

% P- } m H9 t

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

' X* e8 Z9 G _/ t# p+ U( L. W Q5 v

0ms

4 B! o" E" p( J& z ?* Y }, r

7.int HintShortPause:

: ` p, G% H# N! @6 _$ Y

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

3 I1 ^, q! `+ w" f0 o

8.TIcon Icon:

9 Z" m9 M5 _ O/ s

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

+ m. m% K: P& U

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

: L2 [4 O( {* w1 F( l

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

) d. p, ?- @) G7 S d

9.TForm MainForm:

. X6 c+ i! ?' V+ D7 f8 g0 @# X0 f

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

( ^; _; t; h: c* U9 o

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

6 q6 z2 q$ X0 F: O

10.AnsiString Hint:

* d- f% r5 r# ]1 I1 O

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

* L- V- ?( c3 w' [

11.bool ShowHint:

/ l/ D. l: u+ O

是否显示提示

" P+ r$ F" e3 A; O6 }

12.AnsiString Title:

2 e9 m) @) Q8 B; x4 C# I

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

" j: `1 X: g6 w& T7 c

13.bool ShowMainForm;

& W3 |# J( b% S, j N6 N4 B4 N

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

, I4 [# ]8 r: ?* y

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

4 _( `2 m p) I8 n0 H; b

14.bool Terminated;

8 ]: n7 n' h& \

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

O4 o6 ~) _/ B* B6 W1 f( m+ t6 f

二>方法:

/ A: }/ `/ A% w) @# W

1.void BringToFront():

% D2 o" i* h) E. X1 S' c

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

3 P6 T0 _1 E, g- i7 C0 R2 W

口之前.

2 o3 ^* e: ~8 W& I: D+ J8 [- K( H

Applcation->BringToFront();

, x# H+ E: `1 Q0 R

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

6 O9 A1 Q5 y5 X$ {

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

" G& C# Y, Z: P* {* y. \4 g, W

MessageBox函数.

! G4 d8 X- f1 ^9 w4 e0 s8 R& Z

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

1 d7 c- q- @: G1 y9 z

caption:对话框标题

& u8 U1 c6 M0 v- m

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

6 [2 S ]8 R3 z: s3 s: X

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

% @- y) z. L) ?" _. M* D, r

MB_OK:显示一个OK按钮

% T; [6 Y0 f( c$ w3 b) A& q$ E. V' X. N5 d

MB_YESN显示二个按钮:Yes或No

' o+ f% t" V8 `

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

9 t4 W3 t6 j" @9 {* T' ? v+ C M5 q

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

- s v1 Z7 A- G

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

. A! `9 q: [8 G, T7 \) g( D. I! U, e

缺省按钮:

6 O3 I2 ^" C8 o5 F, Y

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

' K3 R$ R; Y8 q% J! K; Z

按钮.缺省为MB_DEFBUTTON1

) b- X) K o: F j4 l7 U

图标:

: E' Y7 U# G' l! i3 B

MB_ICONSTOP:显示一个红色X图标

S" ^2 q$ D9 ]

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

: R9 v- l3 Q2 Q0 \# a* a! `

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

( R: R+ w- a6 |! q/ z% N

返回值:

, U) J( J$ Q/ l$ q* _

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

" f2 }5 Z9 d+ O5 T

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

3 Y$ I1 a+ ]: D' ~2 Q, U

NQUESTION)==IDYES)

3 Q1 F0 k0 F! ]' K7 I

{

' j0 R, L# H5 Y0 q; Y

Close();

& p: w' O7 K5 t% p

}

+ A: S. N4 u, f& A, B6 y! o( ] E; R

3.void Minimize()

0 `, W' ^0 b- D5 A# T3 H

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

2 C; [) {0 \; {& q

4.void Restore()

r; `) T# t: Q$ O- E

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

1 h ]6 `0 C3 q4 h" }/ R+ g, A

5.void Terminate()

8 [* U: ^% K6 t! f

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

0 }- A U4 W* d$ W: d Q

6.void ProcessMessages(void)

2 j8 p n1 n' a3 R, z

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

7 i5 _0 h; {' t

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

) [5 H# S" d8 E8 i' c. H$ {. x* l& s

返回值:

" I3 w, E, o- m

按钮.缺省为MB_DEFBUTTON1

8 K) K; }% g7 m/ j

图标:

3 b. m9 A4 K& ~3 r

MB_ICONSTOP:显示一个红色X图标

6 @& U' s: Y. h; V

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

# }5 W# }* V8 x* z: Z: Y

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

( V' K/ R4 [5 v: i: \

返回值:

+ \9 U" h" O1 d( M) T# O4 f

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

2 X: A* R* C( c

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

. _. N4 I. P5 H; S- a

NQUESTION)==IDYES)

d! {9 W: W* U# x# y* ^) Q- u- ]. _

{

3 H4 G8 ?0 Y1 }* w

Close();

: \5 z* V% `, X( v# w6 q

}

4 Y- W" K+ c& I2 l$ ` Z

3.void Minimize()

0 o/ R5 ^' P2 g! A4 s

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

. @; B: d# |* F6 M w7 f

4.void Restore()

2 X- O1 y- ]$ E/ N) g. z

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

: f. n- o6 P3 U3 i' q

5.void Terminate()

+ D s2 ^8 h) m& N1 A/ p" `. E

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

6 V5 m7 g) U5 H% Q/ Q

6.void ProcessMessages(void)

2 j( J: P- z+ A/ _

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

% i* c2 r. R# @3 ?! E/ x8 d+ y

中的消息

! T+ h5 t) b# P. M2 m

三>事件:

5 H; ]7 d5 E6 X1 B1 M

1.OnHint

$ I' G! F1 `+ n! R/ D. D2 G

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

6 \% k5 d1 q: o3 I' _, u4 U

示显示

& e4 u( m: Z) h; I+ ?

例:

9 V( p8 u, ^0 Z) q. r5 c- _

void __fastcall TForm1::FormCreate(TObject *Sender)

, r( ]/ q o. f0 ^3 n( X1 X

{

# t# {8 s# E8 }- E, Q

Application->OnHint = DisplayHint;

; g. g8 h( z- V9 @7 W

}

* A/ d& Z3 v" E$ k2 B( a7 ]

void __fastcall TForm1:isplayHint(TObject *Sender)

- T4 M2 N, u! @/ v

{

/ O: |/ j) S) \: S5 S/ d/ k' q

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

) d" D+ I: q( c0 y& R

}

6 T- Q5 ~4 r4 ^! N0 f

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

7 A9 V2 Z2 h# S$ P! _

2.OnIdle:

" M. a% _# p8 ?/ C; c! G

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

. r2 }7 v- |3 E6 M: {- A

的任务.

+ y. q# s- k6 T A5 n

3.OnException:

6 d0 }8 g l4 U9 k, _$ i

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

5 g( n* S0 R; s# E

- K8 g2 z8 n) N

4.OnMinimize

+ f$ S0 e6 z/ ` t) r8 j9 M

应用程序最小化时的事件

3 ] i Q4 h& D# G6 a: z& x

5.OnActivate:

3 [9 K) J4 T! v N+ L' G7 ?

应用程序被激活时的事件

, U8 C, Q# _# M6 A. b

6.OnDeactivate

& v/ H% D8 h* z6 q6 _" G/ Y

应用程序失去焦点的事件

. l5 M+ j# e% |2 H1 E8 z Y

7.OnMessage

1 ]6 q8 b2 U9 v4 d+ I% S2 I q

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

( g4 P! J4 s. C1 i$ _$ Q

8.OnRestore

* K( N' A& U8 P

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

8 k$ o3 Y3 Y3 k4 b* R

TApplication应用小技巧:

: P3 t# P$ X7 Y$ E

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

" t& x2 q" b2 n2 {2 z

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

, v$ Z/ A/ F T( i

AnsiString filepath;

4 L3 n7 k+ J9 c; u

filepath=ExtractFilePath(Applcation->ExeName);

M) }" ]+ d6 `- l- d

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

$ H _+ J! ?6 R Z

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

j: N: i1 w6 Y( S

Table1->DatabaseName=filepath+"data";

8 J( i% D" Y' s9 n( }5 T8 {

Table1->TableName="maindb.dbf";

7 _$ O4 `$ B0 {7 t+ v

try{

' T) c; G" C. q! t) u

Table1->Active=true;

5 g! c2 Y. \$ W1 v/ y

}

7 E$ @% q' C- [* u' e5 q

catch(...)

0 P/ g- L4 |. c; _4 o

{

+ A0 a9 i# s: M+ e3 Q/ Y

//......

8 j/ i7 m5 W/ N7 D% c

}

2 G4 Y- ~) T, u; S1 O

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

. G% b7 ^* }3 Y+ b% H1 a2 s* N) b

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

, |: @5 f0 q# ], o' g

B.自定义异常处理窗口

2 X# ^& T+ H0 I2 I

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

' m5 O: b. I8 i1 J) Y% A

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

$ F5 z2 M( O6 Q. |! ^

void __fastcall TForm1::FormCreate(TObject *Sender)

# L# E3 j- a# U8 m

{

1 H: ^4 _9 y8 E" i2 c4 v9 B! ]

Application->OnException = HandleException;

+ ~/ W# P) m' R/ V R% x

}

o$ j/ l+ q9 k8 N% q3 A( C% p4 S7 |

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

6 c2 H6 W. ?6 H1 u

*E)

9 w- [5 S" D9 I1 \

{

% B$ c& [" C6 V/ N/ T

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

u4 T4 E, Q' y$ C3 v

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

, b Y* }) e* J. W) O, V

}

+ X" Q( Z& J# @

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

9 J8 v/ q! |1 `% w; g: b! O

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

: P; U. n9 @; M, F- n

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

/ r i" u& G5 X( H# R9 ?

用程序在空闲进处理.

9 `2 F6 |; x; u0 j 2 V/ R3 K8 {8 ?1 ]

void __fastcall TForm1::FormCreate(TObject *Sender)

0 y3 j- s9 L2 z% T$ G2 W% t+ g- {2 |

{

2 J: y) R+ n0 b/ L: X

Application->OnIdle = updatestatus;

8 H: s t, Y0 }# @

}

$ b" V$ v6 ?1 M

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

; r5 p1 X& D) L" O3 X

{

8 A- o7 Z0 Z, F1 A( p; g6 D

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

# y- j7 E2 l5 I y$ k" ^

}

1 W( A% d9 @) T m2 F1 O

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

) _$ w+ f R$ o1 ~7 \ M1 u

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

. V, @6 h. C) w0 c! m, h B2 `

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

2 y* H% x% d" r1 l' f& P

即可.

9 v! ~1 p/ i, J$ |. B) ]

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

$ v" b% e- S4 C

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

- A2 c8 H, Q2 K; b9 I2 |; @

Application->rocessMessages();

2 c2 {- I0 i* d% E. E) p

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

# C5 {- ~8 W4 P4 a

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-20 13:01 , Processed in 0.438938 second(s), 51 queries .

回顶部