|
% ]$ n3 w1 |6 C) w& R6 J. B4 P
TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一
7 h. r7 N2 ?3 y3 I个名为Application的TApplication类对象.在Project Options的Applcation页中,我们
6 P2 l, Z1 V8 y可以设置这个Application的Title(标题)和Icon(图标).也可以在工程源文件中编辑App 7 B; o' Z9 j l) U" @1 { S: r
lcation的代码. 4 T$ e" H% z( B z' d
Application对象不是需要经常使用.下面是TApplcation比较常用的方法和属性/事件等
; f N7 j+ z5 d1 }/ F。 5 M7 {+ E0 K2 X
一>属性:
p2 B, I5 a' }) @; ~& h. Q1.bool Active:
3 W2 A$ f9 ]) c2 o# h0 f这个属性是一个运行时才有效的只读属性.当应用程序处于激活状态且有焦点时它返回t / m/ q+ ?# |/ ~, T# w4 p$ z
rue,否则为false
$ S5 `9 f( H) C8 e2.AnsiString ExeName:
7 h z9 y" R% q! y6 b% f这是一个常用的属性.它返回应用程序的全路径执行文件名.运行时有效,只读. % p0 H+ a( Y) e8 k) T: W* V
Label1->Caption=ExtractFileName(Applcation->ExeName);//取得执行文件全文件名中
; u9 R+ J0 b6 C/ b% {0 M1 H的文件名部分 / k! q! Z0 ?3 y3 k
3.HWND Handle:
) W& e) [1 Q4 u! g/ f4 F取得应用程序的窗口句柄.调用API时可能需要.这个句柄是不可见的应用程序的窗口句柄 0 F, R- Z1 {; N+ u% Z) q4 J
,而不是主窗口的句柄.要取得主窗口句柄,可以用Application->MainForm->Handle.
; Z2 _( q: U `5 O) B4.TColor HintColor:
" J' p8 S2 y9 U4 h确定工具提示窗口的颜色.运行时有效
Q, ~! }* d! I4 U8 y8 v+ u# R5.int HintHidePause: & R; u/ p3 {- Z' H, s3 D
确定显示工具提示后的工具提示显示持续时间,缺省值为2.5s. 8 P& T2 H2 t5 }6 |+ T; A5 _7 Q7 G
6.int HintPause:
$ m! l5 t8 P; u# }: x/ Q& @7 q确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为80
& b( @2 u. b, F0ms - N6 L2 O/ X8 S1 T& w. X$ M" Y9 z- n
7.int HintShortPause:
+ @ P# a! `( C6 F. V0 C确定工具提示再次显示之前所需要的等待时间.缺省值为50ms
/ ^6 s0 w4 l' d8 v2 j" b, Y( w8.TIcon Icon:
2 s$ s7 w) z- Y' }1 v. g2 N4 e; I应用程序的图标.此Icon出现在应用程序的任务栏窗口按钮上.并作为在文件浏览器中应
+ i* {% `* E, n用程序的图标.一般在Project options中的Applition标签中设定.当然也可以用代码:
) Q3 S5 q! `6 NApplication->Icon->LoadFromFile("e:\\icon\\cb3.ico");
" E; U! b* O" A( ^& I$ b9.TForm MainForm:
, {) T9 Y. t( U; y应用程序的主窗体.这是一个只读的属性.主窗体就是应用程序最先创建的窗体.可以在P . x) g5 L' f! V- _* S. t
roject Options的Forms页中设定.当主窗体被关闭时,应用程序将结束. ' `9 t& k0 z: l. [8 P, I
10.AnsiString Hint:
7 I% I. ~1 G# q4 l应用程序的Hint(工具提示) , Q7 o$ z, O I* f/ s
11.bool ShowHint: ) f ^$ Y0 B9 b2 v6 C! u
是否显示提示
" ~' Z% L3 y7 P8 a! C+ O# D12.AnsiString Title: % q% a& U! b. V; j
应用程序的标题,它显示在应用程序在任务栏按钮中 0 T# {7 p$ s% J0 K( Y4 M
13.bool ShowMainForm; ' n; Y7 w. b* P- n6 F C6 G6 J
是否显示主窗口,缺省为true.当我们想建立一个不显示主窗口的应用程序时,在工程源 - {( K5 k' {$ g+ z" _( H
文件中的Application->Run()之前设定这个属性为false即可. 0 ]! e$ Y- x1 O6 n
14.bool Terminated;
3 y9 s+ f2 E- Z- U- C检查应用程序是否已收到关闭消息.如果为true,表示应用程序即将关闭.
- h W+ i q1 A% J二>方法:
) f/ \7 A1 O4 K" C8 y! B$ K$ J1.void BringToFront():
4 i& N) U- _1 Y* p2 ?将应用程序置于激活状态并且拥有焦点.它将使用应用程序的窗口置于其它应用程序的窗
& F- c7 i( z ?0 W, E; h" d( C; R' c口之前. C+ j& ~+ ~5 N, \' |! s
Applcation->BringToFront();
% O H$ n- @! w1 z. J8 U6 U6 N2.int MessageBox(char *text,char *caption,int flag);
2 n) w( S5 Z/ j3 y+ P: s这是最常用的方法了.显示一条消息的对话框,可以有一个或多个按钮.它封装了API中的
- v* Y# @' J. M2 nMessageBox函数. # `+ L: ` H6 ^" Y" I+ s' h& e
text:消息字符串,可以是多行,多行可以用"\n"隔开.如"你好!\n欢迎使用本程序." 6 n) s" Q. N' M! e
caption:对话框标题 & a2 {1 J$ }' w! s1 C9 P- q
flag:决定此对话框形式.常用的如下(位组合,用|) 7 Q# Q0 [! u' j- ~
按钮,决定对话窗口的基本用途
- t; w) t# ]3 p$ W4 v, q9 UMB_OK:显示一个OK按钮 * V& n; C1 R! ^5 O
MB_YESN显示二个按钮:Yes或No 6 M* r& o. H5 s- }1 E; m. E4 w
MB_YESNOCANCEL:显示三个按钮,YES/No/Cancel 0 F- |# u" M+ C r* N7 [- X. a% V
MB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略)
; {( W0 j# j J& I/ ~* n! `8 r9 G0 KMB_HELP:显示帮助按钮,当按F1或点按钮时触发Help事件 : P6 N1 l6 X( D' z
缺省按钮:
8 d/ N A5 ^3 z* J, f' d1 NMB_DEFBUTTON1/MB_DEFBUTTON2/MB_DEFBUTTON3/MB_DEFBUTTON4:决定哪一个按钮为缺省
. R( g" z$ E! @按钮.缺省为MB_DEFBUTTON1
7 ~9 q- `0 ?. r0 y7 C% l: T4 O% `图标: - f" k. q. N) `+ j! s2 W
MB_ICONSTOP:显示一个红色X图标
7 z0 h7 U5 o$ n" a5 kMB_ICONINFORMATION:最常用的提示图标,一个小写的i / R/ j& ^4 P3 Z; o: L$ U
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 . O5 U% R2 X( f! P
返回值:
! g; I. g- |5 E0 B: ?7 U8 U# `/ V; bIDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回. - m- g! g8 u3 ^" H% Y
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
0 ^2 a2 S5 f. G3 B! p- gNQUESTION)==IDYES) . n4 d5 x& G# R3 ~3 ~. K
{
7 `! H+ T) d& j7 p3 BClose();
# t$ R( v1 y; K- D/ W} 4 G9 H8 W& `' s( B% t- m& s
3.void Minimize()
. i6 `9 ~- z& H* N( B. p4 z0 b最小化应用程序的每个窗口和当前显示的窗口
7 X+ {* w9 F0 ~% p' y; z$ m0 q. w9 i) D4.void Restore()
' Y* F {3 O( D! ^' m还原一个最小化的应用程序
1 e! y3 A% ]; @6 [9 L5 y# |5.void Terminate() ! P% X C9 ?( Z8 Y* D4 j% E
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序 ! j' S f. [5 r6 K( l4 Q
6.void ProcessMessages(void)
+ W0 s, g3 O; n% X, v" k; g2 D常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列 ; S3 m t- m- J
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标 : N- G. O/ p2 v7 g8 s
返回值: 1 Y* ~! B! ]' Z6 e( H8 Z
按钮.缺省为MB_DEFBUTTON1
4 g; O3 d. e7 W/ v1 a( n4 X图标: # S* h% K- C. T: e! v+ L& I2 P
MB_ICONSTOP:显示一个红色X图标
' z! M V$ f7 |) A% i" UMB_ICONINFORMATION:最常用的提示图标,一个小写的i 6 b* t q7 H$ \7 O
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
: N" O- e( c+ B( E返回值: n+ {# `# J; f$ b9 d/ b/ Y
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回. 8 c" U; j- v( Z q
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO . `4 F. |7 S, M
NQUESTION)==IDYES)
. x' V- p: c( v# l: X{
9 w' q. y9 o* A2 v& nClose();
3 J8 Y: H5 R( P; c6 a$ h7 k# D( v} ( d: W) n" @& ^3 t+ X: ]
3.void Minimize()
: Q/ x; b# d9 u$ ?! J; I0 b最小化应用程序的每个窗口和当前显示的窗口 ; g% U; a8 D' i9 f P. y% I+ x
4.void Restore()
& P: |, _8 e3 ^4 K7 U, @ h9 ^还原一个最小化的应用程序
' R, }, J5 q- `2 _# @& D5.void Terminate() 4 _( s# g1 H: e( P
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
8 B4 T, b/ F" r% Q3 w% m6.void ProcessMessages(void)
$ I1 C. s2 k( |' r- r# K常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
( z2 {% ]. ^$ _中的消息
2 w. V4 G# n1 U- ?. R三>事件:
+ |" x! \, w+ e, s4 m; x* `1.OnHint
E% T6 L. k$ C, E4 Z' p& X当应用程序的提示要显示时的事件.我们也可以将它指向自定义的函数中作特殊的工具提
5 @, A% n" R5 i- L示显示 % o& [: H4 {- z1 t. [
例:
: P7 Q+ i( j5 ivoid __fastcall TForm1::FormCreate(TObject *Sender) ; O" h, J: C- Y& \1 Q: n
{
8 N& c6 b3 L. B7 UApplication->OnHint = DisplayHint;
, S4 r$ `' N }2 s3 T0 H* ?2 {1 E}
5 ~& e9 a* m, k4 o- _$ avoid __fastcall TForm1: isplayHint(TObject *Sender)
, a d1 d! P- i7 X1 e{ - K! k4 K4 k, @& v; k8 Y# `
StatusBar1->SimpleText = GetLongHint(Application->Hint); " l7 j4 x$ `# j1 p
}
3 e* Z0 G" V- p: j* B) s+ V//一个Hint可以包含由|字符分隔的二部分.GetShortHint是另外一个函数
1 O1 [; `+ `% R6 V, b2.OnIdle:
) \8 S$ D) V# b$ h- P当应用程序空闲时的事件.通常在这时候作一些不重要的状态检测或处理要求不是很严格
# ]1 j/ z" p) w# f5 v9 R的任务. 8 `" c, h; E5 _5 g6 Z; k0 a! S- U
3.OnException: , z* s5 a* K2 N' N& _1 W4 ~
当应用程序发生异常时.你也可以自定义一个异常处理过程而不用缺省的ShowException 8 R2 j' _0 K" m+ V+ d
( \8 C0 m4 \5 w. i
4.OnMinimize 1 \/ |6 c" F0 @* M Q
应用程序最小化时的事件 0 R( R& B7 _7 i7 {( a8 N$ M* F
5.OnActivate: 0 O$ @- n0 \ v4 f/ o$ [' f
应用程序被激活时的事件 * [; W9 Q; \; H9 ^, F
6.OnDeactivate ) B+ ]4 H4 ]/ n" Z
应用程序失去焦点的事件 ) ? D# t2 y6 s: D) ?- C+ ?
7.OnMessage " p5 J: m, j. i" j X" d
应用程序接收到消息时的事件.如果你想作特定的消息处理.你可以按管这个事件
/ I+ Q; j/ M, g4 N) r8.OnRestore
& b7 t/ z0 _1 ?3 F/ y应用程序由最小化状态恢复时的事件
& s9 [! D& R! L4 a/ YTApplication应用小技巧:
~1 g+ O2 X, O/ _+ ?A.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT 7 b9 K" N# L! r3 Z' A- V
/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的.
! U) T& H4 C0 ~5 X- P7 t/ eAnsiString filepath; ' m0 G# T ^: h1 v8 F
filepath=ExtractFilePath(Applcation->ExeName);
0 @; z" I6 J5 {* j//ExtractFilePath与ExtractFileDir是有区别的.表现在ExtractFilePath最后总是有" ) P* k a2 _ |* Q
\\",而ExtractFileDir只是在路径为根目录时最后才是"\\"
8 B" ~* Q$ E, i5 hTable1->DatabaseName=filepath+"data";
6 z( ~6 F( W; e7 ~Table1->TableName="maindb.dbf"; , w+ Y9 i6 M- ?! O
try{
8 _8 V4 n3 X1 Q; }( }* ITable1->Active=true;
$ E% A, h* `6 z$ x7 K/ b}
- Y/ ]9 F2 L9 t4 _8 G6 p* Ucatch(...)
7 F, N7 \- s6 }* W) f7 Q2 G* s. Z{ : `. l J( v4 g7 v) u) w
//......
7 {9 _, z J, r} " N9 ]& i1 N; Q
另外有一个函数ParamStr(int index)与Application->ExeName有同样效果.ParaStr(0)
- h7 W# @. a5 c+ T$ @* t1 k5 ^就是应用程序命令行第一部分.也就是执行文件的全路径. 8 v) v& A3 ]8 U( h- V: H- U
B.自定义异常处理窗口
7 C# l K5 V+ c! P1 w缺省异常处理窗口是用ShowException显示的一个窗口,其标题为应用程序的Title.我们 4 N" y8 f- T0 Y
也可以自定义异常处理函数,以便对异常进行自定义的处理。 4 k f( l+ Y3 f- G8 S0 M
void __fastcall TForm1::FormCreate(TObject *Sender)
5 g Y+ ^* [' z3 E: f# y- g. X{
6 ^ N$ m/ g4 k( Y; a6 I( }Application->OnException = HandleException; 8 _+ ~7 J8 a5 Q6 b; x2 q+ }/ l* d
}
' Q3 B- j% @1 {7 z _1 Z, m2 Vvoid __fastcall TForm1::HandleException(TObject *Sender,SysUtils::Exception
: l3 j3 R! ~5 x6 l*E) # d& j2 i" m! B0 J" q, I$ C" E
{ ) b4 t2 [+ J2 a5 R, S7 h
AnsiString errorstr="应用程序发生了错误.\n"+E->Message;
6 g! j. o, {, ~$ H$ m# r eApplication->MessageBox(errorstr.c_str(),"发生异常",MB_OK);
' Z$ |3 B Q* L) q# A% _9 ]}
' Q4 R8 g3 k7 C% v: S+ G( e, NC.利用OnIdle事件做一些时效要求不严的任务. 0 n) @ `" [0 o9 p
我们用Timer定时处理一些事务。但Timer是要占一定CPU时间的,对应用程序的执行效率
! c9 q/ d& p; ]% d* d有一定影响。如果这个要处理的事务并不十分重要.我们就可以放在OnIdle中处理。让应
" h7 Y& r+ V5 D3 i9 e1 _用程序在空闲进处理.
# e V s2 M& G5 e
8 K4 \0 v: v/ C) J- \" T* ivoid __fastcall TForm1::FormCreate(TObject *Sender)
$ G+ K. t( \' u# r0 ` g{ " n0 {* _% ?) c- i$ W8 }# Z
Application->OnIdle = updatestatus; ' F4 x2 o/ Q# L! c; F/ c$ `
}
% H/ S* t, J3 }% r, Hvoid __fastcall TForm1::updatestatus(TObject *Sender,bool &Done) ' I. M) M1 [3 U: t9 A3 b) r' r% T$ m
{
, J1 Q4 P8 U$ b3 |( r! _ ?& ]StatusBar1->SimpleText=DateTimeToStr(Now()); 9 h! T) E4 Z* v! O) g8 `: o0 ~. j; n
}
7 e; E. j$ s1 |: p7 y4 Y: }! @由于C++Builder5已经将Application做到了控件选取面板上。这使得我们对Applicatio L4 ^+ A* _. W: M2 ^" `2 z
n编程比以前方便了不少。以上的方法对cb5以前的版本是很适用的。如果是C++Builder
# R! S( R. S' L) x+ U, W5,我们也不用这么麻烦地写代码了,直接在Application控件的对应事件中写处理代码 * M% k" i; j- r! Z# I. p
即可.
& D) N, O. G% ?' Y4 a: nD.在一个长时间的执行代码之前或之中及时处理其它消息 2 b+ e b0 [4 e( T6 d6 S2 ?1 F" u
Form1->Label1->Caption="开始执行指定任务:"+jobname[0];
& x3 X/ `& }" y0 VApplication-> rocessMessages(); 1 Y# v1 Y( t; ^. m* {
runjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息
, Y6 U$ R0 {! S, C |