|
# I; T* k/ F* a) y3 }5 RTApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一 / [ c% Q% ?1 N$ Q7 b6 Y. g9 n$ q
个名为Application的TApplication类对象.在Project Options的Applcation页中,我们
' P$ g: o( D# |5 l8 e8 O# d* C可以设置这个Application的Title(标题)和Icon(图标).也可以在工程源文件中编辑App {5 z' h; F% V; C4 B& F; t# m) [
lcation的代码.
% q- d/ _ D1 yApplication对象不是需要经常使用.下面是TApplcation比较常用的方法和属性/事件等
, T& ~: [9 `3 V% Y。
2 I) j) g4 d$ d6 I5 a一>属性: $ i. z) z2 i9 q# c# Z1 l
1.bool Active:
' K7 J8 d8 k/ \ M这个属性是一个运行时才有效的只读属性.当应用程序处于激活状态且有焦点时它返回t
" e* _2 ^- U1 ~( j# }rue,否则为false
' ]3 M' j' X% ~7 { J" G2.AnsiString ExeName: ; ~( W- [) b$ K( Z% h' n
这是一个常用的属性.它返回应用程序的全路径执行文件名.运行时有效,只读. ) s7 N7 ~0 U1 |4 r* }! Q3 q) S- T$ \
Label1->Caption=ExtractFileName(Applcation->ExeName);//取得执行文件全文件名中
% z! U; ~- Q Y' ~- p; w的文件名部分 3 l) [8 i; P& e/ j2 k( \( Q7 y. b
3.HWND Handle: 3 l. I+ [; G$ y6 p* a* |
取得应用程序的窗口句柄.调用API时可能需要.这个句柄是不可见的应用程序的窗口句柄 % P8 o5 X# H n9 d# C# x/ W* k% n$ ~
,而不是主窗口的句柄.要取得主窗口句柄,可以用Application->MainForm->Handle. & Z9 Q7 C5 F" j! ^. }( ~
4.TColor HintColor:
( e- u% N- \1 R& Z- t% A确定工具提示窗口的颜色.运行时有效 # _+ |6 \) k/ ?# u$ ~0 w! q* E
5.int HintHidePause:
8 h9 P7 E& H4 j9 H3 V确定显示工具提示后的工具提示显示持续时间,缺省值为2.5s.
9 \* ^% H5 g _! p& g6.int HintPause: 3 k( `) k7 W$ M/ Z6 P
确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为80 , V. `, D# c: S+ M# T: v
0ms 7 I8 a7 o% P( Q1 S
7.int HintShortPause: & `! F; I8 ~ ^8 e& \: d: d: U
确定工具提示再次显示之前所需要的等待时间.缺省值为50ms ( _! i, ]' o$ J" S7 T6 j- F
8.TIcon Icon: 9 T" z6 v- }9 t2 m
应用程序的图标.此Icon出现在应用程序的任务栏窗口按钮上.并作为在文件浏览器中应
' u/ K/ ~; M. ^% m: w用程序的图标.一般在Project options中的Applition标签中设定.当然也可以用代码: # c% L+ F+ K- `- |" h2 f. H4 G
Application->Icon->LoadFromFile("e:\\icon\\cb3.ico"); C J* R2 g! Z t! I9 y
9.TForm MainForm: Z) I6 }8 T/ H) _7 v! x
应用程序的主窗体.这是一个只读的属性.主窗体就是应用程序最先创建的窗体.可以在P
( q4 e" K' G4 c: ?1 |roject Options的Forms页中设定.当主窗体被关闭时,应用程序将结束.
3 R* @$ M, U& r+ B9 Q2 n10.AnsiString Hint: 5 a" a5 _9 ^) B6 l' j& m
应用程序的Hint(工具提示) & h3 S% J8 M) Q1 ~- m- X+ @2 Y- ^
11.bool ShowHint:
4 r) [) S( n/ v" k是否显示提示
. E* N4 j: N+ A4 J; W12.AnsiString Title: * V1 ]- x: L. P% ~
应用程序的标题,它显示在应用程序在任务栏按钮中
5 G& C, q H& P7 N* p13.bool ShowMainForm;
1 ~ `( S: ^: Z H是否显示主窗口,缺省为true.当我们想建立一个不显示主窗口的应用程序时,在工程源 ; f* y* |- S- i/ f: `
文件中的Application->Run()之前设定这个属性为false即可. ( K# f6 L- K* h0 z9 R S/ h8 j) @2 i& T) Y
14.bool Terminated; / ~+ h) j6 _/ F/ u) ~) C% u
检查应用程序是否已收到关闭消息.如果为true,表示应用程序即将关闭. , o9 n4 [: S- p u
二>方法: , F) F x9 ^- M6 D/ r6 Z; k
1.void BringToFront(): ( \! x0 l9 C1 e
将应用程序置于激活状态并且拥有焦点.它将使用应用程序的窗口置于其它应用程序的窗 0 \4 V: X* R+ m0 a$ U+ T
口之前.
* B1 Q4 b* r$ d$ v# ~1 s4 x0 ZApplcation->BringToFront();
( |! r! E" `6 }2.int MessageBox(char *text,char *caption,int flag);
7 P1 t/ U& O$ Q! |这是最常用的方法了.显示一条消息的对话框,可以有一个或多个按钮.它封装了API中的
) {) ?- I. `- ?% \7 {5 T( F5 wMessageBox函数. 4 l/ \- M( z' H5 ~1 M
text:消息字符串,可以是多行,多行可以用"\n"隔开.如"你好!\n欢迎使用本程序." - ], K; `: J6 E- E7 s
caption:对话框标题
4 ~5 j6 \- ~, W t) z( sflag:决定此对话框形式.常用的如下(位组合,用|) # z x; C" `2 F* @0 i/ D
按钮,决定对话窗口的基本用途
9 V1 _: J+ d+ EMB_OK:显示一个OK按钮 2 e3 i" o4 J5 O t3 l
MB_YESN显示二个按钮:Yes或No
- f3 c6 w! x, U& gMB_YESNOCANCEL:显示三个按钮,YES/No/Cancel / p" V# x5 w5 H- g; h
MB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略)
9 [3 O7 d0 \$ Z5 }% T( ?5 h' }3 LMB_HELP:显示帮助按钮,当按F1或点按钮时触发Help事件 ' |8 R( d4 {: r* u4 P4 p1 y8 }8 d
缺省按钮: 0 g7 ?! N% ~3 _/ `) y8 r& l F
MB_DEFBUTTON1/MB_DEFBUTTON2/MB_DEFBUTTON3/MB_DEFBUTTON4:决定哪一个按钮为缺省 ; a2 d5 D1 Y& h. z. }, A2 {
按钮.缺省为MB_DEFBUTTON1
1 m5 V/ z) H# e, ^- h( {% W图标: 4 Q( X; ]: z( {
MB_ICONSTOP:显示一个红色X图标 0 O& V9 u* \0 y- Y' B. b9 i
MB_ICONINFORMATION:最常用的提示图标,一个小写的i ; m0 e/ U8 d! V1 A T$ N- j+ c C
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 & Y3 K( [: b- g, ?, j( |4 q
返回值: 4 A5 {# Z, `! q0 p& c
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回. 9 S! N; |! O/ n! q- q: B T
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO 9 h5 b4 f+ j1 d
NQUESTION)==IDYES) 1 ]: r+ r$ |2 i. @) H
{
6 p0 V v( j8 f2 P% MClose(); 7 X- s- I# B6 E5 A4 k: q
} / L0 g# J6 j2 w7 l
3.void Minimize()
o' n3 _9 ^, h! A* }最小化应用程序的每个窗口和当前显示的窗口
, U) Y ?& k- O$ x" I4 l# L# v4.void Restore()
# N* x& a) E: Y a还原一个最小化的应用程序
" {8 @/ c) X% a7 B3 m( T' B4 K5.void Terminate() , A' V9 N' y0 A
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
3 l8 C$ z* e* C H& s* s! @( S6.void ProcessMessages(void)
y7 z @9 L7 L, T& G常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列 + r7 ~1 y$ c: n7 X
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
" q, f# G8 h4 r, F返回值:
" X6 N3 u$ z6 B按钮.缺省为MB_DEFBUTTON1
: s% Q, N- o6 ^图标: , p* V- G8 Z* S. {9 l
MB_ICONSTOP:显示一个红色X图标
$ l$ p. x1 w; c c4 EMB_ICONINFORMATION:最常用的提示图标,一个小写的i p: h7 z$ [! F+ q+ s" }; ]
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 , j) Y# r; h- a% b& U8 _( V1 Y) T
返回值: 1 W1 @* |5 u2 m! M K
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回. : O' M5 _ F S
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO 7 ~ C# k9 }6 h' d7 Q. l
NQUESTION)==IDYES) " R; z1 u& _2 k- O+ e
{
( Z6 W$ k) Q( ]+ oClose();
" ?; \+ [$ X; U' E$ w9 ^% q2 I}
( U, N) } u0 }3.void Minimize() / k7 G3 [. `# C1 `4 ?( H- L; c5 \
最小化应用程序的每个窗口和当前显示的窗口 ) [" k, @4 u* n' w
4.void Restore()
) S# O/ @' K/ c7 C还原一个最小化的应用程序 ; X4 J5 X% Y& u9 S0 J, j
5.void Terminate() & J" V# U. M K3 m q; x
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序 2 h" T$ ~/ U$ A/ O
6.void ProcessMessages(void)
; m/ J3 b+ p5 g$ j2 Z$ |) a- c常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
- ]6 l) L( q6 [2 ^中的消息 2 d. h' H0 @! n
三>事件: / A7 F- A v7 r" ]2 p, H+ Y
1.OnHint ; N" S- k8 l, I& P# G1 ]
当应用程序的提示要显示时的事件.我们也可以将它指向自定义的函数中作特殊的工具提
. k. y. r4 a0 l( m7 m0 d" `$ G示显示
) R, ^, U! E9 D' @例: 8 p/ s% H T2 U- ]3 G9 k* c9 d- b
void __fastcall TForm1::FormCreate(TObject *Sender) 9 W% z6 u$ }* P9 B: F: a
{ 9 E* X* I9 k+ X/ i$ g; O: _
Application->OnHint = DisplayHint;
i$ n& C, l- [! y/ {; V} 6 k3 v4 V: o, L) D8 x) [
void __fastcall TForm1: isplayHint(TObject *Sender)
# p) ?% q+ ~$ u3 N{
; s& j- Z* |7 W1 ~/ yStatusBar1->SimpleText = GetLongHint(Application->Hint);
6 Y, `7 W' r b4 m}
( R( m" d1 n( R* q% Z% J& y//一个Hint可以包含由|字符分隔的二部分.GetShortHint是另外一个函数
- y q1 \" i) u: u/ k2.OnIdle: 5 i8 ?" e% {6 x) n2 \
当应用程序空闲时的事件.通常在这时候作一些不重要的状态检测或处理要求不是很严格
- [9 g3 |3 m4 m; L4 ~的任务.
2 Q: @- }2 e7 k6 W i9 i3 L3.OnException: ) W$ O* }. ~4 }$ ~( j0 n0 j# D
当应用程序发生异常时.你也可以自定义一个异常处理过程而不用缺省的ShowException
8 P# Y& o a1 C- @4 u! A% q
# B. z; G! T0 D% v4.OnMinimize 1 @$ H+ ], Q; [0 j/ y8 w9 ~# H
应用程序最小化时的事件
4 `8 G6 r# ]6 j5.OnActivate: / J) }; [+ f- C# W L
应用程序被激活时的事件 4 E$ W1 K9 `5 U% k: B, n' i! }+ I. E
6.OnDeactivate
1 A, J8 B, i& U% }3 ^0 |# I应用程序失去焦点的事件 " F/ W" X+ g) h# d" t& W; Q4 G' t; V; E
7.OnMessage ( o9 Y, I, s/ ^: p
应用程序接收到消息时的事件.如果你想作特定的消息处理.你可以按管这个事件
1 r p1 O3 V# ]+ [8.OnRestore & o6 n0 A, H8 h. d4 S* }. [
应用程序由最小化状态恢复时的事件 $ O( w( m# L r6 m
TApplication应用小技巧: ( A+ E e& s7 x. K) k
A.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT 2 u5 ?) D* T( @* @4 B* o
/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的.
$ c( \5 V' M2 g; D- d5 c# sAnsiString filepath;
2 n1 `9 ]6 c: H8 ~1 R0 ^" ofilepath=ExtractFilePath(Applcation->ExeName);
5 X# t, k* }8 ], D6 d5 j//ExtractFilePath与ExtractFileDir是有区别的.表现在ExtractFilePath最后总是有"
9 w$ `$ }/ Z+ m1 z: ?\\",而ExtractFileDir只是在路径为根目录时最后才是"\\"
, |# f/ W& F, V; d4 j; _5 WTable1->DatabaseName=filepath+"data";
f4 p: }, I6 KTable1->TableName="maindb.dbf"; " y% ~" _$ c. s9 S6 {
try{ / O x {3 h4 W2 E O
Table1->Active=true; # u/ n+ m# ], B% I8 s5 M
} - I: v/ `4 v3 O. X/ V0 U1 d
catch(...) : b1 n8 `. ~+ T
{
: W0 \, }# A* L* e" t4 n//......
) e+ M8 b7 Y5 }9 n. f5 A} 2 d* c% g( s( M* w) r+ }7 C& a4 d
另外有一个函数ParamStr(int index)与Application->ExeName有同样效果.ParaStr(0)
) ?& S/ H3 v5 F9 L( j. u1 h就是应用程序命令行第一部分.也就是执行文件的全路径.
& |8 g( X2 x% }! O- sB.自定义异常处理窗口
8 W) D6 ~3 L* q: k: A" \$ x9 n缺省异常处理窗口是用ShowException显示的一个窗口,其标题为应用程序的Title.我们
+ c- z/ T1 S1 T/ r& R也可以自定义异常处理函数,以便对异常进行自定义的处理。 5 \2 ` X& v2 T3 r
void __fastcall TForm1::FormCreate(TObject *Sender)
7 d5 ]4 R1 V: c3 z g( v1 b{ ( B8 z/ l( |6 S4 L- P$ c
Application->OnException = HandleException; ; p c$ Z3 `+ Q
}
/ P1 n$ ^! [, _6 g5 e2 a/ e# ~void __fastcall TForm1::HandleException(TObject *Sender,SysUtils::Exception ( X! f, k+ {7 ]
*E)
4 F8 T ?3 k. }; }/ X/ i% J{ ( s6 m# F3 d$ L
AnsiString errorstr="应用程序发生了错误.\n"+E->Message; i4 k2 L" c! n7 v) `
Application->MessageBox(errorstr.c_str(),"发生异常",MB_OK); - E r# H/ a2 B! u% t0 a3 b H. Y
}
( ~4 c) H5 k, O" J1 @* ~C.利用OnIdle事件做一些时效要求不严的任务.
3 H9 ~7 P9 s! k我们用Timer定时处理一些事务。但Timer是要占一定CPU时间的,对应用程序的执行效率 ; w: p9 s( d! P* I' e) Z5 M, W2 B7 v e
有一定影响。如果这个要处理的事务并不十分重要.我们就可以放在OnIdle中处理。让应 & g& g2 i b" y* z
用程序在空闲进处理. # M, ]5 u4 a0 g3 c. L
/ K1 M* n* C' \8 J2 Hvoid __fastcall TForm1::FormCreate(TObject *Sender) & i' B$ d4 r. ^2 D& p0 D8 l- x w
{
3 s! Z' D9 l& sApplication->OnIdle = updatestatus; ) j) V. @& k, G3 ^
}
) s% L) I8 V9 y/ R. svoid __fastcall TForm1::updatestatus(TObject *Sender,bool &Done) ! E( Q5 i& j6 L& `2 C1 w
{
8 s& p1 ^, S' _) [StatusBar1->SimpleText=DateTimeToStr(Now()); : u% p ~( j# @8 d" h1 s
} $ l0 q4 [, V5 P
由于C++Builder5已经将Application做到了控件选取面板上。这使得我们对Applicatio 3 @+ o6 B4 x% C' g4 i4 M, S G
n编程比以前方便了不少。以上的方法对cb5以前的版本是很适用的。如果是C++Builder 3 J2 z/ T( l; y2 O. s% h0 Z
5,我们也不用这么麻烦地写代码了,直接在Application控件的对应事件中写处理代码 0 x) Q# [: U2 Q1 F" e2 y
即可. ; y9 R- u6 G1 S& K
D.在一个长时间的执行代码之前或之中及时处理其它消息 7 L( k. `6 c9 W$ j8 U# W3 @
Form1->Label1->Caption="开始执行指定任务:"+jobname[0]; 6 P: W0 v7 P$ T0 U5 h
Application-> rocessMessages();
2 i4 y" b) Q* Q8 z$ O: zrunjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息 * q5 Q3 p6 [, n: h: G
|