QQ登录

只需要一步,快速开始

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

TApplication类的简要说明

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

5 c- C3 y+ ?7 P2 @* k! N* y& @ TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一

. W9 D# E6 e; `: Q! D2 n) s# f3 S

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

$ U; b3 c! ~9 }, `

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

# T2 \ F2 P5 L4 \. {3 B

lcation的代码.

4 o* m+ m6 M+ d" L8 g

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

( }! N; z8 `" O* M _" d

% m6 ?# V) ~$ M @+ c, p& `% S- O9 V

一>属性:

1 C- V4 P. Y' e. e$ S& |

1.bool Active:

4 U- U0 w2 x6 O2 r

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

1 U; e% H' T; `+ k' s4 Y. ?7 E

rue,否则为false

" Z% D4 d! e; G6 ]. B

2.AnsiString ExeName:

( r* ^5 Q' q- Y# ~9 E% ^: q

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

- c5 L6 }: n( q; o

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

0 L6 \8 Y! h; Q# _) b' G

的文件名部分

: V; W+ b/ Z" k& Y

3.HWND Handle:

1 p% O2 V/ W3 V7 z" V7 j" }( p

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

# n, v' R; [5 Y+ P ?$ U

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

( }1 c* U: L! D- G- i

4.TColor HintColor:

" m& j0 w5 O, i* S# T# |( `

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

+ N0 e4 F/ ]& }. [- {2 m, s

5.int HintHidePause:

: A4 W5 U# s. T

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

( D( O) C7 R( G) y' z5 o: K6 d+ p6 l

6.int HintPause:

5 m: [: F- h' F! x. l1 L: ?

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

8 }' d& M5 H* k: z# f }

0ms

/ m+ w2 t+ d4 ]2 F" w

7.int HintShortPause:

1 V) v* v1 N# T, V+ e, ^

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

; @- ^: x* F3 F9 m2 K4 H

8.TIcon Icon:

- L7 J6 P% h9 {5 S

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

3 w' ?9 A# `: l

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

+ C9 l, B6 n( {, v% _( [% S

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

/ j. ?7 `# _ t6 H

9.TForm MainForm:

' G. `* {, c! w( N) [0 e. F2 U

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

6 S% ^6 Z4 ?' X) m8 {; @5 A8 t! f

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

9 ]; c! |" s: C( A+ m7 w" l% Q

10.AnsiString Hint:

2 o r2 f+ z( U

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

0 u/ j% F7 Q1 @4 A) A8 K

11.bool ShowHint:

# T! c( X( M2 {/ P7 d

是否显示提示

( T! |5 [$ v* s

12.AnsiString Title:

1 L! i. _' C$ ]

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

0 L& ?3 z% P7 [

13.bool ShowMainForm;

3 X: K: B3 y7 n7 d$ V: g( V; S% ?) U

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

) u" C; s: ^ b* h$ h

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

' |2 ~$ I- K: r! }+ W5 d) R7 S; ~3 v

14.bool Terminated;

0 G* r" j j( j# G% x

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

3 H. P, n: n! R9 I

二>方法:

4 U5 b# O! ]5 k4 L4 _

1.void BringToFront():

4 c! I; _' C# i, s+ b

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

! h' s# a8 Q4 Y T+ E. o

口之前.

" r% u+ U7 R0 x! p

Applcation->BringToFront();

$ @( Z5 ?" h, a0 R" C

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

3 I& g( E6 x- B7 M4 \5 U; z

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

& O$ N9 q! y& e+ | u9 x

MessageBox函数.

- ]. E- Q9 H4 \' O

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

* j% B. l+ S9 {$ v! \8 D& F

caption:对话框标题

5 O7 s. ~) u2 b9 ?

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

8 h( g# d3 x2 `( Z6 i. M: m- _& {

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

/ V d3 q/ J2 ] @

MB_OK:显示一个OK按钮

& e, P% k6 y+ e6 o4 @# f

MB_YESN显示二个按钮:Yes或No

8 u0 j+ e! O2 A8 D

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

/ K7 u0 D* R$ h. y1 y* k) b

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

# r: q* D( C. K6 E4 T& q

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

( K4 a4 j) d) i% r1 L

缺省按钮:

j( ?: |9 d1 i$ \9 a8 ~' [

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

* a& Z, b5 B5 R5 T' ?

按钮.缺省为MB_DEFBUTTON1

" U% R8 P; C& Z L2 |

图标:

. q9 I& X" `& _- X% J

MB_ICONSTOP:显示一个红色X图标

" ^) l! B$ @) W$ l1 P

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

u( q* w1 T$ w% {( a

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

8 J1 I$ r0 I: v' Z, D' t: g

返回值:

, x" y# x Y2 S2 N- Z3 o n

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

: H9 c0 x% t% w) ]# o" g! Z1 g2 t) m

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

( P+ o6 p6 T1 A# P" m

NQUESTION)==IDYES)

, ~& {- H8 Z: l1 L% n

{

% S y; S; q+ r) Y

Close();

7 H" x) W- U0 ]0 r) J( Z. ?

}

& c% y" `: C \3 q9 @& ?. a

3.void Minimize()

$ O, \% }+ t& G6 F

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

5 C! y4 \! s( Q; `4 [ V+ k6 k; I& Y

4.void Restore()

* l' {! Q6 y4 `( w- B

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

. |% M6 Z2 p! Q# w. d2 H% v

5.void Terminate()

2 K" A0 t, C- m J3 X) h" V9 h

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

) m$ l5 W0 ~! A( F' J6 O% a* s

6.void ProcessMessages(void)

, Q5 m! ^5 z- p3 Z" F+ N

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

4 O6 o; N2 u& @

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

5 L$ C: |1 c6 ^ T0 }5 j+ O/ R# X

返回值:

) _; c# {, t7 F% t' W

按钮.缺省为MB_DEFBUTTON1

/ c4 w9 H: C4 w$ q/ |9 R" D

图标:

) d) {5 q7 ?7 x* E& @& o

MB_ICONSTOP:显示一个红色X图标

3 \# c# N" B0 `$ L2 v7 U

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

) g, [! ^3 B' ~5 i. R: ]* T% k" I

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

4 \. z# T C1 d9 v* l

返回值:

( O9 ^+ s7 S: r7 ~* ^ G

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

# p) {7 x, t4 v7 v2 E5 m

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

Q; w" O/ Q" [& L0 L

NQUESTION)==IDYES)

, z' m* a" H6 h! }2 ~" n

{

& n0 L: \; f- S# F8 K0 t

Close();

6 Z' h. p4 p- L6 I" \

}

& ?4 d' ~% w2 R1 Q

3.void Minimize()

/ F7 x3 j+ V& } ^$ k" {& _" x$ j( d

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

2 `% `" H9 \. f( N, G

4.void Restore()

1 H1 I7 U. A0 o3 B- A0 W

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

0 e/ L! L! T! q2 g

5.void Terminate()

# Q1 h6 W$ U# z2 B7 Q

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

. x: N' G. X# W- _& Z/ r" L" S6 B

6.void ProcessMessages(void)

& f; N5 L9 k! u8 p0 c" s) M6 b. c

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

; T" u7 R1 ^- _1 f) o7 m$ m

中的消息

; K) _& q3 C' F! a# [5 `

三>事件:

8 `4 t+ N) ~, Z; }( Q& |) S

1.OnHint

$ t/ a8 U$ k3 T# _1 Z" H; S

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

7 H8 C" F) O B# U$ u! N

示显示

* X! J& y2 [2 T7 V

例:

t0 x3 L) W2 W2 ^0 O* H* j0 C* A

void __fastcall TForm1::FormCreate(TObject *Sender)

! ?/ V' N( e6 f: z4 w

{

+ V H6 x4 a/ N9 a6 K/ @0 r8 q

Application->OnHint = DisplayHint;

9 F/ [9 v k% G% s3 q

}

" S1 H: j: i9 t# O

void __fastcall TForm1:isplayHint(TObject *Sender)

9 U; s4 G/ ~$ f

{

0 {- B4 N( ?" l6 Z& t

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

- G' S" ]# _7 v5 {. I+ }% \

}

7 w/ n8 A% q2 S( p0 G0 o) g

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

- v) K. o* O' Q) o+ }

2.OnIdle:

4 l4 d: p% Z. C0 w

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

7 F+ X1 ?, _8 G# r9 m8 m' B' S

的任务.

' p+ {+ y4 _7 S+ M* @# X; g

3.OnException:

2 F3 N: g: u6 m0 O6 h

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

8 b- N% Y. x+ Y9 i; q; u

2 j$ `( R- \4 B: s, y

4.OnMinimize

" T: f- p; w: b; H% e

应用程序最小化时的事件

8 s, h x/ L* ?

5.OnActivate:

/ N' }5 J4 i" A+ a; @

应用程序被激活时的事件

& M1 L- B% e/ F- v/ l% K

6.OnDeactivate

7 m- D; X; X) R( a' K8 }1 a6 m; G

应用程序失去焦点的事件

% _: `6 @0 x# P# x5 B/ {" o

7.OnMessage

% M0 z0 T) K8 v% _' G4 L: H) H& B& i

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

! K9 c( X0 K9 h1 G4 m; F

8.OnRestore

2 ]1 W5 F, S: e6 {! e$ b& `8 n* ?

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

! ]' t- X' w, M8 F$ h

TApplication应用小技巧:

" b# `/ o3 E% M( R. U

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

/ s& _2 U6 l$ F

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

. h+ C$ x$ p2 a2 X( f

AnsiString filepath;

. D) C8 M+ ~% \- @) W9 L/ L

filepath=ExtractFilePath(Applcation->ExeName);

8 a1 n5 h" c( L4 F

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

+ Q: e& \! i! ?7 t/ i3 Q* ~

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

2 E7 Q# |1 r, t" C' @

Table1->DatabaseName=filepath+"data";

# B* I0 p" ^* B4 a9 [% F! v0 Y

Table1->TableName="maindb.dbf";

( R+ ~' T8 @' M% T% o6 x/ j

try{

1 ?# Y; Z3 ?0 T, r5 ~/ H

Table1->Active=true;

2 V" X. ?% S, N- H9 N C

}

6 h Q0 K& n+ Q6 m3 t0 f( r

catch(...)

" D0 M$ {$ U# D0 F& }$ F2 m. W# E: k

{

# Y- `; w% J: B: ]; ?& |1 a2 V+ F

//......

8 [' E" ]( T# ~* v5 B3 J

}

* b! R, h- M* o0 f

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

! i3 M$ |0 s0 \4 n9 E& j

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

4 A0 r; }! U* D$ o

B.自定义异常处理窗口

, w2 k- X% y, ^) ]7 p5 C

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

' O; Y% O/ y) V# A

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

5 _& q) V0 y* @0 C- c5 O

void __fastcall TForm1::FormCreate(TObject *Sender)

" k& G v5 K% t$ T/ G3 K% h1 m/ z

{

2 z0 S$ \+ P0 e8 p8 U9 N* X

Application->OnException = HandleException;

2 t" Z m7 O- t

}

4 A) q4 n, c n8 L5 `* }3 R

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

7 J$ A0 W: L8 T* ~; Z1 f" h' X

*E)

/ ^2 c( c' Q3 s$ ^

{

* ~+ I9 {( K+ T& ~

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

2 ~* Y- w4 L7 q0 y: w5 z0 \5 F; e/ Z

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

2 C. O0 @7 d. _

}

2 n) J4 [* E3 S" D) ~

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

# [" N# K9 \1 v) E9 V& U

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

: G# O, `. s2 w/ x+ N

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

( C, n) V, Z5 Y; h0 k

用程序在空闲进处理.

3 x8 C* w0 {7 d" o# X1 K- a8 O" J" @5 p- O7 R! J4 D3 `& m. ~) X( ]$ H

void __fastcall TForm1::FormCreate(TObject *Sender)

! I8 n$ F% Z3 M9 x) B, E6 k

{

: J$ d- ?! C% d1 F% L9 a- m

Application->OnIdle = updatestatus;

4 _4 P9 [' I! |: ~; n" n

}

& z5 s- F4 M& a( V H

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

1 ]. S+ I* B" ^% k9 u) S2 j4 V9 u

{

- U$ ]( X' d( Y2 r! r

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

% Q t- H5 e d7 a6 ?+ H

}

' {" U: v. }: p M s+ z

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

( m1 b. S; v( c

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

, u2 o0 v x' ~2 c! K4 ^' B* H/ n0 K2 E4 [

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

& }" }2 n6 c! N+ R8 r9 X* J( M' r

即可.

7 H+ q( v2 n* _& s6 r* v" {

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

0 F% G3 r' o @, L4 O8 E- N

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

! K/ a# Z( W2 W

Application->rocessMessages();

; r: c Y* r, p ~( T4 B

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

+ O& L2 D1 V: e U5 H

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-19 13:15 , Processed in 0.432359 second(s), 52 queries .

回顶部