|
4 g0 [0 j; Z; V9 S8 ~% x3 NTApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一 6 O* N3 q$ h3 ^6 m- c5 S4 P
个名为Application的TApplication类对象.在Project Options的Applcation页中,我们 " O- o9 ?2 E% }8 w4 l+ a3 D
可以设置这个Application的Title(标题)和Icon(图标).也可以在工程源文件中编辑App * j2 R. t- t/ p
lcation的代码.
U- f2 o( V, p7 p5 R7 SApplication对象不是需要经常使用.下面是TApplcation比较常用的方法和属性/事件等 + Z5 [+ @3 ^9 B {" c0 l
。
. c$ `4 S* o/ a6 @2 f2 U7 u一>属性:
" y! S% R$ M9 h) b1.bool Active: " p1 ^! w: o7 b1 e1 O2 }! `
这个属性是一个运行时才有效的只读属性.当应用程序处于激活状态且有焦点时它返回t
: I. N& V& Y; n6 }6 F- Hrue,否则为false
% D" @: r5 d/ X: ]) _6 Q2.AnsiString ExeName:
$ M* F. h2 f& ?+ b) I" L这是一个常用的属性.它返回应用程序的全路径执行文件名.运行时有效,只读. 4 k2 _) d; V" J& l( w. ?
Label1->Caption=ExtractFileName(Applcation->ExeName);//取得执行文件全文件名中 $ }# [* K( P& S0 `- M0 D6 g# F
的文件名部分
' w# n/ i3 c! ^1 a3 A# H3.HWND Handle: $ m& q W) x5 K) H# t
取得应用程序的窗口句柄.调用API时可能需要.这个句柄是不可见的应用程序的窗口句柄 9 Y+ v/ k; D) [+ x
,而不是主窗口的句柄.要取得主窗口句柄,可以用Application->MainForm->Handle. - ^! ~7 u8 k% v5 k( Q& G# p
4.TColor HintColor:
5 v/ G- d _8 G: {确定工具提示窗口的颜色.运行时有效
6 x; E) @0 {4 O6 O+ s& [7 n5.int HintHidePause: / M6 Y2 ~& v7 c8 M
确定显示工具提示后的工具提示显示持续时间,缺省值为2.5s. 0 b" @5 r- x2 I9 j" z5 T
6.int HintPause: 7 U+ p$ v" g) S& D7 ^8 I6 J
确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为80
1 y d6 |6 s0 \' W0ms % X4 j5 X2 W3 C: a8 y# {( T
7.int HintShortPause: 6 _7 f2 H9 X" E8 q: G& C- M
确定工具提示再次显示之前所需要的等待时间.缺省值为50ms $ S1 f) Y7 ?" a- l
8.TIcon Icon: ' W" x, E5 y. t( O. E/ g
应用程序的图标.此Icon出现在应用程序的任务栏窗口按钮上.并作为在文件浏览器中应
) S) ?, |3 t0 s4 C; y用程序的图标.一般在Project options中的Applition标签中设定.当然也可以用代码: ( P: [( M: c- N
Application->Icon->LoadFromFile("e:\\icon\\cb3.ico");
6 o) |- Q+ X, n+ I8 r2 \! ]6 {9.TForm MainForm: # z% Y3 ?! I" K
应用程序的主窗体.这是一个只读的属性.主窗体就是应用程序最先创建的窗体.可以在P ( N& x* ^4 ?2 S F- q% f" H
roject Options的Forms页中设定.当主窗体被关闭时,应用程序将结束. / a! y5 J% M+ M! A, G) p/ w' v
10.AnsiString Hint:
. X5 h0 A* V! `' A: v6 R3 B k1 Y应用程序的Hint(工具提示) f1 z& g( `6 H& f+ Y
11.bool ShowHint:
- W" _' ^& Z1 K R5 W, x是否显示提示
% T: Y4 S S5 g' y/ d; e) n12.AnsiString Title:
3 t3 ]( k2 N9 m" Q8 c应用程序的标题,它显示在应用程序在任务栏按钮中 8 Y# j) A% O% O9 p. U. q' R
13.bool ShowMainForm;
7 U) u4 a1 }9 T/ h/ G# s1 b是否显示主窗口,缺省为true.当我们想建立一个不显示主窗口的应用程序时,在工程源
J& ?/ ]& q. u f6 j5 X. D4 \1 }3 z% ^文件中的Application->Run()之前设定这个属性为false即可.
6 j+ ]; Z, H' \4 a- m1 n! M14.bool Terminated;
, U* s. f! b3 I% {: c6 _5 l检查应用程序是否已收到关闭消息.如果为true,表示应用程序即将关闭.
" B% \0 `: T& a: o二>方法: ! N& ]# t- M) f6 M
1.void BringToFront():
2 [& S1 B# T7 p- ]将应用程序置于激活状态并且拥有焦点.它将使用应用程序的窗口置于其它应用程序的窗
1 R/ r" S% X7 I4 p& \6 J口之前.
1 V; q5 @, j9 W- i( s& WApplcation->BringToFront(); - u' y u8 k. b' A- h4 K
2.int MessageBox(char *text,char *caption,int flag); 1 P7 u& F) Y) B( N( _7 u) `, `
这是最常用的方法了.显示一条消息的对话框,可以有一个或多个按钮.它封装了API中的 : y1 w) M) K E* o8 V$ Y
MessageBox函数.
( B6 ?( W8 \( ytext:消息字符串,可以是多行,多行可以用"\n"隔开.如"你好!\n欢迎使用本程序." ' J. {* z @$ ^% _# h/ ~5 w9 A* I
caption:对话框标题
! V& C5 u* w% k8 Q$ Z4 h: B o, Yflag:决定此对话框形式.常用的如下(位组合,用|)
7 C. ^. o% h( c' R按钮,决定对话窗口的基本用途 # f ^/ w/ p: E8 q# i+ `
MB_OK:显示一个OK按钮 8 Z% w# ]3 V$ J" p& N& `( `/ ~
MB_YESN显示二个按钮:Yes或No 3 J% Y. W' v4 t% r( ]' M
MB_YESNOCANCEL:显示三个按钮,YES/No/Cancel ; Z8 `- i( Z- E9 g
MB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略)
# T, P: l/ i$ `( r: }MB_HELP:显示帮助按钮,当按F1或点按钮时触发Help事件 ! Y$ m# w: m o3 s* Q) C
缺省按钮: 1 V8 D9 t3 c& w5 D
MB_DEFBUTTON1/MB_DEFBUTTON2/MB_DEFBUTTON3/MB_DEFBUTTON4:决定哪一个按钮为缺省
4 x6 ^# W* _5 U$ N按钮.缺省为MB_DEFBUTTON1
: S* Q! f! q$ u2 G9 O0 q图标: 9 X. S" I/ \# X; U9 j! a
MB_ICONSTOP:显示一个红色X图标
- l* ~" N2 H/ M1 D1 MMB_ICONINFORMATION:最常用的提示图标,一个小写的i - N1 ~2 x# V& h; I
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 * z: F0 _2 l! c& ?, B
返回值:
* q7 b3 D2 w& s" B" A9 t9 xIDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回. 1 A# @: \7 l( Y: W7 A3 M8 x
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
: m7 c3 d& Y3 E& gNQUESTION)==IDYES)
" w. S- J. Z" K+ @+ j# d( c' j{ # y$ o7 [1 e, r. f1 {5 b
Close(); 2 T4 L8 B; g+ [/ x9 P, E5 _1 r- o+ \
}
0 R# P6 `$ i+ }3.void Minimize() 6 _, t+ S; n7 n6 o6 u+ X w
最小化应用程序的每个窗口和当前显示的窗口 . C( h4 o6 D& X
4.void Restore()
' r$ Q5 x0 o6 x- h4 g还原一个最小化的应用程序 " |1 U$ `8 H8 Y7 Z$ ^
5.void Terminate() . v& B0 i& E7 H: d. i; M. a: E
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序 5 K9 |" Y. }5 h6 K/ C% T+ m; ]3 z2 W7 R
6.void ProcessMessages(void)
) u% o% f' ?/ n1 G常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
* {$ F6 {8 t! b0 _MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
0 Y8 L3 z) W7 g; K5 _1 ~. V返回值:
; O( Q$ g: L0 P/ b. L: G' Q按钮.缺省为MB_DEFBUTTON1
J/ h3 [# P9 L' h7 P' h; j6 f5 Z1 t图标: # C. }( b* b8 U% u5 S
MB_ICONSTOP:显示一个红色X图标
2 \% t1 ^) P3 z% i* l4 ZMB_ICONINFORMATION:最常用的提示图标,一个小写的i
/ q- |% q0 D7 L, j- Y% SMB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 3 y; }4 m( W, h& W" J+ I' }
返回值: ( f- B; d5 H, S3 j
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回. - V& e0 K4 C' y7 C
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO - ]6 ?. T/ O% C
NQUESTION)==IDYES) 9 K" O! U7 S& R# c' a. s
{ . i$ R4 o6 A8 ^ [& b
Close();
/ O7 M/ h2 K& Q, ?/ R" H# a}
8 N# n% k; U+ j y0 u3.void Minimize() 0 ~1 \ S- p4 N+ u% Y! h
最小化应用程序的每个窗口和当前显示的窗口
2 F1 a- C; E- U4 {4 N4.void Restore()
6 v0 v9 ?! Z- l$ E% X' ?还原一个最小化的应用程序
/ P# f8 @$ n) L( w5.void Terminate() 8 v J5 y8 y4 O [* s" U, J
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序 $ P* p! Y) M6 b9 {
6.void ProcessMessages(void)
4 h. g3 }2 G w8 t4 ~* ]常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
1 a5 U0 n/ l# R/ w6 @" C/ {中的消息
; b2 j* ~; H/ G三>事件:
6 y$ e. X/ x, Z5 g! N1.OnHint 1 |; t* ~4 S" e- A/ Q5 ]
当应用程序的提示要显示时的事件.我们也可以将它指向自定义的函数中作特殊的工具提 5 e* V; \+ {1 K/ |5 m( ]; W
示显示 . i/ E2 M) G7 o3 a* ^% i; `
例: ; P6 N' D6 L5 r# ^" K ~' ?
void __fastcall TForm1::FormCreate(TObject *Sender)
5 Z. t# s- y* J{ 9 V3 ] U3 i, {6 W# c' S2 `
Application->OnHint = DisplayHint;
" f2 ~$ V5 a" V} & x& {0 p+ M- r7 u, v
void __fastcall TForm1: isplayHint(TObject *Sender)
2 _3 o" x0 C# \# p9 w6 e, q6 h{ ; L0 K7 ]5 `* m* E, y
StatusBar1->SimpleText = GetLongHint(Application->Hint); ( h! |+ ]. B+ H. b3 @ A' N
}
8 u8 l- C u+ u0 E//一个Hint可以包含由|字符分隔的二部分.GetShortHint是另外一个函数
1 n ` H( c+ x2.OnIdle: % R: h) ~. U( U$ L7 M
当应用程序空闲时的事件.通常在这时候作一些不重要的状态检测或处理要求不是很严格 9 y5 W8 i5 e5 a3 Y! }
的任务.
9 a: a/ @" K* S# X! i% G3.OnException: # J* t8 S% |: B+ _3 C% \! o) s
当应用程序发生异常时.你也可以自定义一个异常处理过程而不用缺省的ShowException
1 N' h& X/ R; v 7 e2 V6 P7 r" S
4.OnMinimize
& b$ L% _4 R) l应用程序最小化时的事件
( z6 h; r. H, ^7 j/ u+ j; ]& z( i2 w# `5.OnActivate:
! } ^$ j% W# V2 @+ N应用程序被激活时的事件
2 E. W& \! Y3 ~( y5 p6.OnDeactivate * \% }' Q% J+ Y
应用程序失去焦点的事件 $ u% _. r" p7 s, o8 P6 P6 ]
7.OnMessage
: s& G& \$ N* ?- k" g应用程序接收到消息时的事件.如果你想作特定的消息处理.你可以按管这个事件 $ h0 n' B/ G/ ` P$ ^
8.OnRestore
- J' J; ^. s; y1 C9 K; w9 d应用程序由最小化状态恢复时的事件
& i, U' P9 o) p0 \6 e! MTApplication应用小技巧: ' b, [$ v3 {9 I
A.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT
9 g h3 W) x# G. a+ {3 B/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的.
+ Y3 M2 H Q( b- I5 |; R* d9 jAnsiString filepath; 4 D9 [1 \; E& |# K9 F
filepath=ExtractFilePath(Applcation->ExeName); + q% t9 ]5 g( T
//ExtractFilePath与ExtractFileDir是有区别的.表现在ExtractFilePath最后总是有"
" ?. N5 ?0 ]7 Z% p7 Q B# p$ A\\",而ExtractFileDir只是在路径为根目录时最后才是"\\"
7 R, r$ G: \6 D5 F Y. |# HTable1->DatabaseName=filepath+"data"; # H5 J0 u2 F+ B1 v, |: I: n
Table1->TableName="maindb.dbf";
7 s0 @% e+ P% z! mtry{ " h1 K, Q1 O6 x, w
Table1->Active=true; + @& O* Y4 n, R; o6 h! }6 m2 J% m
}
- m9 u0 D0 [5 l$ z6 i) K, t( Kcatch(...) 7 m+ M9 H2 a( }& g
{
, R% K) O7 b9 @5 G- y% V//...... ; R3 d) n! i) @3 G0 n5 ~- k
} 0 O9 ^1 \4 l( \9 X! g; H7 [: U
另外有一个函数ParamStr(int index)与Application->ExeName有同样效果.ParaStr(0) 5 P, }# D N" E2 s+ L9 @' i% Y! N- Z
就是应用程序命令行第一部分.也就是执行文件的全路径.
$ o* @% y7 Y* \. d! c' R$ k1 bB.自定义异常处理窗口
" r' K' z" K" k0 y, U缺省异常处理窗口是用ShowException显示的一个窗口,其标题为应用程序的Title.我们
& C V* ^' S0 Y* E6 @7 Y! T, R也可以自定义异常处理函数,以便对异常进行自定义的处理。 : M' X7 T2 I- f; @. K+ e4 X
void __fastcall TForm1::FormCreate(TObject *Sender) : K0 Z: G# X, T1 U) w: q, t
{ 1 _: c) u4 j& q) E9 Y" ?( S
Application->OnException = HandleException;
- n# B1 U% ]6 W6 v}
9 J3 @. Z" {; E6 Qvoid __fastcall TForm1::HandleException(TObject *Sender,SysUtils::Exception 3 f. I2 \3 x, N3 X/ a# V) U- k
*E) ; @- f D1 u' l* h4 z' k
{
! b1 I! t. Z5 j* @9 s1 B7 V9 VAnsiString errorstr="应用程序发生了错误.\n"+E->Message; + p/ f( K' V7 r/ }% t3 b5 Q. c
Application->MessageBox(errorstr.c_str(),"发生异常",MB_OK);
+ b* `; u6 H1 j! y4 L}
3 a- d( R" j/ }, o- @7 D* J" ^C.利用OnIdle事件做一些时效要求不严的任务. 6 b0 w9 [& j6 I# G0 s) }
我们用Timer定时处理一些事务。但Timer是要占一定CPU时间的,对应用程序的执行效率
7 g2 L: o, X3 j- E8 ?8 S5 d有一定影响。如果这个要处理的事务并不十分重要.我们就可以放在OnIdle中处理。让应 9 y+ n8 q' ?* |
用程序在空闲进处理.
. j; C" J' Z/ _, q* r* q! o) W8 M$ k: `! A/ o/ F; u9 c; i
void __fastcall TForm1::FormCreate(TObject *Sender) ( {& m+ s# `% e9 I' B3 {6 e
{ ; `9 I5 J# d* ?* o* K4 T# B# e
Application->OnIdle = updatestatus; + O: v6 h2 z0 ?* k3 L* R, @
}
' K+ u+ |) s/ ^void __fastcall TForm1::updatestatus(TObject *Sender,bool &Done)
9 h" d' Z/ i: @{ / z% M$ y& \" j3 [" Z& Z3 J4 y7 O
StatusBar1->SimpleText=DateTimeToStr(Now());
' E( @$ Y4 O2 }}
' ] Z+ f, e: f8 M b8 J由于C++Builder5已经将Application做到了控件选取面板上。这使得我们对Applicatio
: x6 m$ e1 ^4 D) R. m3 b; t$ p, @n编程比以前方便了不少。以上的方法对cb5以前的版本是很适用的。如果是C++Builder
0 y/ b# i: x9 g9 w" h3 O5,我们也不用这么麻烦地写代码了,直接在Application控件的对应事件中写处理代码
- Z! ]/ ^( G' z即可.
: q$ z6 K: Q1 h$ o5 b, O2 [D.在一个长时间的执行代码之前或之中及时处理其它消息
7 P4 g! @/ M3 qForm1->Label1->Caption="开始执行指定任务:"+jobname[0]; . O- w5 k9 Q5 R7 C! k, w
Application-> rocessMessages();
, g: p m& U8 n' f2 I8 Wrunjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息 2 n& k5 K* ~5 w! N3 Q& C. Z. p
|