TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一
; N: }/ g% {8 b( G个名为Application的TApplication类对象.在Project Options的Applcation页中,我们
可以设置这个Application的Title(标题)和Icon(图标).也可以在工程源文件中编辑App
: R1 u6 z( E$ ~* Vlcation的代码.
Application对象不是需要经常使用.下面是TApplcation比较常用的方法和属性/事件等
。
一>属性:
( U# C; ^6 z& M3 r: Y8 o1.bool Active:
8 O' z/ Q! A6 {6 v, A5 e. D这个属性是一个运行时才有效的只读属性.当应用程序处于激活状态且有焦点时它返回t
rue,否则为false
# Z- ]' D8 M; @" C: A2.AnsiString ExeName:
这是一个常用的属性.它返回应用程序的全路径执行文件名.运行时有效,只读.
Label1->Caption=ExtractFileName(Applcation->ExeName);//取得执行文件全文件名中
的文件名部分
9 c( Q9 P O- ~9 T7 ^0 S2 J. l3.HWND Handle:
% C6 Q* a3 E l* i7 o3 S取得应用程序的窗口句柄.调用API时可能需要.这个句柄是不可见的应用程序的窗口句柄
,而不是主窗口的句柄.要取得主窗口句柄,可以用Application->MainForm->Handle.
8 Z7 k* c5 A0 q4.TColor HintColor:
% Y. w& F0 P2 O( [1 w" Z; G确定工具提示窗口的颜色.运行时有效
5.int HintHidePause:
确定显示工具提示后的工具提示显示持续时间,缺省值为2.5s.
9 Q# H+ z- R# a9 g8 f6.int HintPause:
确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为80
0ms
7.int HintShortPause:
* L) s2 ?9 t5 v. |确定工具提示再次显示之前所需要的等待时间.缺省值为50ms
8.TIcon Icon:
- F7 c* Q& }# d% z9 M应用程序的图标.此Icon出现在应用程序的任务栏窗口按钮上.并作为在文件浏览器中应
用程序的图标.一般在Project options中的Applition标签中设定.当然也可以用代码:
- k6 Q4 i: Q6 W9 |3 YApplication->Icon->LoadFromFile("e:\\icon\\cb3.ico");
9.TForm MainForm:
0 w9 Y& D% \# g; I应用程序的主窗体.这是一个只读的属性.主窗体就是应用程序最先创建的窗体.可以在P
roject Options的Forms页中设定.当主窗体被关闭时,应用程序将结束.
10.AnsiString Hint:
应用程序的Hint(工具提示)
11.bool ShowHint:
5 T. E7 L/ I" R$ A: q0 q是否显示提示
) o2 a( K& v% ~* M. s' K+ U* q12.AnsiString Title:
. H9 p" u0 T$ Y4 k0 x2 g应用程序的标题,它显示在应用程序在任务栏按钮中
13.bool ShowMainForm;
是否显示主窗口,缺省为true.当我们想建立一个不显示主窗口的应用程序时,在工程源
2 T m" M$ p6 e" w文件中的Application->Run()之前设定这个属性为false即可.
( a" z8 P4 Z( s14.bool Terminated;
检查应用程序是否已收到关闭消息.如果为true,表示应用程序即将关闭.
0 i1 V9 K L$ b2 {8 z" z6 V; m二>方法:
1.void BringToFront():
将应用程序置于激活状态并且拥有焦点.它将使用应用程序的窗口置于其它应用程序的窗
* Z, x, D8 I1 I6 ?口之前.
Applcation->BringToFront();
5 }: H! |' M3 b, F2.int MessageBox(char *text,char *caption,int flag);
/ \8 B# {6 l. s* k" f4 R这是最常用的方法了.显示一条消息的对话框,可以有一个或多个按钮.它封装了API中的
$ ~! H2 u) [' q6 w5 IMessageBox函数.
* Q# _. m3 g9 Z) C" [* B* Rtext:消息字符串,可以是多行,多行可以用"\n"隔开.如"你好!\n欢迎使用本程序."
caption:对话框标题
flag:决定此对话框形式.常用的如下(位组合,用|)
$ X, b# \8 ?9 x' P按钮,决定对话窗口的基本用途
MB_OK:显示一个OK按钮
MB_YESN显示二个按钮:Yes或No
" y* J" P, e/ I% `MB_YESNOCANCEL:显示三个按钮,YES/No/Cancel
MB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略)
MB_HELP:显示帮助按钮,当按F1或点按钮时触发Help事件
9 O) {2 f1 o+ n" K缺省按钮:
MB_DEFBUTTON1/MB_DEFBUTTON2/MB_DEFBUTTON3/MB_DEFBUTTON4:决定哪一个按钮为缺省
按钮.缺省为MB_DEFBUTTON1
. P- y2 h. {# Z. E图标:
! N/ m. [/ E7 yMB_ICONSTOP:显示一个红色X图标
. M* o. D2 E1 ?9 kMB_ICONINFORMATION:最常用的提示图标,一个小写的i
; J& H* c/ P9 U |7 I$ V lMB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
返回值:
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.
) ~# \( ]/ K- E f- Sif(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
7 s' |' c1 w/ \. S' PNQUESTION)==IDYES)
{
0 }& q$ c; n" k/ j, N, NClose();
}
# b: y6 S* X( C3 G# @* j1 q/ G# ^3.void Minimize()
最小化应用程序的每个窗口和当前显示的窗口
4.void Restore()
) H4 r9 d# v8 T! [* r还原一个最小化的应用程序
5.void Terminate()
0 f! K* r. q5 u9 J' j自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
7 ?5 o. }7 x# v8 m7 l2 _6.void ProcessMessages(void)
& k4 J( J- z+ L5 C4 S# v5 p常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
返回值:
按钮.缺省为MB_DEFBUTTON1
图标:
- Q& U9 f* U# n5 e% ~; K3 W" dMB_ICONSTOP:显示一个红色X图标
MB_ICONINFORMATION:最常用的提示图标,一个小写的i
4 A. ]: i: P" G. F4 k6 d4 mMB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
返回值:
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
; u3 B- V, R7 {* FNQUESTION)==IDYES)
4 H0 }5 r7 q1 h" }& L{
Close();
3 X% E" d# T2 u: o$ |+ r9 _1 ], [) N# i7 T}
3.void Minimize()
最小化应用程序的每个窗口和当前显示的窗口
4.void Restore()
9 {4 X$ X1 H: W+ }还原一个最小化的应用程序
5.void Terminate()
. [( P3 \& n! L) f( g自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
6.void ProcessMessages(void)
3 X- \1 e% Y% }- E常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
5 ?0 G# Z: X" M0 d中的消息
三>事件:
1.OnHint
当应用程序的提示要显示时的事件.我们也可以将它指向自定义的函数中作特殊的工具提
8 d; W7 Q- p6 E# C8 [示显示
8 A+ C1 o O' X, X4 z5 m例:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->OnHint = DisplayHint;
- L Y; G& ]4 N7 ]: x' T8 W. X}
void __fastcall TForm1:
isplayHint(TObject *Sender)
{
2 S, \8 ~- M% V8 m5 v7 o: W/ W% K& LStatusBar1->SimpleText = GetLongHint(Application->Hint);
}
//一个Hint可以包含由|字符分隔的二部分.GetShortHint是另外一个函数
2.OnIdle:
7 d' y* c/ r5 V当应用程序空闲时的事件.通常在这时候作一些不重要的状态检测或处理要求不是很严格
的任务.
$ [& @. w9 o) G7 z. F. c8 \3.OnException:
" D* D+ Q% y5 s; S% `# X. b当应用程序发生异常时.你也可以自定义一个异常处理过程而不用缺省的ShowException
6 v9 M' S: G; Z1 u" u
4.OnMinimize
9 B+ A, o, k. ]( Q8 x; S' E应用程序最小化时的事件
5.OnActivate:
应用程序被激活时的事件
6.OnDeactivate
) Y( ?( f! {( E8 R9 j3 ?$ ~" P) ^应用程序失去焦点的事件
7.OnMessage
$ N7 e! O0 }: @( _( q# h4 ~: S应用程序接收到消息时的事件.如果你想作特定的消息处理.你可以按管这个事件
8.OnRestore
# L- I+ L' O+ J( R+ s应用程序由最小化状态恢复时的事件
! Q; w l2 }" y/ k9 }" gTApplication应用小技巧:
8 N" W" i$ ?# M' P1 U* MA.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT
: _1 h, t/ G2 Z* q/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的.
- W9 f' t0 W! S! OAnsiString filepath;
filepath=ExtractFilePath(Applcation->ExeName);
0 L) F5 c% C: S" n. d//ExtractFilePath与ExtractFileDir是有区别的.表现在ExtractFilePath最后总是有"
. X. P2 ?& \- I3 g, N5 N+ `\\",而ExtractFileDir只是在路径为根目录时最后才是"\\"
Table1->DatabaseName=filepath+"data";
Table1->TableName="maindb.dbf";
4 H4 j, i' }5 a4 w ?% T- ?try{
! o8 Y$ V& N- T2 k6 I1 p7 LTable1->Active=true;
}
( d: Z$ x3 C. [, dcatch(...)
) {& I( V# N( r) l0 z& B{
//......
, e2 D1 g/ @2 T" U. F}
1 ^3 T, G. Z6 q5 J3 n' e& Q; M另外有一个函数ParamStr(int index)与Application->ExeName有同样效果.ParaStr(0)
" a, @( y" |; c" E, b j- A' d% R( X就是应用程序命令行第一部分.也就是执行文件的全路径.
B.自定义异常处理窗口
缺省异常处理窗口是用ShowException显示的一个窗口,其标题为应用程序的Title.我们
, v, ] C$ Y [0 R, J也可以自定义异常处理函数,以便对异常进行自定义的处理。
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->OnException = HandleException;
}
void __fastcall TForm1::HandleException(TObject *Sender,SysUtils::Exception
*E)
{
6 I$ M& t% F$ `) N* gAnsiString errorstr="应用程序发生了错误.\n"+E->Message;
+ v9 U0 K( N- `/ N, Q' X0 FApplication->MessageBox(errorstr.c_str(),"发生异常",MB_OK);
}
7 F; Q- J- K. g! ^0 r- ]C.利用OnIdle事件做一些时效要求不严的任务.
- q1 P7 ~6 @( D8 i4 b) @* }我们用Timer定时处理一些事务。但Timer是要占一定CPU时间的,对应用程序的执行效率
有一定影响。如果这个要处理的事务并不十分重要.我们就可以放在OnIdle中处理。让应
& O) P9 f2 _+ V/ t用程序在空闲进处理.
8 \6 D5 E: G5 S% I7 R Y* W : K' C5 C! \0 ~$ F0 @, Z! pvoid __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->OnIdle = updatestatus;
% C2 _4 Q2 u* j" M}
void __fastcall TForm1::updatestatus(TObject *Sender,bool &Done)
{
$ A3 V: I9 X) ]3 B: ~) {' N9 ?+ zStatusBar1->SimpleText=DateTimeToStr(Now());
0 ^& U$ g6 [2 g' S}
$ F! A% V& d- G. c& G由于C++Builder5已经将Application做到了控件选取面板上。这使得我们对Applicatio
n编程比以前方便了不少。以上的方法对cb5以前的版本是很适用的。如果是C++Builder
( M4 D8 \/ \# I. j/ t7 B9 K5,我们也不用这么麻烦地写代码了,直接在Application控件的对应事件中写处理代码
. t( T0 W7 T: H4 N& j7 o0 l即可.
$ H; u* U! C* ^' A7 B/ L# Z$ Q* yD.在一个长时间的执行代码之前或之中及时处理其它消息
Form1->Label1->Caption="开始执行指定任务:"+jobname[0];
Application->
rocessMessages();
runjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息
$ T: @$ U& \0 b; r% [
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |