|
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 Blcation的代码.
4 o* m+ m6 M+ d" L8 gApplication对象不是需要经常使用.下面是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 Erue,否则为false
" Z% D4 d! e; G6 ]. B2.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& Y3.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- i4.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" w7.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% _( [% SApplication->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" C2.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) bMB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略)
# r: q* D( C. K6 E4 T& qMB_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 PMB_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 nIDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.
: H9 c0 x% t% w) ]# o" g! Z1 g2 t) mif(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
( P+ o6 p6 T1 A# P" mNQUESTION)==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& Y4.void Restore()
* l' {! Q6 y4 `( w- B还原一个最小化的应用程序
. |% M6 Z2 p! Q# w. d2 H% v5.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 UMB_ICONINFORMATION:最常用的提示图标,一个小写的i
) g, [! ^3 B' ~5 i. R: ]* T% k" IMB_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 g5.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& |) S1.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* Avoid __fastcall TForm1::FormCreate(TObject *Sender) ! ?/ V' N( e6 f: z4 w
{
+ V H6 x4 a/ N9 a6 K/ @0 r8 qApplication->OnHint = DisplayHint;
9 F/ [9 v k% G% s3 q}
" S1 H: j: i9 t# Ovoid __fastcall TForm1: isplayHint(TObject *Sender)
9 U; s4 G/ ~$ f{
0 {- B4 N( ?" l6 Z& tStatusBar1->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; g3.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, y4.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% K6.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$ hTApplication应用小技巧: " b# `/ o3 E% M( R. U
A.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT
/ s& _2 U6 l$ F/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的.
. h+ C$ x$ p2 a2 X( fAnsiString 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 YTable1->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$ oB.自定义异常处理窗口
, 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 Rvoid __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/ ZApplication->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- mApplication->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! rStatusBar1->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
|