|
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( }$ EApplication对象不是需要经常使用.下面是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 Frue,否则为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 [% R6.int HintPause: % P- } m H9 t
确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为80
' X* e8 Z9 G _/ t# p+ U( L. W Q5 v0ms 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 d9.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: O10.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 c13.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) @# W1.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, WMessageBox函数. ! 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 dMB_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, YMB_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, UNQUESTION)==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, A5.void Terminate() 8 [* U: ^% K6 t! f
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
0 }- A U4 W* d$ W: d Q6.void ProcessMessages(void) 2 j8 p n1 n' a3 R, z
常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
7 i5 _0 h; {' tMB_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 fIDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.
2 X: A* R* C( cif(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 }* wClose();
: \5 z* V% `, X( v# w6 q}
4 Y- W" K+ c& I2 l$ ` Z3.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/ Q6.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, QApplication->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) N4.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. b6.OnDeactivate & v/ H% D8 h* z6 q6 _" G/ Y
应用程序失去焦点的事件
. l5 M+ j# e% |2 H1 E8 z Y7.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* RTApplication应用小技巧: : P3 t# P$ X7 Y$ E
A.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT
" t& x2 q" b2 n2 {2 z/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的.
, v$ Z/ A/ F T( iAnsiString 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( STable1->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 qcatch(...)
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' gB.自定义异常处理窗口 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/ TAnsiString 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: XApplication->OnIdle = updatestatus; 8 H: s t, Y0 }# @
}
$ b" V$ v6 ?1 Mvoid __fastcall TForm1::updatestatus(TObject *Sender,bool &Done) ; r5 p1 X& D) L" O3 X
{
8 A- o7 Z0 Z, F1 A( p; g6 DStatusBar1->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 un编程比以前方便了不少。以上的方法对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 CForm1->Label1->Caption="开始执行指定任务:"+jobname[0];
- A2 c8 H, Q2 K; b9 I2 |; @Application-> rocessMessages();
2 c2 {- I0 i* d% E. E) prunjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息
# C5 {- ~8 W4 P4 a |